azure-mgmt-apimanagement-dotnet

npx skills add https://github.com/microsoft/skills --skill azure-mgmt-apimanagement-dotnet

Azure.ResourceManager.ApiManagement (.NET)

SDK du plan de gestion pour provisionner et gérer les ressources Azure API Management via Azure Resource Manager.

⚠️ Plan de gestion vs Plan de données

  • Ce SDK (Azure.ResourceManager.ApiManagement) : Créer des services, des APIs, des produits, des abonnements, des stratégies, des utilisateurs, des groupes
  • Plan de données : Appels API directs à vos endpoints de passerelle APIM

Installation

dotnet add package Azure.ResourceManager.ApiManagement
dotnet add package Azure.Identity

Version actuelle : v1.3.0

Variables d'environnement

AZURE_SUBSCRIPTION_ID=<your-subscription-id>
# Pour l'authentification par principal de service (facultatif)
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>

Authentification

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.ApiManagement;

// Toujours utiliser DefaultAzureCredential
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);

// Obtenir l'abonnement
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");
var subscription = armClient.GetSubscriptionResource(
    new ResourceIdentifier($"/subscriptions/{subscriptionId}"));

Hiérarchie des ressources

ArmClient
└── SubscriptionResource
    └── ResourceGroupResource
        └── ApiManagementServiceResource
            ├── ApiResource
            │   ├── ApiOperationResource
            │   │   └── ApiOperationPolicyResource
            │   ├── ApiPolicyResource
            │   ├── ApiSchemaResource
            │   └── ApiDiagnosticResource
            ├── ApiManagementProductResource
            │   ├── ProductApiResource
            │   ├── ProductGroupResource
            │   └── ProductPolicyResource
            ├── ApiManagementSubscriptionResource
            ├── ApiManagementPolicyResource
            ├── ApiManagementUserResource
            ├── ApiManagementGroupResource
            ├── ApiManagementBackendResource
            ├── ApiManagementGatewayResource
            ├── ApiManagementCertificateResource
            ├── ApiManagementNamedValueResource
            └── ApiManagementLoggerResource

Flux de travail principal

1. Créer un service API Management

using Azure.ResourceManager.ApiManagement;
using Azure.ResourceManager.ApiManagement.Models;

// Obtenir le groupe de ressources
var resourceGroup = await subscription
    .GetResourceGroupAsync("my-resource-group");

// Définir le service
var serviceData = new ApiManagementServiceData(
    location: AzureLocation.EastUS,
    sku: new ApiManagementServiceSkuProperties(
        ApiManagementServiceSkuType.Developer, 
        capacity: 1),
    publisherEmail: "admin@contoso.com",
    publisherName: "Contoso");

// Créer le service (opération longue - peut prendre 30+ minutes)
var serviceCollection = resourceGroup.Value.GetApiManagementServices();
var operation = await serviceCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-apim-service",
    serviceData);

ApiManagementServiceResource service = operation.Value;

2. Créer une API

var apiData = new ApiCreateOrUpdateContent
{
    DisplayName = "My API",
    Path = "myapi",
    Protocols = { ApiOperationInvokableProtocol.Https },
    ServiceUri = new Uri("https://backend.contoso.com/api")
};

var apiCollection = service.GetApis();
var apiOperation = await apiCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-api",
    apiData);

ApiResource api = apiOperation.Value;

3. Créer un produit

var productData = new ApiManagementProductData
{
    DisplayName = "Starter",
    Description = "Starter tier with limited access",
    IsSubscriptionRequired = true,
    IsApprovalRequired = false,
    SubscriptionsLimit = 1,
    State = ApiManagementProductState.Published
};

var productCollection = service.GetApiManagementProducts();
var productOperation = await productCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "starter",
    productData);

ApiManagementProductResource product = productOperation.Value;

// Ajouter l'API au produit
await product.GetProductApis().CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-api");

4. Créer un abonnement

var subscriptionData = new ApiManagementSubscriptionCreateOrUpdateContent
{
    DisplayName = "My Subscription",
    Scope = $"/products/{product.Data.Name}",
    State = ApiManagementSubscriptionState.Active
};

var subscriptionCollection = service.GetApiManagementSubscriptions();
var subOperation = await subscriptionCollection.CreateOrUpdateAsync(
    WaitUntil.Completed,
    "my-subscription",
    subscriptionData);

ApiManagementSubscriptionResource subscription = subOperation.Value;

// Obtenir les clés d'abonnement
var keys = await subscription.GetSecretsAsync();
Console.WriteLine($"Primary Key: {keys.Value.PrimaryKey}");

5. Définir une stratégie API

var policyXml = @"
<policies>
    <inbound>
        <rate-limit calls=""100"" renewal-period=""60"" />
        <set-header name=""X-Custom-Header"" exists-action=""override"">
            <value>CustomValue</value>
        </set-header>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>";

var policyData = new PolicyContractData
{
    Value = policyXml,
    Format = PolicyContentFormat.Xml
};

await api.GetApiPolicy().CreateOrUpdateAsync(
    WaitUntil.Completed,
    policyData);

6. Sauvegarde et restauration

// Sauvegarde
var backupParams = new ApiManagementServiceBackupRestoreContent(
    storageAccount: "mystorageaccount",
    containerName: "apim-backups",
    backupName: "backup-2024-01-15")
{
    AccessType = StorageAccountAccessType.SystemAssignedManagedIdentity
};

await service.BackupAsync(WaitUntil.Completed, backupParams);

// Restauration
await service.RestoreAsync(WaitUntil.Completed, backupParams);

Référence des types clés

Type Objectif
ArmClient Point d'entrée pour toutes les opérations ARM
ApiManagementServiceResource Représente une instance de service APIM
ApiManagementServiceCollection Collection pour les opérations CRUD de service
ApiResource Représente une API
ApiManagementProductResource Représente un produit
ApiManagementSubscriptionResource Représente un abonnement
ApiManagementPolicyResource Stratégie au niveau du service
ApiPolicyResource Stratégie au niveau de l'API
ApiManagementUserResource Représente un utilisateur
ApiManagementGroupResource Représente un groupe
ApiManagementBackendResource Représente un service backend
ApiManagementGatewayResource Représente une passerelle auto-hébergée

Types de SKU

SKU Objectif Capacité
Developer Développement/test (pas de SLA) 1
Basic Production d'entrée de gamme 1-2
Standard Charges de travail moyennes 1-4
Premium Haute disponibilité, multi-région 1-12 par région
Consumption Sans serveur, paiement à l'usage N/A

Bonnes pratiques

  1. Utiliser WaitUntil.Completed pour les opérations qui doivent se terminer avant de continuer
  2. Utiliser WaitUntil.Started pour les opérations longues comme la création de service (30+ min)
  3. Toujours utiliser DefaultAzureCredential — ne jamais coder en dur les clés
  4. Gérer RequestFailedException pour les erreurs de l'API ARM
  5. Utiliser CreateOrUpdateAsync pour les opérations idempotentes
  6. Naviguer dans la hiérarchie via les méthodes Get* (par exemple, service.GetApis())
  7. Format de stratégie — Utiliser le format XML pour les stratégies ; JSON est également pris en charge
  8. Création de service — Le SKU Developer est le plus rapide pour les tests (~15-30 min)

Gestion des erreurs

using Azure;

try
{
    var operation = await serviceCollection.CreateOrUpdateAsync(
        WaitUntil.Completed, serviceName, serviceData);
}
catch (RequestFailedException ex) when (ex.Status == 409)
{
    Console.WriteLine("Service already exists");
}
catch (RequestFailedException ex) when (ex.Status == 400)
{
    Console.WriteLine($"Bad request: {ex.Message}");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"ARM Error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}

Fichiers de référence

Fichier Quand lire
references/service-management.md CRUD du service, SKUs, mise en réseau, sauvegarde/restauration
references/apis-operations.md APIs, opérations, schémas, versioning
references/products-subscriptions.md Produits, abonnements, contrôle d'accès
references/policies.md Modèles XML de stratégie, portées, stratégies courantes

Ressources associées

Ressource Objectif
API Management Documentation Documentation officielle Azure
Policy Reference Référence complète des stratégies
SDK Reference Référence de l'API .NET

Skills similaires