Intégration d'un produit AWS Marketplace for Containers Anywhere à License Manager - AWS Marketplace

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Intégration d'un produit AWS Marketplace for Containers Anywhere à License Manager

Suivez ces instructions pour intégrer AWS License Manager un produit AWS Marketplace for Containers Anywhere pour Amazon EKS Anywhere, Amazon ECS AnywhereEC2, Amazon ou une infrastructure sur site.

Pour obtenir des informations générales sur l'intégration de License Manager avec AWS Marketplace, notamment, les modèles de licence disponibles, consultezTarification contractuelle pour les produits en conteneur avec AWS License Manager. Pour plus d'informations AWS License Manager, consultez le guide de AWS License Manager l'utilisateur et la AWS License Managersection du manuel de référence des AWS CLI commandes.

Intégration d'un produit AWS Marketplace for Containers Anywhere à License Manager

Suivez les instructions ci-dessous pour intégrer votre produit AWS Marketplace for Containers Anywhere à AWS License Manager.

Pour intégrer votre produit AWS Marketplace for Containers Anywhere à License Manager
  1. Ouvrez un navigateur Web et connectez-vous au Portail de gestion AWS Marketplace.

  2. Créez un identifiant de produit pour votre produit en conteneur en effectuant les étapes suivantes. Vous utiliserez cet identifiant dans l'image de votre conteneur pour les vérifications de licence lors d'une étape ultérieure.

    1. Dans la barre de menus, développez Assets (Ressources), puis choisissez Container (Conteneur).

    2. Entrez un nom destiné aux clients pour votre produit, puis choisissez Créer. Vous pourrez modifier ce nom ultérieurement.

    3. Prenez note de l'identifiant du produit. Vous l'utiliserez lorsque vous créerez ou mettrez à jour les informations de tarification des produits.

      Astuce

      Si vous perdez votre identifiant de produit, vous pouvez le retrouver dans le en Portail de gestion AWS Marketplace choisissant Conteneur dans le menu Ressources. La page Conteneurs affiche la liste de vos produits avec le produit associéIDs.

  3. Téléchargez la dernière version publique, AWS SDK puis installez-la dans votre application conteneur. Vous trouverez les instructions d'installation de votre choix AWS SDK sur Tools to Build on AWS.

    Note

    Pour appeler les API opérations du License Manager depuis Amazon EKS Anywhere ou un cluster Kubernetes qui n'est pas fourni par AWS, vous devez utiliser un support compatible. AWS SDK Pour consulter la liste des solutions prises en charge AWS SDKs, consultez la section Utilisation d'une solution prise en charge AWS SDK.

  4. Créez un AWS License Manager client avec un fournisseur d'informations d'identification personnalisé afin qu'il puisse fournir des informations d'identification à l'application conteneur déployée sur AWS site ou sur site. Pour obtenir le code source complet d'un fournisseur d'informations d'identification personnaliséLicenseCredentialProvider, consultez les sections suivantes :

    LicenseCredentialsProviderétend la chaîne AWS SDK de fournisseurs d'informations d'identification par défaut pour une utilisation sur site en ajoutant. LicenseManagerTokenCredentialsProvider Cela fournit des informations d'identification en utilisant des jetons d'identité OIDC émis par License Manager dans les environnements sur site. Vous devez inclure le code source de LicenseCredentialsProvider dans le chemin de classe de votre application.

    Note

    L'extension de DefaultCredentialsProvider permet à la même application conteneur d'obtenir des informations d'identification lors de son exécution sur AWS et lors de son exécution dans un environnement sur site. Si l'application conteneur utilise déjà une chaîne de fournisseurs d'informations d'identification personnalisée au lieu de la chaîne par défaut, elle peut également être étendue en l'ajoutant LicenseManagerTokenCredentialsProvider à la chaîne personnalisée.

    L'extrait de code suivant est un exemple de création d'un AWS License Manager client à l'aide de Java.

    LicenseManagerClientBuilder clientBuilder = LicenseManagerClient.builder().credentialsProvider(LicenseCredentialsProvider.create());
  5. Appelez l'CheckoutLicenseAPIopération en utilisant la aws license-manager checkout-license commande figurant sur chaque image de conteneur payante de votre offre de produits. Cela permet de vérifier que l'acheteur est autorisé à utiliser une licence pour votre application. Si l'acheteur a droit à la demande, elle obtient CheckoutLicense gain de cause et renvoie les droits demandés et leur valeur. Si l'acheteur n'a pas droit à l'application, CheckoutLicense lance une exception.

    Les paramètres suivants sont requis lors de l'appel de l'CheckoutLicenseAPIopération :

    • CheckoutType— Les valeurs valides sont PROVISIONAL ou PERPETUAL :

      • PERPETUALÀ utiliser lorsque le nombre de droits retirés sera épuisé du pool.

        Exemple : l'acheteur a le droit de traiter 500 Go de données. Au fur et à mesure qu'ils continuent à traiter les données, la quantité est prélevée et épuisée du pool de 500 Go.

      • PROVISIONALÀ utiliser pour les droits de licence flottants où les droits sont retirés du pool et renvoyés après utilisation.

        Exemple : l'utilisateur a droit à 500 utilisateurs simultanés sur l'application. Lorsque les utilisateurs se connectent ou se déconnectent, ils sont tirés au sort ou renvoyés dans le pool de 500 utilisateurs. Pour en savoir plus sur les droits de licence flottants, consultez. Droits de licence flottants avec License Manager

    • ClientToken— Un identifiant unique distinguant majuscules et minuscules. Nous vous recommandons d'utiliser un résultat aléatoire UUID pour chaque demande unique.

    • Entitlements— Une liste des droits à vérifier.

      • Pour les droits relatifs aux fonctionnalités, indiquez les Unit propriétés Name et comme suit.

        { "Name": "<Entitlement_Name>", "Unit": "None" }
      • Pour les droits comptés, indiquez les Count propriétés NameUnit, et comme suit.

        { "Name": "<Entitlement_Name>", "Unit": "<Entitlement_Unit>", "Value": <Desired_Count> }
    • KeyFingerprint— L'empreinte numérique des licences délivrées par AWS Marketplace isaws:294406891311:AWS/Marketplace:issuer-fingerprint. L'utilisation de cette empreinte clé garantit que la licence est délivrée par une entité peu fiable AWS Marketplace et non par une entité peu fiable.

    • ProductSKU— L'identifiant du produit généré Portail de gestion AWS Marketplace lors des étapes précédentes.

    L'extrait suivant est un exemple d'appel utilisant l'CheckoutLicenseAPIopération utilisant le. AWS CLI

    aws license-manager checkout-license \ --product-sku "2205b290-19e6-4c76-9eea-377d6bf71a47" \ --checkout-type "PROVISIONAL" \ --client-token "79464194dca9429698cc774587a603a1" \ --entitlements "Name=AWS::Marketplace::Usage/Drawdown/DataConsumption, Value=10, Unit=Gigabytes" \ --key-fingerprint "aws:294406891311:AWS/Marketplace:issuer-fingerprint"
    Note

    Pour vérifier les licences, les applications de conteneur nécessitent un accès réseau sortant pour utiliser le License Manager. Les applications déployées sur site peuvent présenter un accès réseau sortant peu fiable ou lent. Ces applications doivent inclure des tentatives adéquates lors de l'appel de License Manager. Pour de plus amples informations, veuillez consulter Bonnes pratiques d'intégration avec License Manager pour les déploiements sur site.

  6. Appelez l'CheckoutLicenseAPIopération régulièrement pour identifier toute modification apportée aux licences des clients en raison de renouvellements, de mises à niveau ou d'annulations effectués le. AWS Marketplace La cadence dépend de l'application. Nous vous recommandons de vérifier les licences une fois par jour pour prendre en compte les modifications automatiquement sans aucune intervention de l'acheteur.

    Une application déployée sur site peut disposer d'un accès réseau sortant peu fiable pour vérifier les licences à une cadence régulière. Dans de tels cas, l'application doit utiliser des licences mises en cache pour une résilience suffisante. Pour de plus amples informations, veuillez consulter Bonnes pratiques d'intégration avec License Manager pour les déploiements sur site.

  7. Après avoir intégré l'CheckoutLicenseappel à votre application de conteneur, créez une nouvelle version de votre image de conteneur Docker avec les modifications.

  8. Mettez à jour le graphique Helm de votre application pour accepter un secret Kubernetes comme entrée facultative contenant la configuration permettant d'accéder aux licences à l'aide de License Manager. APIs Le secret de configuration contiendra un jeton d'identité émis par License Manager et un AWS Identity and Access Management rôle qui sera utilisé par le fournisseur d'informations d'identification personnalisé décrit précédemment pour obtenir les AWS informations d'identification permettant d'appeler License Manager APIs lorsque l'application conteneur est déployée sur site. Ajoutez également le Région AWS en tant qu'entrée avec une valeur par défaut deus-east-1.

    Les acheteurs qui déploient l'application de conteneur sur site peuvent créer le secret de Kubernetes grâce à AWS Marketplace l'expérience d'achat des produits en conteneur. Fournissez le nom secret de Kubernetes en entrée de la commande. helm install Le secret de configuration est configuré au format suivant.

    apiVersion: v1 kind: Secret metadata: name: aws-marketplace-license-config type: Opaque stringData: license_token: <token_value> // License Manager issued JWT token iam_role: <role_arn> // AWS Identity and Access Management role to assume with license token
  9. Mettez à jour le modèle de déploiement de l'application dans le graphique Helm pour les images de conteneur intégrées AWS License Manager afin d'inclure les éléments suivants :

    • Compte de service pour le pod — Le compte de service est requis pour les déploiements Helm sur AmazonEKS. Il est utilisé pour obtenir l'autorisation d'appeler les API opérations du License Manager en configurant IAM des rôles pour le compte de service sur l'image du conteneur. Pour plus d'informations sur IAM les rôles des comptes de service, consultez la section IAMRôles des comptes de service.

    • Accès aux licences pour les déploiements sur site : le secret de configuration de licence est requis pour fournir les informations d'identification et les autorisations appropriées pour appeler les API opérations de License Manager pour les déploiements Helm dans des environnements sur site. Les acheteurs généreront et fourniront le secret de licence à Helm à partir de l'expérience de AWS Marketplace l'acheteur.

    L'extrait de code suivant est un exemple de spécification de déploiement avec le compte de service, la configuration de la licence et le secret d'extraction de l'image.

    apiVersion: apps/v1 kind: Deployment metadata: name: example-app spec: replicas: 1 selector: matchLabels: app: example-app template: metadata: labels: app: example-app spec: // Service account for pod serviceAccountName: {{ .Values.serviceAccountName }} containers: - name: example-app image: example-app ports: - containerPort: 8001 // Add the following conditional attributes {{ - if .Values.awsmp.licenseConfigSecretName }} //Mount the license volume to the container image volumeMounts: - name: awsmp-product-license mountPath: "/var/run/secrets/product-license" //Add following environment variable to container for credential provider env: - name: AWS_WEB_IDENTITY_REFRESH_TOKEN_FILE value: "/var/run/secrets/product-license/license_token" - name: AWS_ROLE_ARN valueFrom: secretKeyRef: name: {{ .Values.aws.licenseConfigSecretName }} key: iam_role //Mount the license secret as a volume to the pod volumes: - name: awsmp-product-license secret: secretName: {{ .Values.aws.licenseConfigSecretName }} optional: true {{ - end }}
    Note

    Le secret de configuration de licence est facultatif. Les acheteurs n'utilisent cette valeur que pour les déploiements sur site. Pour les AWS déploiements, la spécification de déploiement doit inclure un compte de service pour les images intégrées du License Manager.

  10. Testez l'intégration du License Manager localement et sur Amazon EKS en suivant les étapes décrites dans les sections suivantes :

    1. Tester l'intégration de License Manager en local

    2. Test de l'intégration du License Manager sur Amazon EKS

  11. Après avoir vérifié avec succès l'intégration de License Manager sur site AWS et sur site, vous pouvez créer votre liste de produits conteneurs en suivant les étapes décrites dansCréation d'un produit de conteneur.

Tester l'intégration de License Manager en local

Vous pouvez utiliser minikube ou toute autre configuration pour tester l'intégration de License Manager sur n'importe quel cluster Kubernetes en local. Assurez-vous que le cluster Kubernetes dispose d'un accès Internet sortant pour appeler les opérations du License Manager. API

Pour tester une intégration de License Manager en local
  1. Créez une licence de test dans un compte vendeur de test avec les droits souhaités. Pour configurer une licence de test, reportez-vous CreateLicenseà la section AWS License Manager APIRéférence. Vous pouvez également utiliser le script suivant pour créer une licence de test, puis octroyer une licence à un compte d'acheteur de test pour qu'il utilise la licence. Le script suivant utilise les informations d'identification du compte vendeur de test.

    read -p 'AWS Account for test buyer: ' TEST_BUYER_ACCOUNT_ID read -p 'License entitlements: ' ENTITLEMENTS # TEST_SELLER_ACCOUNT_ID="109876543210" # ENTITLEMENTS="{\"Name\": \"ByData\",\"MaxCount\": 1000,\"Overage\":true,\"Unit\": \"Gigabits\",\"AllowCheckIn\": true}" # Create License NOW=$(date +"%Y-%m-%dT00:00:00+00:00") PRODUCT_NAME="My awesome product" PRODUCT_SKU="c97b7825-44c4-4f42-b025-12baa4c171e0" LICENSE_BENEFICIARY=" arn:aws:iam::$TEST_BUYER_ACCOUNT_ID:root " LICENSE_ISSUER_NAME="test-seller" LICENSE_NAME="test-seller-license" CLIENT_TOKEN="b3920968-a94f-4547-af07-3dd232319367" CONSUMPTION_TTL=180 CONSUMPTION_RENEW_TYPE="None" HOME_REGION="us-east-1" LICENSE_ARN=$(aws license-manager create-license --license-name "$LICENSE_NAME" --product-name "$PRODUCT_NAME" --product-sku "$PRODUCT_SKU" --issuer Name="$LICENSE_ISSUER_NAME" --home-region "$HOME_REGION" --validity Begin="$NOW" --entitlements "$ENTITLEMENTS" --beneficiary "$LICENSE_BENEFICIARY" --consumption-configuration RenewType="$CONSUMPTION_RENEW_TYPE",ProvisionalConfiguration={MaxTimeToLiveInMinutes=$CONSUMPTION_TTL} --client-token "$CLIENT_TOKEN" | jq -r ".LicenseArn" ) echo "License arn: $LICENSE_ARN" # Create Grant GRANT_TOKEN="e9a14140-4fca-4219-8230-57511a6ea6" GRANT_NAME="test-grant" GRANT_ARN=$(aws license-manager create-grant --grant-name "$GRANT_NAME" --license-arn "$LICENSE_ARN" --principals "$LICENSE_BENEFICIARY" --home-region "$HOME_REGION" --client-token "$GRANT_TOKEN" --allowed-operations "CheckoutLicense" "CheckInLicense" "ExtendConsumptionLicense" "CreateToken" | jq -r ".GrantArn") echo "Grant arn: $GRANT_ARN"
  2. Créez un secret Kubernetes avec le jeton de licence et le IAM rôle en utilisant le format de secret défini précédemment. Utilisez l'CreateTokenAPIopération License Manager pour générer un jeton de licence. Utilisez ensuite l'IAMCreateRoleAPIopération pour créer un IAM rôle doté d'autorisations et d'une politique de confiance. Consultez l'exemple dans le script suivant. Le script suivant utilise les informations d'identification du compte acheteur de test.

    read -p 'AWS Account for test license: ' TEST_ACCOUNT_ID read -p 'License Arn' LICENSE_ARN # Create IAM Role ROLE_NAME="AWSLicenseManagerConsumptionTestRole" ROLE_DESCRIPTION="Role to test AWS License Manager integration on-prem" ROLE_POLICY_ARN="arn:aws:iam::aws:policy/service-role/AWSLicenseManagerConsumptionPolicy" ROLE_TRUST_POLICY="{\"Version\": \"2012-10-17\",\"Statement\": [{ \"Effect\":\"Allow\", \"Principal\": { \"Federated\": \"openid-license-manager.amazonaws.com\" }, \"Action\": \"sts:AssumeRoleWithWebIdentity\",\"Condition\": { \"ForAnyValue:StringLike\": { \"openid-license-manager.amazonaws.com:amr\": \"aws:license-manager:token-issuer-account-id:${TEST_ACCOUNT_ID}\" }}}]}" ROLE_SESSION_DURATION=3600 ROLE_ARN=$(aws iam create-role --role-name "$ROLE_NAME" --description "$ROLE_DESCRIPTION" --assume-role-policy-document "$ROLE_TRUST_POLICY" --max-session-duration $ROLE_SESSION_DURATION | jq ".Role" | jq -r ".Arn") aws iam attach-role-policy --role-name "$ROLE_NAME" --policy-arn "$ROLE_POLICY_ARN" echo "Role arn: $ROLE_ARN" # Create Token CLIENT_TOKEN="b3920968-a94f-4547-af07-3dd232319367" TOKEN=$(aws license-manager create-token --license-arn $LICENSE_ARN --role-arns $ROLE_ARN --client-token $CLIENT_TOKEN | jq '.Token') echo "License access token: $TOKEN"c
  3. Configurez n'importe quel cluster Kubernetes hébergé à l'extérieur. AWS Utilisez-le pour vérifier que les applications conteneurs peuvent se connecter à AWS License Manager API des environnements autres que les environnements AWS et que le fournisseur d'informations d'identification personnalisé est bien intégré à l'application.

  4. Déployez le jeton de licence et IAM le rôle générés précédemment dans le cluster Kubernetes local.

    kubectl create secret generic "awsmp-license-access-config" \ --from-literal=license_token=${TOKEN} \ --from-literal=iam_role=${ROLE_ARN}
  5. Déployez votre application via Helm avec le nom secret en entrée et vérifiez que l'application peut appeler les API opérations du License Manager pour effectuer des vérifications d'autorisation. Pour les modifications des spécifications de Helm et de déploiement, reportez-vous à l'étape 9 deIntégration d'un produit AWS Marketplace for Containers Anywhere à License Manager.

Test de l'intégration du License Manager sur Amazon EKS

Vous pouvez également tester l'intégration de License Manager sur AmazonEKS. Testez pour vous assurer que l'application peut appeler les API opérations du License Manager sans le secret de configuration de la licence. Assurez-vous également que le compte de service peut être utilisé pour configurer des IAM rôles pour les comptes de service (IRSA) et fournir les informations d'identification pertinentes à l'application.

Pour tester une intégration de License Manager sur Amazon EKS
  1. Créez une licence de test dans un compte vendeur de test avec les droits souhaités. Consultez la CreateLicense APIréférence pour configurer votre licence de test ou utilisez le script suivant pour en créer une et octroyer une licence à un compte d'acheteur de test pour qu'il utilise la licence. Le script suivant utilise les informations d'identification du compte vendeur de test.

    read -p 'AWS Account for test buyer: ' TEST_BUYER_ACCOUNT_ID read -p 'License entitlements: ' ENTITLEMENTS # TEST_SELLER_ACCOUNT_ID="109876543210" # ENTITLEMENTS="{\"Name\": \"ByData\",\"MaxCount\": 1000,\"Overage\": true,\"Unit\": \"Gigabits\",\"AllowCheckIn\": true}" # Create License NOW=$(date +"%Y-%m-%dT00:00:00+00:00") PRODUCT_NAME="My awesome product" PRODUCT_SKU="c97b7825-44c4-4f42-b025-12baa4c171e0" LICENSE_BENEFICIARY=" arn:aws:iam::$TEST_BUYER_ACCOUNT_ID:root " LICENSE_ISSUER_NAME="test-seller" LICENSE_NAME="test-seller-license" CLIENT_TOKEN="b3920968-a94f-4547-af07-3dd232319367" CONSUMPTION_TTL=180 CONSUMPTION_RENEW_TYPE="None" HOME_REGION="us-east-1" LICENSE_ARN=$(aws license-manager create-license --license-name "$LICENSE_NAME" --product-name "$PRODUCT_NAME" --product-sku "$PRODUCT_SKU" --issuer Name="$LICENSE_ISSUER_NAME" --home-region "$HOME_REGION" --validity Begin="$NOW" --entitlements "$ENTITLEMENTS" --beneficiary "$LICENSE_BENEFICIARY" --consumption-configuration RenewType="$CONSUMPTION_RENEW_TYPE",ProvisionalConfiguration={MaxTimeToLiveInMinutes=$CONSUMPTION_TTL} --client-token "$CLIENT_TOKEN" | jq -r ".LicenseArn" ) echo "License arn: $LICENSE_ARN" # Create Grant GRANT_TOKEN="e9a14140-4fca-4219-8230-57511a6ea6" GRANT_NAME="test-grant" GRANT_ARN=$(aws license-manager create-grant --grant-name "$GRANT_NAME" --license-arn "$LICENSE_ARN" --principals "$LICENSE_BENEFICIARY" --home-region "$HOME_REGION" --client-token "$GRANT_TOKEN" --allowed-operations "CheckoutLicense" "CheckInLicense" "ExtendConsumptionLicense" "CreateToken" | jq -r ".GrantArn") echo "Grant arn: $GRANT_ARN"
  2. Créez un EKS cluster Amazon de test avec les configurations souhaitées ou exécutez les commandes suivantes pour utiliser une configuration par défaut.

    aws ec2 create-key-pair --region us-west-2 --key-name eks-key-pair
    eksctl create cluster \ --name awsmp-eks-test-example \ --region us-west-2 \ --with-oidc \ --ssh-access \ --ssh-public-key eks-key-pair
  3. Créez un compte de service pour un cluster existant et associez-le à un IAM rôle. La commande suivante crée un IAM rôle avecAWSLicenseManagerConsumptionPolicy. La commande l'attache ensuite au compte de test_sa service du EKS cluster Amazon où les images intégrées du License Manager doivent être déployées. Par conséquent, le compte de service peut obtenir les informations d'identification appropriées pour appeler les API opérations du License Manager.

    eksctl create iamserviceaccount \ --name test_sa \ --namespace test_namespace \ --cluster awsmp-eks-test-example \ --attach-policy-arn "arn:aws:iam::aws:policy/service-role/AWSLicenseManagerConsumptionPolicy" \ --approve \ --override-existing-serviceaccounts
  4. Déployez l'application via Helm dans le compte de service auquel le IAM rôle est associé depuis la commande précédente. Vérifiez que l'application peut appeler les API opérations du License Manager pour vérifier les droits d'accès.

Droits de licence flottants avec License Manager

Dans le cas des licences flottantes, lorsque les utilisateurs se connectent à l'application, une licence est extraite du pool de licences disponibles. Lorsque les utilisateurs se déconnectent, les licences sont ajoutées à nouveau au pool de licences disponibles.

Pour les licences flottantes, l'application utilise l'CheckoutLicenseAPIopération pour extraire les droits du pool de droits lorsque la ressource est utilisée. La réponse de l'CheckoutLicenseAPIopération inclut un jeton de consommation de licence qui est un identifiant unique pour le paiement. Le jeton de consommation de licences peut effectuer des actions supplémentaires sur les droits retirés, par exemple les réintégrer dans le pool de licences ou prolonger le retrait.

Lorsque la ressource n'est plus utilisée, l'application utilise l'CheckInLicenseAPIopération pour réintégrer les droits dans le pool.

aws license-manager check-in-license \ --license-consumption-token "f1603b3c1f574b7284db84a9e771ee12"

Si le réenregistrement d'une licence dans le pool échoue, par exemple si l'application se bloque pendant l'opération, les droits sont automatiquement réintégrés dans le pool au bout de 60 minutes. C'est pourquoi, si la ressource est utilisée pendant plus de 60 minutes, il est recommandé de ne pas inclure les droits dans le pool. Pour ce faire, utilisez l'ExtendLicenseConsumptionAPIopération tant que la ressource est utilisée.

aws license-manager extend-license-consumption \ --license-consumption-token "f1603b3c1f574b7284db84a9e771ee12"

Bonnes pratiques d'intégration avec License Manager pour les déploiements sur site

Les déploiements d'applications de conteneur dans un environnement sur site peuvent rencontrer un accès réseau sortant peu fiable. Utilisez les meilleures pratiques suivantes pour renforcer la résilience afin d'éviter toute interruption de service pour les acheteurs en raison de problèmes potentiels liés à une mauvaise connectivité Internet :

  • Réessai adéquat : des problèmes réseau transitoires peuvent empêcher votre application de se connecter à. AWS License Manager Implémentez de nouvelles tentatives pendant 30 minutes au maximum, avec des interruptions exponentielles. Cela permet d'éviter des pannes de courte durée ou des problèmes de réseau.

  • Évitez les limites strictes : les applications déployées dans des clusters connectés peuvent vérifier régulièrement les licences afin d'identifier les modifications dues aux mises à niveau ou aux renouvellements. En cas d'accès sortant peu fiable, l'application risque de ne pas être en mesure d'identifier ces modifications. Dans la mesure du possible, l'application doit éviter d'interrompre le service aux acheteurs en raison de l'impossibilité de vérifier les licences via le License Manager. Les applications peuvent recourir à un essai gratuit ou à une expérience open source lorsque la licence expire et qu'elles ne peuvent pas vérifier si une licence est valide.

  • Avertir les clients : lors de l'utilisation d'une licence mise en cache, les modifications apportées à la licence (y compris le renouvellement ou les mises à niveau) ne sont pas automatiquement répercutées sur la charge de travail en cours. Informez vos clients (qu'ils doivent autoriser à nouveau temporairement l'accès sortant à l'application) afin que l'application puisse mettre à jour sa licence mise en cache. Par exemple, informez les clients par le biais de l'application elle-même ou de sa documentation. De même, lorsque vous revenez à un ensemble de fonctionnalités inférieur, informez les clients que leurs droits sont épuisés ou que la licence a expiré. Ils peuvent ensuite choisir de procéder à une mise à niveau ou à un renouvellement.

LicenseManagerCredentialsProvider- Implémentation de Java

LicenseCredentialsProviderétend la chaîne AWS SDK de fournisseurs d'informations d'identification par défaut pour une utilisation sur site en ajoutant. LicenseManagerTokenCredentialsProvider

LicenseCredentialsProvider

package com.amazon.awsmp.license; import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.auth.credentials.AwsCredentialsProviderChain; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; import software.amazon.awssdk.auth.credentials.internal.LazyAwsCredentialsProvider; import software.amazon.awssdk.utils.SdkAutoCloseable; public class LicenseCredentialsProvider implements AwsCredentialsProvider, SdkAutoCloseable { private static final LicenseCredentialsProvider CREDENTIALS_PROVIDER = new LicenseCredentialsProvider(); private final LazyAwsCredentialsProvider providerChain; private LicenseCredentialsProvider() { this.providerChain = createChain(); } public static LicenseCredentialsProvider create() { return CREDENTIALS_PROVIDER; } @Override public AwsCredentials resolveCredentials() { return this.providerChain.resolveCredentials(); } @Override public void close() { this.providerChain.close(); } private LazyAwsCredentialsProvider createChain() { return LazyAwsCredentialsProvider.create(() -> { AwsCredentialsProvider[] credentialsProviders = new AwsCredentialsProvider[]{ DefaultCredentialsProvider.create(), LicenseManagerTokenCredentialsProvider.create()}; return AwsCredentialsProviderChain.builder().reuseLastProviderEnabled(true) .credentialsProviders(credentialsProviders).build(); }); } }

LicenseManagerTokenCredentialsProvider

LicenseManagerTokenCredentialsProviderfournit des informations d'identification en utilisant des jetons d'identité OIDC émis par License Manager dans des environnements sur site. Vous devez inclure le code source de LicenseCredentialsProvider dans le chemin de classe de votre application.

package com.amazon.awsmp.license; import software.amazon.awssdk.auth.credentials.AnonymousCredentialsProvider; import software.amazon.awssdk.auth.credentials.AwsCredentials; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.core.SdkSystemSetting; import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; import software.amazon.awssdk.core.retry.RetryPolicyContext; import software.amazon.awssdk.core.retry.conditions.OrRetryCondition; import software.amazon.awssdk.core.retry.conditions.RetryCondition; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.regions.providers.DefaultAwsRegionProviderChain; import software.amazon.awssdk.services.licensemanager.LicenseManagerClient; import software.amazon.awssdk.services.licensemanager.model.GetAccessTokenRequest; import software.amazon.awssdk.services.licensemanager.model.GetAccessTokenResponse; import software.amazon.awssdk.services.sts.StsClient; import software.amazon.awssdk.services.sts.auth.StsAssumeRoleWithWebIdentityCredentialsProvider; import software.amazon.awssdk.services.sts.model.AssumeRoleWithWebIdentityRequest; import software.amazon.awssdk.services.sts.model.IdpCommunicationErrorException; import software.amazon.awssdk.utils.IoUtils; import software.amazon.awssdk.utils.SdkAutoCloseable; import software.amazon.awssdk.utils.StringUtils; import software.amazon.awssdk.utils.SystemSetting; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; import java.util.function.Supplier; public class LicenseManagerTokenCredentialsProvider implements AwsCredentialsProvider, SdkAutoCloseable { private final StsAssumeRoleWithWebIdentityCredentialsProvider credentialsProvider; private final RuntimeException loadException; private Path licenseAccessTokenFile; private String roleArn; private String roleSessionName; private StsClient stsClient; private LicenseManagerClient lmClient; public static LicenseManagerTokenCredentialsProvider create() { return new Builder().build(); } @Override public AwsCredentials resolveCredentials() { if (this.loadException != null) { throw this.loadException; } return this.credentialsProvider.resolveCredentials(); } @Override public void close() { IoUtils.closeQuietly(this.credentialsProvider, null); IoUtils.closeQuietly(this.stsClient, null); IoUtils.closeIfCloseable(this.lmClient, null); } private LicenseManagerTokenCredentialsProvider(Builder builder) { StsAssumeRoleWithWebIdentityCredentialsProvider credentialsProvider = null; RuntimeException loadException = null; try { this.licenseAccessTokenFile = Paths.get(StringUtils.trim(LicenseSystemSetting.AWS_WEB_IDENTITY_REFRESH_TOKEN_FILE.getStringValueOrThrow())); this.roleArn = SdkSystemSetting.AWS_ROLE_ARN.getStringValueOrThrow(); this.roleSessionName = SdkSystemSetting.AWS_ROLE_SESSION_NAME.getStringValue().orElse("aws-sdk-java-" + System.currentTimeMillis()); this.stsClient = builder.stsClient != null ? builder.stsClient : StsClientFactory.create(); this.lmClient = builder.lmClient != null ? builder.lmClient : LicenseManagerClientFactory.create(); AssumeRoleWithWebIdentityRequest request = AssumeRoleWithWebIdentityRequest.builder() .roleArn(this.roleArn).roleSessionName(this.roleSessionName).build(); Supplier<AssumeRoleWithWebIdentityRequest> supplier = new AssumeRoleRequestSupplier(request, this.licenseAccessTokenFile, this.lmClient); credentialsProvider = StsAssumeRoleWithWebIdentityCredentialsProvider.builder() .stsClient(this.stsClient).refreshRequest(supplier).build(); } catch (RuntimeException ex) { loadException = ex; } this.credentialsProvider = credentialsProvider; this.loadException = loadException; } public static final class Builder { private Path licenseAccessTokenFile; private String roleArn; private String roleSessionName; private StsClient stsClient; private LicenseManagerClient lmClient; public LicenseManagerTokenCredentialsProvider build() { return new LicenseManagerTokenCredentialsProvider(this); } public LicenseManagerTokenCredentialsProvider.Builder licenseAccessTokenFile(Path licenseAccessTokenFile) { this.licenseAccessTokenFile = licenseAccessTokenFile; return this; } public LicenseManagerTokenCredentialsProvider.Builder roleArn(String roleArn) { this.roleArn = roleArn; return this; } public LicenseManagerTokenCredentialsProvider.Builder roleSessionName(String roleSessionName) { this.roleSessionName = roleSessionName; return this; } public LicenseManagerTokenCredentialsProvider.Builder stsClient(StsClient stsClient) { this.stsClient = stsClient; return this; } public LicenseManagerTokenCredentialsProvider.Builder lmClient(LicenseManagerClient lmClient) { this.lmClient = lmClient; return this; } } private static final class AssumeRoleRequestSupplier implements Supplier { private final LicenseManagerClient lmClient; private final AssumeRoleWithWebIdentityRequest request; private final Path webIdentityRefreshTokenFile; AssumeRoleRequestSupplier(final AssumeRoleWithWebIdentityRequest request, final Path webIdentityRefreshTokenFile, final LicenseManagerClient lmClient) { this.lmClient = lmClient; this.request = request; this.webIdentityRefreshTokenFile = webIdentityRefreshTokenFile; } public AssumeRoleWithWebIdentityRequest get() { return this.request.toBuilder() .webIdentityToken(getIdentityToken()) .build(); } private String getIdentityToken() { return refreshIdToken(readRefreshToken(this.webIdentityRefreshTokenFile)); } private String readRefreshToken(Path file) { try (InputStream webIdentityRefreshTokenStream = Files.newInputStream(file)) { return IoUtils.toUtf8String(webIdentityRefreshTokenStream); } catch (IOException e) { throw new UncheckedIOException(e); } } private String refreshIdToken(String licenseRefreshToken) { final GetAccessTokenRequest request = GetAccessTokenRequest.builder() .token(licenseRefreshToken) .build(); GetAccessTokenResponse response = this.lmClient.getAccessToken(request); return response.accessToken(); } } private static final class LicenseManagerClientFactory { private static final Duration DEFAULT_API_TIMEOUT = Duration.ofSeconds(30); private static final Duration DEFAULT_API_ATTEMPT_TIMEOUT = Duration.ofSeconds(10); public static LicenseManagerClient create() { return getLicenseManagerClient(); } private static LicenseManagerClient getLicenseManagerClient() { ClientOverrideConfiguration configuration = ClientOverrideConfiguration.builder() .apiCallTimeout(DEFAULT_API_TIMEOUT) .apiCallAttemptTimeout(DEFAULT_API_ATTEMPT_TIMEOUT) .build(); LicenseManagerClient client = LicenseManagerClient.builder() .region(configureLicenseManagerRegion()) .credentialsProvider(AnonymousCredentialsProvider.create()) .overrideConfiguration(configuration).build(); return client; } private static Region configureLicenseManagerRegion() { Region defaultRegion = Region.US_EAST_1; Region region; try { region = (new DefaultAwsRegionProviderChain()).getRegion(); } catch (RuntimeException ex) { region = defaultRegion; } return region; } } private static final class StsClientFactory { private static final Duration DEFAULT_API_TIMEOUT = Duration.ofSeconds(30); private static final Duration DEFAULT_API_ATTEMPT_TIMEOUT = Duration.ofSeconds(10); public static StsClient create() { return getStsClient(); } private static StsClient getStsClient() { OrRetryCondition retryCondition = OrRetryCondition.create(new StsRetryCondition(), RetryCondition.defaultRetryCondition()); ClientOverrideConfiguration configuration = ClientOverrideConfiguration.builder() .apiCallTimeout(DEFAULT_API_TIMEOUT) .apiCallAttemptTimeout(DEFAULT_API_ATTEMPT_TIMEOUT) .retryPolicy(r -> r.retryCondition(retryCondition)) .build(); return StsClient.builder() .region(configureStsRegion()) .credentialsProvider(AnonymousCredentialsProvider.create()) .overrideConfiguration(configuration).build(); } private static Region configureStsRegion() { Region defaultRegion = Region.US_EAST_1; Region stsRegion; try { stsRegion = (new DefaultAwsRegionProviderChain()).getRegion(); } catch (RuntimeException ex) { stsRegion = defaultRegion; } return stsRegion; } private static final class StsRetryCondition implements RetryCondition { public boolean shouldRetry(RetryPolicyContext context) { return context.exception() instanceof IdpCommunicationErrorException; } } } private enum LicenseSystemSetting implements SystemSetting { AWS_WEB_IDENTITY_REFRESH_TOKEN_FILE("aws.webIdentityRefreshTokenFile"); private String systemProperty; private String defaultValue = null; LicenseSystemSetting(String systemProperty) { this.systemProperty = systemProperty; } @Override public String property() { return this.systemProperty; } @Override public String environmentVariable() { return this.name(); } @Override public String defaultValue() { return this.defaultValue; } } }

LicenseManagerCredentialsProvider- Golang mise en œuvre

LicenseCredentialsProvider

LicenseCredentialsProviderétend la chaîne AWS SDK de fournisseurs d'informations d'identification par défaut pour une utilisation sur site en ajoutant. LicenseManagerTokenCredentialsProvider

package lib import ( "context" "fmt" "sync" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" ) // LicenseCredentialsProvider is the custom credential provider that can retrieve valid temporary aws credentials type LicenseCredentialsProvider struct { fallBackProvider aws.CredentialsProvider mux sync.RWMutex licenseCredentials aws.Credentials err error } // NewLicenseCredentialsProvider method will create a LicenseCredentialProvider Object which contains valid temporary aws credentials func NewLicenseCredentialsProvider() (*LicenseCredentialsProvider, error) { licenseCredentialProvider := &LicenseCredentialsProvider{} fallBackProvider, err := createCredentialProvider() if err != nil { return licenseCredentialProvider, fmt.Errorf("failed to create LicenseCredentialsProvider, %w", err) } licenseCredentialProvider.fallBackProvider = fallBackProvider return licenseCredentialProvider, nil } // Retrieve method will retrieve temporary aws credentials from the credential provider func (l *LicenseCredentialsProvider) Retrieve(ctx context.Context) (aws.Credentials, error) { l.mux.RLock() defer l.mux.RUnlock() l.licenseCredentials, l.err = l.fallBackProvider.Retrieve(ctx) return l.licenseCredentials, l.err } func createCredentialProvider() (aws.CredentialsProvider, error) { // LoadDefaultConfig will examine all "default" credential providers ctx := context.TODO() cfg, err := config.LoadDefaultConfig(ctx) if err != nil { return nil, fmt.Errorf("failed to create FallBackProvider, %w", err) } var useFallbackProvider bool if cfg.Credentials != nil { if _, err := cfg.Credentials.Retrieve(ctx); err != nil { // If the "default" credentials provider cannot retrieve credentials, enable fallback to customCredentialsProvider. useFallbackProvider = true } } else { useFallbackProvider = true } if useFallbackProvider { customProvider, err := newLicenseManagerTokenCredentialsProvider() if err != nil { return cfg.Credentials, fmt.Errorf("failed to create fallBackProvider, %w", err) } // wrap up customProvider with CredentialsCache to enable caching cfg.Credentials = aws.NewCredentialsCache(customProvider) } return cfg.Credentials, nil }

LicenseManagerTokenCredentialsProvider

LicenseManagerTokenCredentialsProviderfournit des informations d'identification en utilisant des jetons d'identité OIDC émis par License Manager dans des environnements sur site. Vous devez inclure le code source de LicenseCredentialsProvider dans le chemin de classe de votre application.

package lib import ( "context" "fmt" "io/ioutil" "os" "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sts" ) const awsRefreshTokenFilePathEnvVar = "AWS_LICENSE_ACCESS_FILE" // licenseManagerTokenCredentialsProvider defines and contains StsAssumeRoleWithWebIdentityProvider type licenseManagerTokenCredentialsProvider struct { stsCredentialProvider *stsAssumeRoleWithWebIdentityProvider mux sync.RWMutex licenseCredentials aws.Credentials err error } // Retrieve method will retrieve credentials from credential provider. // Make this method public to make this provider satisfies CredentialProvider interface func (a *licenseManagerTokenCredentialsProvider) Retrieve(ctx context.Context) (aws.Credentials, error) { a.mux.RLock() defer a.mux.RUnlock() a.licenseCredentials, a.err = a.stsCredentialProvider.Retrieve(ctx) return a.licenseCredentials, a.err } // newLicenseManagerTokenCredentialsProvider will create and return a LicenseManagerTokenCredentialsProvider Object which wraps up stsAssumeRoleWithWebIdentityProvider func newLicenseManagerTokenCredentialsProvider() (*licenseManagerTokenCredentialsProvider, error) { // 1. Retrieve variables From yaml environment envConfig, err := config.NewEnvConfig() if err != nil { return &licenseManagerTokenCredentialsProvider{}, fmt.Errorf("failed to create LicenseManagerTokenCredentialsProvider, %w", err) } roleArn := envConfig.RoleARN var roleSessionName string if envConfig.RoleSessionName == "" { roleSessionName = fmt.Sprintf("aws-sdk-go-v2-%v", time.Now().UnixNano()) } else { roleSessionName = envConfig.RoleSessionName } tokenFilePath := os.Getenv(awsRefreshTokenFilePathEnvVar) b, err := ioutil.ReadFile(tokenFilePath) if err != nil { return &licenseManagerTokenCredentialsProvider{}, fmt.Errorf("failed to create LicenseManagerTokenCredentialsProvider, %w", err) } refreshToken := aws.String(string(b)) // 2. Create stsClient cfg, err := config.LoadDefaultConfig(context.TODO()) if err != nil { return &licenseManagerTokenCredentialsProvider{}, fmt.Errorf("failed to create LicenseManagerTokenCredentialsProvider, %w", err) } stsClient := sts.NewFromConfig(cfg, func(o *sts.Options) { o.Region = configureStsClientRegion(cfg.Region) o.Credentials = aws.AnonymousCredentials{} }) // 3. Configure StsAssumeRoleWithWebIdentityProvider stsCredentialProvider := newStsAssumeRoleWithWebIdentityProvider(stsClient, roleArn, roleSessionName, refreshToken) // 4. Build and return return &licenseManagerTokenCredentialsProvider{ stsCredentialProvider: stsCredentialProvider, }, nil } func configureStsClientRegion(configRegion string) string { defaultRegion := "us-east-1" if configRegion == "" { return defaultRegion } else { return configRegion } }