Surveillez l'utilisation d'une Amazon Machine Image partagée sur plusieurs comptes AWS - Recommandations AWS

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.

Surveillez l'utilisation d'une Amazon Machine Image partagée sur plusieurs comptes AWS

Créée par Naveen Suthar (AWS) et Sandeep Gawande (AWS)

Dépôt de code : cross-account-ami-auditing-terraform-samples

Environnement : PoC ou pilote

Technologies : gestion et gouvernance DevOps ; sans serveur ; opérations

Services AWS : Amazon DynamoDB ; AWS Lambda ; Amazon EventBridge

Récapitulatif

Les Amazon Machine Images (AMI) sont utilisées pour créer des instances Amazon Elastic Compute Cloud (Amazon EC2) dans votre environnement Amazon Web Services (AWS). Vous pouvez créer des AMI dans un compte AWS distinct et centralisé, appelé compte de créateur dans ce modèle. Vous pouvez ensuite partager l'AMI entre plusieurs comptes AWS situés dans la même région AWS, appelés comptes consommateurs dans ce modèle. La gestion des AMI à partir d'un seul compte assure l'évolutivité et simplifie la gouvernance. Dans les comptes clients, vous pouvez faire référence à l'AMI partagée dans les modèles de lancement Amazon EC2 Auto Scaling et les groupes de nœuds Amazon Elastic Kubernetes Service (Amazon EKS).

Lorsqu'une AMI partagée est déconseillée, désenregistrée ou non partagée, les services AWS qui font référence à l'AMI dans les comptes clients ne peuvent pas utiliser cette AMI pour lancer de nouvelles instances. Tout événement de mise à l'échelle automatique ou tout redémarrage de la même instance échoue. Cela peut entraîner des problèmes dans l'environnement de production, tels que des temps d'arrêt des applications ou une dégradation des performances. Lorsque des événements de partage et d'utilisation d'AMI se produisent dans plusieurs comptes AWS, il peut être difficile de surveiller cette activité.

Ce modèle vous permet de surveiller l'utilisation et le statut des AMI partagées entre les comptes d'une même région. Il utilise des services AWS sans serveur, tels qu'Amazon EventBridge, Amazon DynamoDB, AWS Lambda et Amazon Simple Email Service (Amazon SES). Vous provisionnez l'infrastructure sous forme de code (iAc) à l'aide de HashiCorp Terraform. Cette solution fournit des alertes lorsqu'un service d'un compte client fait référence à une AMI désenregistrée ou non partagée.

Conditions préalables et limitations

Prérequis

  • Deux comptes AWS actifs ou plus : un compte de créateur et un ou plusieurs comptes de consommateur

  • Une ou plusieurs AMI partagées entre le compte du créateur et le compte du consommateur

  • Terraform CLI, installée (documentation Terraform)

  • Fournisseur AWS Terraform, configuré (documentation Terraform)

  • (Facultatif, mais recommandé) Backend Terraform, configuré (documentation Terraform)

  • Git, installé

Limites

  • Ce modèle surveille les AMI qui ont été partagées avec des comptes spécifiques à l'aide de l'identifiant du compte. Ce modèle ne surveille pas les AMI partagées avec une organisation à l'aide de l'ID de l'organisation.

  • Les AMI ne peuvent être partagées qu'avec des comptes situés dans la même région AWS. Ce modèle surveille les AMI au sein d'une seule région cible. Pour surveiller l'utilisation des AMI dans plusieurs régions, vous déployez cette solution dans chaque région.

  • Ce modèle ne surveille aucune AMI partagée avant le déploiement de cette solution. Si vous souhaitez surveiller les AMI précédemment partagées, vous pouvez annuler le partage de l'AMI, puis la partager à nouveau avec les comptes clients.

Versions du produit

  • Terraform version 1.2.0 ou ultérieure

  • Terraform AWS Provider version 4.20 ou ultérieure

Architecture

Pile technologique cible

Les ressources suivantes sont fournies en tant qu'iAc via Terraform :

  • Tables Amazon DynamoDB

  • EventBridge Règles d'Amazon

  • Rôle dans AWS Identity and Access Management (IAM)

  • Fonctions AWS Lambda

  • Amazon SES

Architecture cible

Architecture permettant de surveiller l'utilisation des AMI partagées et d'avertir les utilisateurs si l'AMI n'est pas partagée ou est désenregistrée

Le schéma suivant illustre le flux de travail suivant :

  1. Une AMI du compte créateur est partagée avec un compte client de la même région AWS.

  2. Lorsque l'AMI est partagée, une EventBridge règle Amazon du compte créateur capture l'ModifyImageAttributeévénement et lance une fonction Lambda dans le compte créateur.

  3. La fonction Lambda stocke les données relatives à l'AMI dans une table DynamoDB du compte créateur.

  4. Lorsqu'un service AWS du compte client utilise l'AMI partagée pour lancer une instance Amazon EC2 ou lorsque l'AMI partagée est associée à un modèle de lancement, une EventBridge règle du compte client capture l'utilisation de l'AMI partagée.

  5. La EventBridge règle lance une fonction Lambda dans le compte client. La fonction Lambda effectue les opérations suivantes :

    1. La fonction Lambda met à jour les données relatives à l'AMI dans une table DynamoDB du compte client.

    2. La fonction Lambda assume un rôle IAM dans le compte créateur et met à jour la table DynamoDB dans le compte créateur. Dans le Mapping tableau, il crée un élément qui associe l'ID d'instance ou l'ID du modèle de lancement à son ID d'AMI respectif.

  6. L'AMI gérée de manière centralisée dans le compte du créateur est obsolète, désenregistrée ou non partagée.

  7. La EventBridge règle du compte créateur capture l'DeregisterImageévénement ModifyImageAttribute ou associé à l'removeaction et lance la fonction Lambda.

  8. La fonction Lambda vérifie la table DynamoDB pour déterminer si l'AMI est utilisée dans l'un des comptes consommateurs. Si aucun ID d'instance ou ID de modèle de lancement n'est associé à l'AMI dans le Mapping tableau, le processus est terminé.

  9. Si des identifiants d'instance ou de modèle de lancement sont associés à l'AMI dans le Mapping tableau, la fonction Lambda utilise Amazon SES pour envoyer une notification par e-mail aux abonnés configurés.

Outils

Services AWS

  • Amazon DynamoDB est un service de base de données NoSQL entièrement géré, offrant des performances rapides, prévisibles et évolutives.

  • Amazon EventBridge est un service de bus d'événements sans serveur qui vous permet de connecter vos applications à des données en temps réel provenant de diverses sources. Par exemple, les fonctions AWS Lambda, les points de terminaison d'appel HTTP utilisant des destinations d'API ou les bus d'événements dans d'autres comptes AWS.

  • AWS Identity and Access Management (IAM) vous aide à gérer en toute sécurité l'accès à vos ressources AWS en contrôlant qui est authentifié et autorisé à les utiliser.

  • AWS Lambda est un service de calcul qui vous permet d'exécuter du code sans avoir à provisionner ou à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.

  • Amazon Simple Email Service (Amazon SES) vous permet d'envoyer et de recevoir des e-mails en utilisant vos propres adresses e-mail et domaines.

Autres outils

  • HashiCorp Terraform est un outil open source d'infrastructure sous forme de code (IaC) qui vous aide à utiliser le code pour provisionner et gérer l'infrastructure et les ressources cloud.

  • Python est un langage de programmation informatique polyvalent.

Référentiel de code

Le code de ce modèle est disponible dans le référentiel GitHub cross-account-ami-monitoring-terraform-samples.

Bonnes pratiques

Épopées

TâcheDescriptionCompétences requises

Créez les profils nommés de l'interface de ligne de commande AWS.

Pour le compte créateur et chaque compte client, créez un profil nommé AWS Command Line Interface (AWS CLI). Pour obtenir des instructions, consultez la section Configuration de l'interface de ligne de commande AWS dans le centre de ressources AWS Getting Started.

DevOps ingénieur

Pour cloner le référentiel.

Entrez la commande suivante. Cela clone le référentiel cross-account-ami-monitoring-terraform-samples à l'aide de SSH. GitHub

git clone git@github.com:aws-samples/cross-account-ami-monitoring-terraform-samples.git
DevOps ingénieur

Mettez à jour le fichier provider.tf.

  1. Entrez la commande suivante pour accéder au terraform dossier du référentiel cloné.

    cd cross-account-ami-monitoring/terraform
  2. Ouvrez le fichier provider.tf.

  3. Mettez à jour les configurations du fournisseur Terraform AWS pour le compte créateur et le compte consommateur comme suit :

    • Pouralias, entrez un nom pour la configuration du fournisseur.

    • Pourregion, entrez la région AWS cible dans laquelle vous souhaitez déployer cette solution.

    • Pourprofile, entrez le profil nommé de l'interface de ligne de commande AWS pour accéder au compte.

  4. Si vous configurez plusieurs comptes client, créez un profil pour chaque compte client supplémentaire.

  5. Enregistrez et fermez le fichier provider.tf.

Pour plus d'informations sur la configuration des fournisseurs, consultez la section Configurations de fournisseurs multiples dans la documentation Terraform.

DevOps ingénieur

Mettez à jour le fichier terraform.tfvars.

  1. Ouvrez le fichier terraform.tfvars.

  2. Dans le account_email_mapping paramètre, configurez les alertes pour le compte créateur et le compte consommateur comme suit :

    • Pouraccount, entrez l'identifiant du compte.

    • Pouremail, entrez l'adresse e-mail à laquelle vous souhaitez envoyer les alertes. Vous ne pouvez saisir qu'une seule adresse e-mail pour chaque compte.

  3. Si vous configurez plusieurs comptes client, entrez un compte et une adresse e-mail pour chaque compte client supplémentaire.

  4. Enregistrez et fermez le fichier terraform.tfvars.

DevOps ingénieur

Mettez à jour le fichier main.tf.

Effectuez ces étapes uniquement si vous déployez cette solution sur plusieurs comptes client. Si vous déployez cette solution sur un seul compte client, aucune modification de ce fichier n'est nécessaire.

  1. Ouvrez le fichier main.tf.

  2. Pour chaque compte client supplémentaire, créez un nouveau module basé sur le consumer_account_A module du modèle. Pour chaque compte client, pourprovider, la valeur doit correspondre à l'alias que vous avez saisi dans le provider.tf fichier.

  3. Enregistrez et fermez le fichier main.tf.

DevOps ingénieur
TâcheDescriptionCompétences requises

Déployez la solution.

Dans la CLI Terraform, entrez les commandes suivantes pour déployer les ressources AWS dans les comptes de créateur et de consommateur :

  1. Entrez la commande suivante pour initialiser Terraform.

    terraform init
  2. Entrez la commande suivante pour valider les configurations Terraform.

    terraform validate
  3. Entrez la commande suivante pour créer un plan d'exécution Terraform.

    terraform plan
  4. Passez en revue les modifications de configuration dans le plan Terraform et confirmez que vous souhaitez implémenter ces modifications.

  5. Entrez la commande suivante pour déployer les ressources.

    terraform apply
DevOps ingénieur

Vérifiez l'identité de l'adresse e-mail.

Lorsque vous avez déployé le plan Terraform, Terraform a créé une adresse e-mail d'identité pour chaque compte client dans Amazon SES. Avant que les notifications puissent être envoyées à cette adresse e-mail, vous devez vérifier l'adresse e-mail. Pour obtenir des instructions, consultez Vérifier l'identité d'une adresse e-mail dans la documentation Amazon SES.

AWS général
TâcheDescriptionCompétences requises

Validez le déploiement dans le compte du créateur.

  1. Connectez-vous au compte du créateur.

  2. Dans la barre de navigation, vérifiez que vous visualisez la région cible. Si vous vous trouvez dans une autre région, choisissez le nom de la région actuellement affichée, puis choisissez la région cible.

  3. Ouvrez la console DynamoDB à l'adresse https://console.aws.amazon.com/dynamodb/.

  4. Dans le volet de navigation, choisissez Tables.

  5. Dans la liste des tables, vérifiez que la AmiShare table est présente.

  6. Ouvrez la console Lambda à l'adresse https://console.aws.amazon.com/lambda.

  7. Dans le volet de navigation, choisissez Fonctions.

  8. Dans la liste des fonctions, vérifiez que la ami-share fonction est présente.

  9. Ouvrez la console IAM à l'adresse https://console.aws.amazon.com/iamv2/.

  10. Dans le panneau de navigation, choisissez Roles (Rôles).

  11. Dans la liste des rôles, vérifiez que le external-ddb-role rôle est présent.

  12. Ouvrez la EventBridge console à l'adresse https://console.aws.amazon.com/events/.

  13. Dans le volet de navigation, choisissez Règles.

  14. Dans la liste des règles, vérifiez que la modify_image_attribute_event règle est présente.

  15. Ouvrez la console Amazon SES à l'adresse https:/console.aws.amazon.com/ses/.

  16. Dans le volet de navigation, choisissez Verified Identities.

  17. Dans la liste des identités, vérifiez qu'une adresse e-mail a été enregistrée et vérifiée pour chaque compte client.

DevOps ingénieur

Validez le déploiement dans le compte client.

  1. Connectez-vous au compte client.

  2. Dans la barre de navigation, vérifiez que vous visualisez la région cible. Si vous vous trouvez dans une autre région, choisissez le nom de la région actuellement affichée, puis choisissez la région cible.

  3. Ouvrez la console DynamoDB à l'adresse https://console.aws.amazon.com/dynamodb/.

  4. Dans le volet de navigation, choisissez Tables.

  5. Dans la liste des tables, vérifiez que la Mapping table est présente.

  6. Ouvrez la console Lambda à l'adresse https://console.aws.amazon.com/lambda.

  7. Dans le volet de navigation, choisissez Fonctions.

  8. Dans la liste des fonctions, vérifiez que les ami-deregister-function fonctions ami-usage-function et sont présentes.

  9. Ouvrez la EventBridge console à l'adresse https://console.aws.amazon.com/events/.

  10. Dans le volet de navigation, choisissez Règles.

  11. Dans la liste des règles, vérifiez que les ami_deregister_events règles ami_usage_events et sont présentes.

DevOps ingénieur
TâcheDescriptionCompétences requises

Créez une AMI dans le compte du créateur.

  1. Dans le compte du créateur, créez une AMI privée. Pour obtenir des instructions, consultez Créer une AMI à partir d'une instance Amazon EC2.

  2. Partagez la nouvelle AMI avec l'un des comptes clients. Pour obtenir des instructions, consultez Partager une AMI avec des comptes AWS spécifiques.

DevOps ingénieur

Utilisez l'AMI dans le compte client.

Dans le compte client, utilisez l'AMI partagée pour créer une instance EC2 ou un modèle de lancement. Pour obtenir des instructions, consultez Comment lancer une instance EC2 depuis une AMI personnalisée (AWS Re:Post Knowledge Center) ou Comment créer un modèle de lancement (documentation Amazon EC2 Auto Scaling).

DevOps ingénieur

Validez la surveillance et les alertes.

  1. Connectez-vous au compte du créateur.

  2. Ouvrez la console Amazon EC2 à l'adresse https://console.aws.amazon.com/ec2/.

  3. Dans le panneau de navigation, sélectionnez AMI.

  4. Sélectionnez l'AMI dans la liste, puis choisissez Actions, Modifier les autorisations de l'AMI.

  5. Dans la section Comptes partagés, sélectionnez le compte client, puis choisissez Supprimer la sélection.

  6. Sélectionnez Enregistrer les modifications.

  7. Vérifiez que l'adresse e-mail cible que vous avez définie pour le compte client reçoit une notification indiquant que le partage a été annulé pour l'AMI.

DevOps ingénieur
TâcheDescriptionCompétences requises

Supprimez les ressources.

  1. Entrez la commande suivante pour supprimer les ressources déployées selon ce modèle et arrêter de surveiller les AMI partagées.

    terraform destroy
  2. Confirmez la destroy commande en entrantyes.

DevOps ingénieur

Résolution des problèmes

ProblèmeSolution

Je n'ai pas reçu d'alerte par e-mail.

Plusieurs raisons peuvent expliquer pourquoi l'e-mail d'Amazon SES n'a pas été envoyé. Vérifiez les éléments suivants :

  1. Dans la section Epics, utilisez l'épopée de validation du déploiement des ressources pour confirmer que l'infrastructure a été correctement provisionnée dans tous les comptes AWS.

  2. Validez les événements de la fonction Lambda dans Amazon CloudWatch Logs. Pour obtenir des instructions, consultez la section Utilisation de la CloudWatch console dans la documentation Lambda. Vérifiez qu'il n'y a aucun problème d'autorisation, tel qu'un refus explicite dans les politiques basées sur l'identité ou les ressources. Pour plus d'informations, consultez la section Logique d'évaluation des politiques dans la documentation IAM.

  3. Dans Amazon SES, vérifiez que le statut de l'identité de l'adresse e-mail est vérifié. Pour plus d'informations, consultez la section Vérification de l'identité d'une adresse e-mail.

Ressources connexes

Documentation AWS

Documentation Terraform