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

Dernière mise à jour : 20/10/2020

Je souhaite déployer des artefacts sur Amazon Simple Storage Service (Amazon S3) dans un autre compte à l'aide d'AWS CodePipeline avec un fournisseur d'action de déploiement S3. Je souhaite également définir le propriétaire des artefacts comme compte cible.

Brève description

La résolution suivante est basée sur un exemple de scénario qui suppose ce qui suit :

  • Vous avez deux comptes : un compte développement (dév) et un compte production (prod).
  • Le compartiment d'entrée du compte dév est appelé codepipeline-input-bucket (avec gestion des versions activé).
  • Le compartiment à artefacts par défaut du compte dév est appelé codepipeline-us-east-1-0123456789.
  • Le compartiment de sortie du compte prod est appelé codepipeline-output-bucket.
  • Vous déployez des artefacts du compte dév. vers un compartiment S3 du compte prod.
  • Vous voulez assumer un rôle inter-comptes créé dans le compte prod, puis déployer les artefacts. Le rôle définit le propriétaire de l'objet des artefacts en tant que compte prod cible au lieu du compte dév.

Résolution

Créer une clé AWS Key Management Service (AWS KMS) à utiliser avec CodePipeline dans le compte dév

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

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, puis Suivant.

7.    Pour Alias, entrez s3deploykey.

Remarque : remplacez s3deploykey par l'alias de votre clé.

8.    Choisissez Suivant.

9.    Dans la section Administrateurs de clé de la page Définir des autorisations d'administration de clé, sélectionnez un utilisateur ou un rôle AWS Identity and Access Management (IAM) en tant qu'administrateur de clé, puis choisissez Suivant.

10.    Dans la section Other AWS accounts (Autres comptes AWS) de la page Define key usage permissions (Définir des autorisations d'utilisation de clé), choisissez Add another AWS account (Ajouter un autre compte AWS).

11.    Dans la zone de texte qui apparaît, ajoutez l'ID de compte du compte prod, puis choisissez Suivant.

Remarque : vous pouvez également sélectionner un rôle de service existant dans la section Ce compte puis ignorer les étapes de la section Mettre à jour la stratégie d'utilisation KMS dans le compte dév.

12.    Vérifiez la stratégie de clé, puis choisissez Terminer.

Important : vous devez utiliser la clé gérée par le client 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 cible.

Create a CodePipeline in the dev account (Créer un CodePipeline dans le compte dév)

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

2.    Pour Pipeline name (Nom du pipeline), entrez crossaccountdeploy.

Remarque : remplacez crossaccountdeploy par le nom de votre pipeline.

La zone de texte Role name (Nom de rôle) est automatiquement renseignée avec le nom de rôle de service AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy. Vous pouvez également choisir un rôle de service existant avec accès à la clé KMS.

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

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 scénario.

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

6.    Pour la clé principale client KMS, sélectionnez s3deploykey dans la liste, puis choisissez Suivant.

Important : remplacez s3deploykey par l'alias de votre clé.

7.    Sur la page Add source stage (Ajouter une étape source), pour Source provider (Fournisseur de source), choisissez Amazon S3.

8.    Pour Compartiment, entrez codepipeline-input-bucket.

Remarque : remplacez codepipeline-input-bucket par le nom de votre compartiment d'entrée.

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

9.    Pour la Clé d'objet S3, entrez 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 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é), puis Suivant.

11.    Sur la page Ajouter une étape de génération, choisissez Ignorer l'étape de génération, puis Ignorer.

12.    Sur la page Ajouter une étape de déploiement, pour Fournisseur de déploiement, choisissez Amazon S3.

13.    Pour Région, choisissez USA Est (Virginie du Nord).

Important : remplacez USA Est (Virginie du Nord) par la région AWS de votre compartiment de sortie.

14.    Pour compartiment, entrez le nom du compartiment prod codepipeline-output-bucket.

Remarque : remplacez codepipeline-output-bucket par le nom du compartiment de sortie dans votre compte prod.

15.    Cochez la case Extract file before deploy (Veuillez extraire le fichier avant le déploiement).

Remarque : si nécessaire, entrez un chemin pour Deployment path (Chemin de déploiement).

16.    Choisissez Suivant.

17.    Choisissez Create pipeline (Créer un pipeline).

Votre pipeline est maintenant déclenché, mais l'étape de la source échoue. Vous recevez alors la sortie suivante :

The object with key 'sample-website.zip' does not exist.

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

Mettre à jour la stratégie d'utilisation KMS dans le compte dév

Important : ignorez cette section si vous utilisez un rôle de service CodePipeline existant et que vous avez déjà ajouté ce rôle en tant qu'utilisateur clé dansCréer une clé AWS Key Management Service (AWS KMS) à utiliser avec CodePipeline dans la section compte de dév .

1.    Ouvrez la console AWS KMS dans le compte dév, puis choisissez s3deploykey.

Important : remplacez s3deploykey par l'alias de votre clé.

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

3.    Dans la zone de recherche, entrez le rôle de service AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy, puis choisissez Ajouter.

Configurer un rôle inter-comptes dans le compte de prod

Pour créer des stratégies :

1.    Ouvrez IAM console (console IAM) dans le compte prod.

2.    Dans le panneau de navigation, sélectionnez Policies (Stratégies), puis Create policy (Créer une stratégie).

3.    Choisissez l'onglet JSON, saisissez ensuite la stratégie suivante dans l'éditeur de code JSON :

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

Remarque : remplacez codepipeline-output-bucket par le nom du compartiment de sortie dans votre compte prod.

4.    Choisissez Examiner une stratégie.

5.    Pour Name (Nom), entrez outputbucketfullaccess.

6.    Choisissez « Create policy » (Créer une stratégie).

7.    Pour créer une autre stratégie, choisissez Create policy (Créer une stratégie).

8.    Choisissez l'onglet JSON, saisissez ensuite la stratégie suivante dans l'éditeur de code JSON :

{
    "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"
            ]
        }
    ]
}

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 de votre compte dév.

9.    Choisissez Review policy (Examiner une stratégie).

10.    Pour Name (Nom), entrez devkmss3access.

11.    Choisissez Create policy (Créer une stratégie).

Créer un rôle :

1.    Ouvrez IAM console (console IAM) dans le compte prod.

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

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

4.    Pour Account ID (ID de compte), entrez l'ID de compte dév.

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

6.    Dans la liste des stratégies, sélectionnez outputbucketfullaccess 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 l'ongletTrust relationship (Relation d'approbation), puisEdit Trust relationship (Modifier la relation d'approbation).

13.    Dans l'éditeur Document de stratégie, saisissez la stratégie suivante :

{
    "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": {}
        }
    ]
}

Remarque : remplacez dev-account-id par l'ID de compte de votre environnement de développement et le rôle de service de votre pipeline.

14.    Sélectionnez Mettre à jour la stratégie de confiance.

Configurez le compartiment d'artefact CodePipeline et le rôle de service dans le compte dév.

1.    Ouvrez Amazon S3 console (console Amazon S3) dans le compte dév.

2.    Dans liste des noms de compartiment, choisissez codepipeline-us-east-1-0123456789.

Remarque : remplacez codepipeline-us-east-1-0123456789 par le nom de votre compartiment d'artefacts.

3.    Sélectionnez Permissions (Autorisations), puis Bucket Policy (Politique de compartiment).

4.    Dans l'éditeur de texte, mettez à jour votre stratégie existante avec les instructions suivantes :

{
    "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"
}

Important : pour aligner avec le formatage JSON approprié, ajoutez une virgule après les instructions existantes.

Remarque : remplacez prod-account-id par l'ID de compte de votre environnement de prod. Remplacez codepipeline-us-east-1-0123456789 par le nom de votre compartiment d'artefacts.

5.    Sélectionnez Save.

6.    Ouvrez IAM console (console IAM) dans le compte dév.

7.    Dans le panneau de navigation, sélectionnez Policies (Stratégies), puis Create policy (Créer une stratégie).

8.    Choisissez l'onglet JSON, saisissez ensuite la stratégie suivante dans l'éditeur de code JSON :

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

Remarque : remplacez prod-account-id par l'ID de compte de votre environnement de prod.

9.    Choisissez Review policy (Examiner une stratégie).

10.    Pour Name (Nom), entrez assumeprods3role.

11.    Choisissez Create policy (Créer une stratégie).

12.    Dans le panneau de navigation, choisissez Rôles, puis AWSCodePipelineServiceRole-us-east-1-crossacountdeploy.

Remarque : remplacez AWSCodePipelineServiceRole-us-east-1-crossacountdeploy par votre rôle de service, le cas échéant.

13.    Choisissez Attacher des stratégie, puis sélectionnez assumeprods3role.

14.    Choisissez Associer la stratégie.

Update the CodePipeline to use a cross-account role in the dev account (Mettre à jour CodePipeline pour utiliser un rôle inter-comptes dans le compte dév)

1.    Pour obtenir la définition de pipeline dans un fichier appelé codepipeline.json, exécutez la commande suivante :

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

Remarque : remplacez crossaccountdeploy par le nom de votre pipeline.

2.    Mettez à jour la section dans codepipeline.json pour inclure le roleArn. Par exemple :

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

Pour ajouter le roleArn, effectuez les mises à jour suivantes :

{
    "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"
        }
    ]
}

Remarque : remplacez le prod-account-id par l'ID de compte de votre environnement de prod.

3.    Supprimez la section de métadonnées à la fin de votre fichier codepipeline.json. Par exemple :

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

Important : pour s'aligner sur le formatage JSON approprié, supprimez la virgule avant la section des métadonnées.

4.    Pour mettre à jour le pipeline, exécutez la commande suivante :

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

Upload the sample website to the input bucket (Charger l'exemple de site Web dans le compartiment d'entrée )

1.    Ouvrez Amazon S3 console (console Amazon S3) dans le compte dév.

2.    Dans la liste Bucket name (Nom du compartiment), choisissezcodepipeline-input-bucket.

Remarque : remplacez codepipeline-input-bucket par le nom de votre compartiment d'entrée.

3.    Choisissez Upload (Charger), puis 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).

CodePipeline est maintenant déclenché et ce qui suit se produit :

1.    L'action source sélectionne le fichier sample-website.zip à partir de codepipeline-input-bucket. Ensuite, l'action source place le site Web en tant qu'artefact source dans le compartiment d'artefacts codepipeline-us-east-1-0123456789 .

2.    Dans l'action de déploiement, le rôle de service CodePipeline AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy assume le prods3role du compte prod.

3.    CodePipeline utilise l'accès prods3role pour la clé KMS et le compartiment d'artefacts dans le compte dév pour obtenir les artefacts. Ensuite, CodePipeline déploie les fichiers extraits dans le compartiment codepipeline-output-bucket du compte prod.

Les objets extraits dans codepipeline-output-bucket ont désormais le compte prod en tant que propriétaire.</P


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


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