API yönetimi
- 5 dakika
Peki bir API yönetim çözümü aramak istememe neden olan sorun nedir? Büyük olasılıkla aşağıdaki zorluklara sahipsiniz:
- Ölçeklendirme, API'niz veya API'leriniz dünyanın farklı bölgelerindeki birçok istemci tarafından kullanılır ve kullanılabilir ve duyarlı olduğundan emin olmanız gerekir.
- Güvenlik, API'nizin güvenli olduğundan ve yalnızca yetkili istemcilerin erişebildiğinden emin olmanız gerekir.
- Hata yönetimi, API'nizin hataları düzgün bir şekilde işleyebileceğinden emin olmanız gerekir.
- İzleme, API'lerinizin beklendiği gibi çalıştığından emin olmak için api'lerinizi izlemeniz gerekir.
- Dayanıklılık, API'nizin dayanıklı olduğundan ve hataları düzgün bir şekilde işleyebileceğinden emin olmanız gerekir.
Bu zorlukların her biri için bir puan çözümü seçebilirsiniz, ancak bu yönetimi zor olabilir. AYRıCA API'lerinizin farklı teknoloji yığınlarında oluşturulabileceğini ve bu da yukarıdaki zorlukların çözümlerinin her API için farklı çözümlere ihtiyacınız olduğu anlamına geldiğini düşünün. Tüm bu zorluklarla karşılaşıyorsanız Azure API Management gibi merkezi bir API management çözümünü göz önünde bulundurmanız gerekir.
Şimdi bazı zorlukları ayrıntılı olarak ele alalım ve Azure API Management gibi merkezi bir API management çözümünün bunları gidermenize nasıl yardımcı olabileceğini görelim.
Kod olarak altyapı, IaC
Azure portalını kullanarak Azure kaynaklarınızı oluşturarak sorun olmaz, ancak altyapınız büyüdükçe yönetimi zorlaşır. Karşılaştığınız sorunlardan biri, altyapınızı başka bir ortamda kolayca çoğaltamamanızdır.
Altyapınızda yapılan tüm değişiklikleri izlemek de zordur. Bu durum, Kod Olarak Altyapı'nın (IaC) devreye girer. IaC, kod kullanarak altyapınızı yönetme uygulamasıdır. Azure'da IaC uygulamak için, biri Bicep olmak üzere çeşitli seçenekleriniz vardır. Bicep, Azure kaynaklarını bildirimli olarak dağıtmaya yönelik bir Etki Alanına Özgü Dildir (DSL). Bulut kaynaklarınızı yönetmenin harika bir yoludur. İşte Bicep'in nasıl göründüğüne basit bir örnek:
param location string = 'eastus'
resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
name: 'mystorageaccount'
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}
Yukarıdaki örnekte Bicep kullanarak bir depolama hesabı tanımladık. Depolama hesabının konumunu, depolama hesabının türünü ve SKU'yu (stok tutma birimi) tanımladık. Konum, Bicep dosyasını dağıtırken geçirebileceğimiz bir parametredir. Sunulan dosyayı dağıtmak için Azure CLI'yi şu şekilde kullanırız:
az deployment group create --resource-group myResourceGroup --template-file main.bicep
Yukarıdaki komut, depolama hesabını kaynak grubuna myResourceGroup dağıtır ve bicep dosyasını kullanarak dosyadaki main.bicep kaynakları oluşturur.
Yük dengeleyici aracılığıyla yükü işleme
Sorun, API'nizin istekler tarafından ezilmesi olduğunda bir yük dengeleme yapısı eklemektir. Yük dengeleyici, yükü API'nizin birden çok örneğine dağıtmanıza yardımcı olabilir.
Azure API Management hizmetinde yük dengeleme, arka uçlar adlı bir kavram tanımlayarak uygulanır. Buradaki fikir, API uç noktalarınıza karşılık gelen birçok arka uç ayarlamanız ve ardından yükü bu arka uçlar arasında dağıtan bir yük dengeleyici oluşturmanızdır. Mimari şöyle görünür:
Önceki mimaride olanlar:
- İstemci, API Management örneğine bir istek gönderir.
- İsteğin kimliği doğrulanır ve yetkilendirilir.
- İstek daha sonra yük dengeleyiciye gönderilir.
- Yük dengeleyici, isteği arka uçlardan birine dağıtır (seçilen Azure OpenAI API'si kalın olarak belirtilir).
Arka uç isteği işler ve istemciye geri bir yanıt gönderir.
Yük dengeleyiciyi tanımlama
Azure API Management'ta yük dengeleyici ayarlamak için aşağıdaki bölümleri yapmanız gerekir:
- Arka uçlar, yükü dağıtmak istediğiniz kadar arka uç.
- Yükü dağıtmak istediğiniz arka uçları içeren yük dengeleyici olan yük dengeleyici.
- Gelen çağrıları yük dengeleyiciye yönlendiren bir ilke .
Arka uçları oluşturma
Azure API Management'ta arka uç oluşturmak için bir arka uç varlığı tanımlamanız gerekir. Bicep'te arka ucu şu şekilde tanımlayabilirsiniz:
resource backend2 'Microsoft.ApiManagement/service/backends@2023-09-01-preview' = {
parent: apimService
name: 'backend2'
properties: {
url: '${openai2Endpoint}openai'
protocol: 'http'
circuitBreaker: {
rules: [
{
failureCondition: {
count: 3
errorReasons: [
'Server errors'
]
interval: 'P1D'
statusCodeRanges: [
{
min: 500
max: 599
}
]
}
name: 'myBreakerRule'
tripDuration: 'PT1H'
}
]
}
}
Önceki Bicep kodunda bir ARKA uç, BIR API uç noktası URL'sine karşılık gelecek şekilde tanımlanmıştır. Bu adın daha sonra kullanabileceğimiz bir ad backend2 olduğuna da dikkat edin. Sahip olduğunuz her arka uç için önceki bicep kodu gibi kodlamanız gerekir.
Not
İstediğiniz kadar arka uç tanımlayabilmeniz için birden çok arka ucunuz olabileceğini unutmayın.
Arka uç havuzu oluşturma
Ardından, yükü hangi arka uçlar arasında dağıtmak istediğimizi ayarlayan bir arka uç havuzu oluşturmak istiyoruz. Bu arka uç havuzunu aşağıdaki gibi bir arka uç varlığı olarak kodlayabiliriz:
resource loadBalancing 'Microsoft.ApiManagement/service/backends@2023-09-01-preview' = {
parent: apimService
name: 'LoadBalancer'
properties: {
description: 'Load balancer for multiple backends'
type: 'Pool'
pool: {
services: [
{
id: '/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.ApiManagement/service/${apimService.name}/backends/${backend1.id}'
}
{
id: '/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.ApiManagement/service/${apimService.name}/backends/${backend2.id}'
}
]
}
}
}
Daha önce oluşturduğumuz arka uç, backend2kısa olması için atladığımız başka bir arka uçla backend1birlikte başvurulur.
Ayrıca, yük dengeleyicinin priority yükü nasıl dağıtdığını belirlemek için listedeki her öğe için bir weight ve services özelliği de ekleyebiliriz. Her arka uç için önceliği ve ağırlığı şu şekilde ayarlayabilirsiniz:
services: [
{
id: '/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ApiManagement/service/<APIManagementName>/backends/backend-1'
priority: 1
weight: 3
}
{
id: '/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.ApiManagement/service/<APIManagementName>/backends/backend-2'
priority: 1
weight: 1
}
]
Yukarıdaki örnekte, yük dengeleyici yükü değerinden üç kat daha fazlaya backend-1backend-2dağıtır.
Doğrudan gelen aramalar
Son olarak, gelen çağrıları bu yük dengeleme arka ucuna yönlendirmemiz gerekir. Yön yönergesi aşağıdaki API varlığı oluşturulur:
resource api1 'Microsoft.ApiManagement/service/apis@2020-06-01-preview' = {
parent: apimService
name: apiName
properties: {
displayName: apiName
apiType: 'http'
path: apiSuffix
format: 'openapi+json-link'
value: 'https://raw.githubusercontent.com/Azure/azure-rest-api-specs/main/specification/cognitiveservices/data-plane/AzureOpenAI/inference/preview/2024-03-01-preview/inference.json'
subscriptionKeyParameterNames: {
header: 'api-key'
}
}
İlkeyi yapılandırma
Şimdi, son olarak ilkeyi daha önce açıklanan API'de ayarlayabilir ve gelen çağrıları yük dengeleyiciye yönlendirebiliriz:
// policy.xml
<policies>
<inbound>
<base />
<set-backend-service id="apim-generated-policy" backend-id="{0}" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
var headerPolicyXml = format(loadTextContent('./policy.xml'), loadBalancing.name, 5000)
// Create a policy for the API, using the headerPolicyXml variable
resource apiPolicy 'Microsoft.ApiManagement/service/apis/policies@2020-06-01-preview' = {
parent: api1
name: 'policy'
properties: {
format: 'rawxml'
value: headerPolicyXml
}
}
Yaptığımız şey, gelen çağrıları yük dengeleyiciye yönlendiren bir ilke oluşturmaktı. İlke set-backend-service , gelen çağrıları yük dengeleyiciye yönlendirmek için kullanılır.
backend-id özelliği, daha önce oluşturduğumuz yük dengeleyicinin adına ayarlanır.
Tüm bu hareketli parçalar yerine yerleştirildiğinde API Management örneğiniz artık yük dengelidir. Artık yük dengeleyiciye daha fazla arka uç ekleyerek API'nizi ölçeklendikleyebilirsiniz.
Devre kesici
Devre kesici, API'nizi istekler tarafından aşırı yüklenmeye karşı korumak istediğinizde kullandığınız bir şeydir. Bunun nasıl çalıştığı, karşılandığında devre kesicinin arka uça istek göndermeyi tetikleyip durduran bir dizi kural tanımlamanızdır. Azure API Management'ta bir arka uç ayarlayıp devre kesici kuralı tanımlayarak bir devre kesici tanımlayabilirsiniz. Bunu şu şekilde yapabilirsiniz:
resource backend2 'Microsoft.ApiManagement/service/backends@2023-09-01-preview' = {
parent: apimService
name: 'backend2'
properties: {
url: '${openai2Endpoint}openai'
protocol: 'http'
circuitBreaker: {
rules: [
{
failureCondition: {
count: 3
errorReasons: [
'Server errors'
]
interval: 'P1D'
statusCodeRanges: [
{
min: 500
max: 599
}
]
}
name: 'myBreakerRule'
tripDuration: 'PT1H'
}
]
}
}
}
Önceki arka uç tanımında, devre kesicinin ne zaman hareket etmesi gerektiğini tanımlayan bir özellik failureCondition vardır. Bu durumda devre kesici, bir günde üç sunucu hatası varsa devreye alır. özelliği, tripDuration devre kesicinin yeniden kapanmadan önce ne kadar süre açık kalması gerektiğini tanımlar. API Management örneğinizde sahip olduğunuz her arka uç için bir devre kesici tanımlamak iyi bir uygulamadır.
Yönetilen kimlik
Ele almak istediğimiz bir diğer sorun da güvenliktir. API'nizin güvenli olduğundan ve yalnızca yetkili istemcilerin erişebildiğinden emin olmak istiyorsunuz. API'nizin güvenliğini sağlamanın bir yolu yönetilen kimlik kullanmaktır. Yönetilen kimlik, API'nizin kimliğini diğer Azure hizmetlerinde doğrulamanın bir yoludur. Azure API Management'ta, yönetilen kimliği aşağıdaki gibi çeşitli yerlerde uygulamanız gerekir:
APIM örneği düzeyinde, özelliğini
identityşu şekilde ayarlayarakSystemAssignedAPIM örneğinde yönetilen kimliği etkinleştirebilirsiniz:resource apimService 'Microsoft.ApiManagement/service@2023-09-01-preview' = { name: name location: location tags: union(tags, { 'azd-service-name': name }) sku: { name: sku capacity: (sku == 'Consumption') ? 0 : ((sku == 'Developer') ? 1 : skuCount) } properties: { publisherEmail: publisherEmail publisherName: publisherName // Custom properties are not supported for Consumption SKU } identity: { type: 'SystemAssigned' } }Bu eylem, APIM örneği için daha sonra APIM örneğimizi kullanarak azure openAI örneği gibi bir yönetilen kimlik oluşturur.
API düzeyi, API örneğiniz için bunu bir ilkeyle ilişkilendirebilirsiniz. Bu ilkede, yönetilen kimliğin çalışması için gerekli yönergeleri ekleyebilirsiniz:
<policies> <inbound> <base /> <authentication-managed-identity resource="https://cognitiveservices.azure.com" output-token-variable-name="managed-id-access-token" ignore-error="false" /> <set-header name="Authorization" exists-action="override"> <value>@("Bearer " + (string)context.Variables["managed-id-access-token"])</value> </set-header> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>Önceki çağrılara bakın ve
authentication-managed-identitybu yönergeler api'yeset-headeryönetilen kimliğin uygulandığından emin olun.Arka uç düzeyi, son olarak arka uçlarınızın Azure OpenAI örneklerini işaret ediyor olması sağlanır. APIM örneğimizi Azure OpenAI örneklerine bağlamamız gerekir. Bu bağlantıyı oluşturmak için bicep yönergesi aşağıda verilmiştir:
resource role 'Microsoft.Authorization/roleAssignments@2022-04-01' = { name: guid(subscription().id, resourceGroup().id, principalId, roleDefinitionId) properties: { principalId: principalId principalType: "ServicePrincipal" roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId) } }Yukarıdaki Bicep yönergesinin fikri, APIM örneği ile Azure OpenAI örneği arasında bir rol ataması oluşturmaktır. Bu durumda:
-
principalIdAPIM örneğinden kimlik kimliğidir, -
roleDefinitionIdbelirli bir kullanıcıdır, bu durumda Azure OpenAI örneğine erişimi olan "Bilişsel Hizmetler Kullanıcısı" adlı bir kullanıcıdır. -
namebu özellik, rol atamasının doğru kapsama uygulanmasını sağlar ve bu durumda belirli bir abonelik ve kaynak grubudur. (Azure OpenAI örneğiyle aynı kaynak grubu olmalıdır)
-