Comment déployer des artefacts sur Amazon S3 dans un autre compte AWS à l'aide de CodePipeline ?

Date de la dernière mise à jour : 14/02/2022

Je veux déployer des artefacts dans un compartiment Amazon Simple Storage Service (Amazon S3) d'un autre compte. Je veux également définir le compte de destination en tant que propriétaire de l'objet. Est-il possible d'y parvenir en utilisant AWS CodePipeline avec un fournisseur d'action de déploiement Amazon S3 ?

Solution

Remarque : l'exemple de procédure ci-dessous suppose ce qui suit :

  • Vous avez deux comptes : un compte de développement et un compte de production.
  • Le compartiment d'entrée du compte développement est nommé codepipeline-input-bucket (avec gestion des versions activée).
  • Le compartiment d'artefacts par défaut du compte développement est nommé codepipeline-us-east-1-0123456789.
  • Le compartiment de sortie du compte de production est nommé codepipeline-output-bucket.
  • Vous déployez des artefacts du compte de développement vers un compartiment S3 du compte de production.
  • Vous supposez qu'un rôle entre comptes a été créé dans le compte de production pour déployer les artefacts. Le rôle fait du compte de production le propriétaire de l'objet au lieu du compte de développement. Pour fournir au propriétaire du compartiment du compte de production l'accès aux objets appartenant au compte de développement, consultez l'article suivant : Comment déployer des artefacts vers Amazon S3 dans un autre compte AWS à l'aide de CodePipeline et d'une ACL prédéfinie ?

Créer une clé AWS KMS à utiliser avec CodePipeline dans le compte de développement

Important : vous devez utiliser la clé gérée par le client AWS Key Management Service (AWS KMS) pour les déploiements entre comptes. Si la clé n'est pas configurée, CodePipeline chiffre les objets avec le chiffrement par défaut, qui ne peut pas être déchiffré par le rôle dans le compte de destination.

1.    Ouvrez la console AWS KMS dans le compte de développement.

2.    Dans le volet de navigation, choisissez Customer managed keys (Clés gérées par le client).

3.    Choisissez Create Key (Créer une clé).

4.    Pour Key type (type de clé), choisissez Symmetric Key (Clé asymétrique).

5.    Développez Advanced Options (Options avancées).

6.    Pour Key material origin (Origine des clés), choisissez KMS. Ensuite, choisissez Next (Suivant).

7.    Pour Alias, saisissez l'alias de votre clé. Par exemple : s3deploykey.

8.    Choisissez Next (Suivant). La page Define key administrative permissions (Définir les autorisations administratives de la clé) s'ouvre.

9.    Dans la section Key administrators (Administrateurs de clé), sélectionnez un utilisateur ou un rôle AWS Identity and Access Management (IAM) comme administrateur de clé.

10. Choisissez Next (Suivant). La page Define key usage permissions (Définir les autorisations d'utilisation de la clé) s'ouvre.

11.    Dans Other AWS accounts (Autres comptes AWS), choisissez Add another AWS account (Ajouter un autre compte AWS).

12.    Dans la zone de texte qui s'affiche, ajoutez l'ID du compte de production. Ensuite, choisissez Next (Suivant).

Remarque : vous pouvez également sélectionner une fonction du service existante dans la section This Account (Ce compte). Si vous sélectionnez une fonction du service existante, passez les étapes de la section Mettre à jour la politique d'utilisation KMS dans le compte de développement.

13.    Passez en revue la politique de clé. Ensuite, choisissez Finish (Terminer).

Créer un CodePipeline dans le compte développement

1.    Ouvrez la console CodePipeline. Ensuite, choisissez Create pipeline (Créer un pipeline).

2.    Pour Pipeline name (Nom du pipeline), saisissez un nom pour votre pipeline. Par exemple : crossaccountdeploy.

Remarque : la zone de texte Role name (Nom de rôle) est automatiquement renseignée avec le nom de fonction du service AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy. Vous pouvez également choisir une autre fonction du service existante avec accès à la clé KMS.

3.    Développez la section Advanced settings (Paramètres avancés).

4.    Pour Artifact store (Magasin d'artefacts), sélectionnez Default location (Emplacement par défaut).
Remarque : vous pouvez sélectionner Custom location (Emplacement personnalisé) si cela est nécessaire pour votre cas d'utilisation.

5.    Pour Encryption key (Clé de chiffrement), sélectionnez Customer Managed Key (Clé gérée par un client).

6.    Pour KMS customer managed key (Clé gérée par le client KMS), sélectionnez l'alias de votre clé dans la liste (s3deploykey, pour cet exemple), puis cliquez sur Next (Suivant). La page Add source stage (Ajouter une étape de source) s'ouvre.

7. Pour Source provider (Fournisseur de source), choisissez Amazon S3.

8.    Pour Bucket (Compartiment), saisissez le nom de votre compartiment S3 d'entrée de développement. Par exemple : codepipeline-input-bucket.

Important : le compartiment d'entrée doit avoir la gestion des versions activée pour fonctionner avec CodePipeline.

9.    Pour S3 object key (Clé d'objet S3), saisissez sample-website.zip.

Important : pour utiliser un exemple de site web AWS au lieu de votre propre site web, consultez Didacticiel : Créer un pipeline qui utilise Amazon S3 comme fournisseur de déploiement. Recherchez ensuite un « exemple de site web statique » dans Prerequisites (Prérequis) de la section 1 : Déployer des fichiers de site web statique sur Amazon S3.

10.    Pour Change detection options (Options de détection de modifications), choisissez Amazon CloudWatch Events (recommandé) Ensuite, choisissez Next (Suivant).

11.    Sur la page Add build stage (Ajouter une étape de génération), choisissez Skip build stage (Ignorer l'étape de génération). Ensuite, choisissez Skip (Ignorer).

12.    Sur la page Add deploy stage (Ajouter une étape de déploiement), pour Deploy provider (Fournisseur de déploiement), choisir Amazon S3.

13.    Pour Region (Région), choisissez la région AWS dans laquelle se trouve votre compartiment S3 de sortie de production. Par exemple : USA Est (Virginie du Nord).

Important : si la région du compartiment de sortie de production est différente de celle de votre pipeline, vous devez également vérifier les points suivants :

  • Vous utilisez une clé AWS KMS multirégion avec plusieurs réplicas.
  • Votre pipeline possède des magasins d'artefacts dans les deux régions.

14.    Pour Bucket (Compartiment), saisissez le nom de votre compartiment S3 de sortie de production. Par exemple : codepipeline-output-bucket.

15.    Cochez la case Extract file before deploy (Extraire le fichier avant le déploiement).
Remarque : si nécessaire, saisissez un chemin pour Deployment path (Chemin de déploiement).

16.    Choisissez Next (Suivant).

17.    Choisissez Create pipeline (Créer un pipeline). Le pipeline s'exécute, mais l'étape source échoue. L'erreur suivante apparaît : « L'objet avec la clé 'sample-website.zip' n'existe pas. »

La section Télécharger l'exemple de site web dans le compartiment d'entrée de cet article vous montre comment résoudre cette erreur.

Mettre à jour la politique d'utilisation KMS dans le compte de développement

Important : ignorez cette section si vous utilisez une fonction du service CodePipeline existante.

1.    Ouvrez la console AWS KMS dans le compte de développement.

2.    Sélectionnez l'alias de votre clé (s3deploykey, pour cet exemple).

3.    Dans la section Utilisateurs de la clé, choisissez Ajouter.

4.    Dans la zone de recherche, saisissez la fonction du service AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy.

5.    Choisissez Add (Ajouter).

Configurer un rôle entre comptes dans le compte de production

Créez une politique IAM pour le rôle qui accorde des autorisations Amazon S3 à votre compartiment S3 de sortie de production

1.    Ouvrez la console IAM dans le compte de production.

2.    Dans le panneau de navigation, choisissez Policies (Politiques). Ensuite, choisissez Create policy (Créer une politique).

3.    Choisissez l'onglet JSON. Ensuite, saisissez la politique suivante dans l'éditeur JSON :

Important : remplacez codepipeline-output-bucket par le nom de votre compartiment S3 de sortie de production.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Put*"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-output-bucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-output-bucket"
      ]
    }
  ]
}

4.    Choisissez Examiner une politique.

5.    Pour Name (Nom), saisissez un nom pour la politique. Par exemple : outputbucketdeployaccess.

6.    Choisissez Créer une politique.

Créez une politique IAM pour le rôle qui accorde les autorisations KMS requises

1.    Dans la console IAM, choisissez Create policy (Créer une politique).

2.    Choisissez l'onglet JSON. Ensuite, saisissez la politique suivante dans l'éditeur JSON :

Remarque : remplacez l'ARN de la clé KMS que vous avez créée. Remplacez codepipeline-us-east-1-0123456789 par le nom du compartiment d'artefacts dans le compte de développement.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:DescribeKey",
        "kms:GenerateDataKey*",
        "kms:Encrypt",
        "kms:ReEncrypt*",
        "kms:Decrypt"
      ],
      "Resource": [
        "arn:aws:kms:us-east-1:<dev-account-id>:key/<key id>"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-us-east-1-0123456789"
      ]
    }
  ]
}

3.    Choisissez Review policy (Examiner une politique).

4.    Pour Name (Nom), saisissez un nom pour la politique. Par exemple : devkmss3access.

5.    Choisissez Créer une politique.

Créer un rôle entre comptes que le compte de développement peut assumer pour déployer les artefacts

1.    Ouvrez la console IAM dans le compte de production.

2.    Dans le panneau de navigation, choisissez Roles (Rôles). Ensuite, choisissez Create role (Créer un rôle).

3.    Choisissez Another AWS account (Autre compte AWS).

4.    Pour Account ID (ID de compte), saisissez l'ID de compte AWS du compte de développement.

5.    Sélectionnez Next: Permissions (Suivant : autorisations).

6.    Dans la liste des politiques, sélectionnez outputbucketdeployaccess et devkmss3access.

7.    Sélectionnez Next: Tags (Étape suivante : balises).

8.    (Facultatif) Ajoutez des balises, puis choisissez Next: Review (Suivant : Vérification).

9.    Pour Role name (Nom du rôle), entrez prods3role.

10.    Sélectionnez Create role (Créer un rôle).

11.    Dans la liste des rôles, choisissez prods3role.

12.    Choisissez Trust relationships (Relations d'approbation). Ensuite, choisissez Edit trust relationship (Modifier la relation d'approbation).

13.    Dans l'éditeur Policy Document (Document de politique), saisissez la politique suivante :

Important : remplacez dev-account-id par l'ID de compte AWS de votre compte de développement. Remplacez AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy par le nom de la fonction du service de votre pipeline.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::<dev-account-id>:role/service-role/AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {}
    }
  ]
}

14.    Choisissez Update Trust Policy (Mettre à jour la politique d'approbation).

Mettre à jour la politique de compartiment pour le compartiment d'artefact CodePipeline dans le compte de développement

1.    Ouvrez la console Amazon S3 dans le compte de développement.

2.    Dans la liste Bucket name (Nom du compartiment), choisissez le nom de votre compartiment d'artefact dans votre compte de développement (pour cet exemple, codepipeline-us-east-1-0123456789).

3.    Choisissez Permissions (Autorisations). Choisissez Bucket Policy (Politique de compartiment).

4.    Dans l'éditeur de texte, mettez à jour votre politique existante pour inclure les instructions de politique suivantes :

Important : pour aligner avec le formatage JSON approprié, ajoutez une virgule après les instructions existantes. Remplacez prod-account-id par l'ID de compte AWS de votre compte de production. Remplacez codepipeline-us-east-1-0123456789 par le nom de votre compartiment d'artefacts.

{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": [
        "s3:Get*",
        "s3:Put*"
    ],
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789/*"
},
{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::<prod-account-id>:root"
    },
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789"
}

5.    Choisissez Save (Enregistrer).

Associez une politique à votre fonction du service CodePipeline dans le compte de développement qui lui permet d'assumer le rôle entre comptes que vous avez créé

1.    Ouvrez la console IAM dans le compte de développement.

2.    Dans le panneau de navigation, choisissez Policies (Politiques). Ensuite, choisissez Create policy (Créer une politique).

3.    Choisissez l'onglet JSON. Ensuite, saisissez la politique suivante dans l'éditeur JSON :

Important : remplacez prod-account-id par l'ID de compte AWS de votre compte de production.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": [
      "arn:aws:iam::<prod-account-id>:role/prods3role"
    ]
  }
}

4.    Choisissez Examiner une politique.

5.    Pour Name (Nom), saisissez assumeprods3role.

6.    Choisissez Créer une politique.

7.    Dans le panneau de navigation, choisissez Roles (Rôles). Ensuite, choisissez le nom de la fonction du service pour votre pipeline (pour cet exemple, AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy).

8.    Choisissez Attach policies (Associer des politiques). Sélectionnez ensuite assumeprods3role.

9.    Choisissez Attach Policy (Associer une politique).

Mettez à jour votre pipeline pour utiliser le rôle entre comptes dans le compte de développement

Remarque : si vous recevez des erreurs lors de l'exécution des commandes AWS Command Line Interface (AWS CLI), vérifiez que vous utilisez la version la plus récente d'AWS CLI.

1.    Récupérez la définition du pipeline sous la forme d'un fichier nommé codepipeline.json en exécutant la commande AWS CLI suivante :

Important : remplacez crossaccountdeploy par le nom de votre pipeline.

aws codepipeline get-pipeline --name crossaccountdeploy > codepipeline.json

2.    Ajoutez l'ARN du rôle IAM entre comptes (roleArn) à la section action de déploiement du fichier codepipeline.json. Pour plus d'informations, consultez Référence de la structure du pipeline CodePipeline dans le Guide de l'utilisateur CodePipeline.

Exemple de roleArn IAM entre comptes

"roleArn": "arn:aws:iam::your-prod-account id:role/prods3role",

Exemple d'action de déploiement qui inclut un ARN de rôle IAM entre comptes

Important : remplacez prod-account-id par l'ID de compte AWS de votre compte de production.

{
  "name": "Deploy",
  "actions": [
    {
      "name": "Deploy",
      "actionTypeId": {
        "category": "Deploy",
        "owner": "AWS",
        "provider": "S3",
        "version": "1"
      },
      "runOrder": 1,
      "configuration": {
        "BucketName": "codepipeline-output-bucket",
        "Extract": "true"
      },
      "outputArtifacts": [],
      "inputArtifacts": [
        {
          "name": "SourceArtifact"
        }
      ],
      "roleArn": "arn:aws:iam::<prod-account-id>:role/prods3role",
      "region": "us-east-1",
      "namespace": "DeployVariables"
    }
  ]
}

3.    Supprimez la section de métadonnées à la fin du fichier codepipeline.json.

Important : assurez-vous de supprimer également la virgule qui précède la section des métadonnées.

Exemple de section de métadonnées

"metadata": {
    "pipelineArn": "arn:aws:codepipeline:us-east-1:<dev-account-id>:crossaccountdeploy",
    "created": 1587527378.629,
    "updated": 1587534327.983
}

4.    Mettez à jour le pipeline en exécutant la commande suivante :

aws codepipeline update-pipeline --cli-input-json file://codepipeline.json

Charger l'exemple de site web dans le compartiment d'entrée

1.    Ouvrez la console Amazon S3 dans le compte de développement.

2.    Dans la liste Bucket name (Nom du compartiment), choisissez votre compartiment S3 d'entrée de développement. Par exemple : codepipeline-input-bucket.

3.    Choisissez Upload (Charger). Ensuite, choisissez Add files (Ajouter des fichiers).

4.    Sélectionnez le fichier sample-website.zip que vous avez téléchargé précédemment.

5.    Choisissez Upload (Charger) pour exécuter le pipeline. Lorsque le pipeline s'exécute, les événements suivants se produisent :

  • L'action source sélectionne le fichier sample-website.zip dans le compartiment S3 d'entrée de développement (codepipeline-input-bucket). Ensuite, l'action source place le fichier zip en tant qu'artefact source dans le compartiment d'artefacts du compte de développement (codepipeline-us-east-1-0123456789).
  • Dans l'action de déploiement, la fonction du service CodePipeline (AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy) assume le rôle entre comptes (prods3role) dans le compte de production.
  • CodePipeline utilise le rôle entre comptes (prods3role) pour accéder à la clé KMS et au compartiment d'artefacts du compte de développement. CodePipeline déploie ensuite les fichiers extraits vers le compartiment S3 de sortie de production (codepipeline-output-bucket) du compte de production.

Remarque : le compte de production est le propriétaire des objets extraits dans le compartiment S3 de sortie de production (codepipeline-output-bucket).


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?