En utilisant AWS re:Post, vous acceptez les AWS re:Post Conditions d’utilisation

Comment faire pour configurer une étape source CodePipeline avec un référentiel CodeCommit inter-comptes ?

Lecture de 8 minute(s)
0

Je souhaite configurer une étape source AWS CodePipeline avec un référentiel AWS CodeCommit inter-comptes.

Résolution

Remarque : CodeCommit n’est pas disponible pour les nouveaux clients. Les clients CodeCommit existants peuvent continuer à utiliser le service. Pour plus d’informations, consultez Comment migrer votre référentiel AWS CodeCommit vers un autre fournisseur Git.

La résolution suivante utilise le compte A pour le référentiel CodeCommit et le compte B pour CodePipeline.

Créer un référentiel CodeCommit dans le compte A

Pour créer un référentiel CodeCommit dans le compte A, consultez Créer un référentiel AWS CodeCommit.

Configurer un rôle inter-comptes dans le compte A

Procédez comme suit :

  1. Ouvrez la console Gestion des identités et des accès AWS (AWS IAM) dans le compte A.
  2. Dans le volet de navigation, choisissez Rôles.
  3. Choisissez Créer un rôle, puis procédez comme suit :
    Choisissez le compte AWS comme type d’entité de confiance.
    Choisissez Un autre compte AWS, puis saisissez l’ID du compte B.
    Saisissez le nom du rôle IAM, par exemple cross-account-access-role.
  4. Créez un rôle IAM avec la politique de confiance suivante :
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::example-account-b:root"
                },
                "Action": "sts:AssumeRole",
                "Condition": {}
            }
        ]
    }
    Remarque : remplacez example-account-b par l’ID du compte B.

Créer une clé AWS KMS à utiliser avec CodePipeline dans le compte B

Remarque : vous devez utiliser la clé gérée par le client AWS Key Management Service (AWS KMS) pour les déploiements inter-comptes. Si vous ne configurez pas la clé, CodePipeline chiffre les objets avec le chiffrement par défaut et il est impossible au rôle du compte de destination de déchiffrer les objets.

Procédez comme suit :

  1. Ouvrez la console AWS KMS dans le compte B.
  2. Dans le volet de navigation, choisissez Clés gérées par le client, puis procédez comme suit :
    Pour Type de clé, sélectionnez Symétrique.
    Pour Utilisation de la clé, sélectionnez Chiffrer et déchiffrer.
  3. Développez les options avancées, puis effectuez les étapes suivantes :
    Pour l’origine des matériaux clés, choisissez KMS.
    Pour Alias, entrez l’alias de votre clé, par exemple cmk-key.
    Pour Administrateurs de clé, sélectionnez l’identité IAM à laquelle vous souhaitez accorder l’accès à l’administrateur de clé.
  4. Dans la section Autres comptes AWS, sélectionnez Ajouter un autre compte AWS.
  5. Entrez l’identifiant du compte A.
  6. Choisissez Terminer.

Créer un CodePipeline dans le compte B

Procédez comme suit :

  1. Ouvrez la console CodePipeline.
  2. Choisissez Créer un pipeline, puis nommez le pipeline, par exemple account\_B\_pipeline.
    Remarque : la zone de texte Nom du rôle se remplit automatiquement avec le nom du rôle de service AWSCodePipelineServiceRole-ap-southeast-2-account\_B\_pipeline. Vous pouvez également choisir un rôle de service existant qui a accès à la clé AWS KMS.
  3. Développez les paramètres avancés, puis effectuez les étapes suivantes :
    Pour Magasin d’artefacts, choisissez Emplacement par défaut. Si nécessaire, vous pouvez choisir Emplacement personnalisé.
    Pour Clé de chiffrement, choisissez Clé gérée par le client, puis choisissez cmk-key dans la liste déroulante.
    Pour Fournisseur source, choisissez CodeCommit.
    Dans Nom du référentiel, saisissez le nom du référentiel, par exemple account-a-repository avec le nom de la branche comme principal.
  4. Sur la page Ajouter une étape de construction, choisissez Ignorer l’étape de construction, puis choisissez Ignorer.
  5. Sur la page Ajouter une phase de déploiement, pour Fournisseur de déploiement choisissez un service.
  6. Choisissez Suivant pour créer le pipeline.

Remarque : si vous recevez le message d’erreur suivant après avoir créé le pipeline, consultez la section Mettre à jour votre pipeline pour utiliser le rôle inter-comptes de cette résolution.

Message d’erreur :

« The action failed because no AWS CodeCommit repository named account-a-repository was found. Make sure you are using the correct repository name, and then try again. Error: account-a-repository »

Mettre à jour la politique d’utilisation d’AWS KMS dans le compte B

Procédez comme suit :

  1. Ouvrez la console AWS KMS dans le compte B.
  2. Dans le volet de navigation, choisissez Clés gérées par le client.
  3. Dans le tableau, sélectionnez l’alias de votre clé, par exemple cmk-key.
  4. Dans la section Utilisateurs de clé, choisissez Ajouter.
  5. Saisissez le rôle de service de pipeline, par exemple AWSCodePipelineServiceRole-ap-southeast-2-account\_B\_pipeline.
  6. Ajoutez le rôle de service de pipeline à la stratégie de clé AWS KMS. Vous trouverez ci-dessous un exemple de stratégie de clé :
    {
        "Id": "key-consolepolicy-3",
        "Version": "2012-10-17",
        "Statement": [{
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::example-account-b:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }, {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": ["arn:aws:iam::example-account-b:role/example-service-role/AWSCodePipelineServiceRole-ap-southeast-2-account_B_pipeline", "arn:aws:iam::<Account_A>:root"]
            },
            "Action": ["kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey"],
            "Resource": "*"
        }, {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": ["arn:aws:iam::example-account-b>:role/example-service-role/AWSCodePipelineServiceRole-ap-southeast-2-Account_B_pipeline", "arn:aws:iam::example-account-a:root"]
            },
            "Action": ["kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant"],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }]
    }

Configurer la stratégie de prise en charge de rôle dans le compte B

Procédez comme suit :

  1. Ouvrez la console IAM dans le compte B.

  2. Dans le volet de navigation, choisissez Rôles, puis sélectionnez votre rôle dans le pipeline.

  3. Ajoutez la politique suivante au rôle de pipeline qui prend en charge le rôle du compte A :

    {
        "Version": "2012-10-17",
        "Statement": {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::example-account-a:example-pipeline-role/*"
            ]
        }
    }

    Remarque : remplacez example-account-A par le compte A et example-pipeline-role par le rôle de pipeline.

Mettre à jour de la politique de compartiment pour le compartiment d’artefacts CodePipeline dans le compte B

Procédez comme suit :

  1. Ouvrez la console Amazon Simple Storage Service (Amazon S3) dans le compte B.

  2. Dans le volet de navigation, choisissez Compartiments, puis sélectionnez votre compartiment de pipeline.

  3. Choisissez Autorisations, puis Politique de compartiment.

  4. Dans l’éditeur de texte, mettez à jour votre politique pour inclure les déclarations de politique suivantes :

    {
        "Version": "2012-10-17",
        "Id": "example-policy-id",
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": ["arn:aws:iam::example-account-a-id:root", "arn:aws:iam::example-account-b-id:root"]
                },
                "Action": [
                    "s3:Get*",
                    "s3:Put*"
                ],
                "Resource": "arn:aws:s3:::example-pipeline-bucket/*"
            },
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": ["arn:aws:iam::example-account-a-id:root", "arn:aws:iam::example-account-b-id:root"]
                },
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::example-pipeline-bucket"
            }
        ]
    }

    Remarque : pour un alignement correct avec le format JSON, ajoutez une virgule après les instructions existantes. Remplacez example-policy-id par l’identifiant de votre politique, example-account-a-id par l’identifiant de votre compte A, example-account-b-id par l’identifiant de votre compte B, et example-pipeline-bucket par le nom du compartiment de pipeline.

Créer une politique IAM en ligne pour le compte A qui autorise l’utilisation de la clé AWS KMS pour le compte B

Procédez comme suit :

  1. Ouvrez la console IAM dans le compte A.
  2. Dans le volet de navigation, choisissez Rôles, puis sélectionnez votre ** cross-account-access-role**.
  3. Choisissez Créer une politique en ligne.
  4. Dans l’onglet JSON, saisissez la politique suivante :
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "kms:DescribeKey",
            "kms:GenerateDataKey*",
            "kms:Encrypt",
            "kms:ReEncrypt*",
            "kms:Decrypt"
          ],
          "Resource": [
            "arn:aws:kms:ap-southeast-2:example-account-b-id:key/example-key-id"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:Put*"
          ],
          "Resource": [
            "arn:aws:s3:::example-pipeline-artifact-bucket-arn/*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::example-pipeline-artifact-bucket-arn"
          ]
        }
      ]
    }
    Remarque : remplacez example-account-b-id par l’ID du compte B, example-key-id par l’ARN de la clé AWS KMS et example-pipeline-artifact-bucket-arn par l'ARN du compartiment d’artefacts du pipeline.
  5. Choisissez Examiner la politique, puis créez la politique.

Mettre à jour votre pipeline pour utiliser le rôle inter-comptes

Remarque : si des erreurs surviennent lorsque vous exécutez des commandes de l’interface de la ligne de commande AWS (AWS CLI), consultez la page Résoudre les erreurs liées à AWS CLI. Vérifiez également que vous utilisez la version la plus récente d’AWS CLI.

Procédez comme suit :

  1. Pour récupérer la définition du pipeline à partir d’un fichier nommé codepipeline.json, exécutez la commande get-pipeline :

    aws codepipeline get-pipeline --name example-account-b-pipeline > codepipeline.json

    Remarque : remplacez example-account-b-pipeline par le nom du pipeline du compte B.

  2. Ajoutez l’ARN du rôle IAM inter-comptes à l’étape Source du fichier codepipeline.json :

    {
      "name": "Source",
      "actions": [
        {
          "name": "Source",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "provider": "CodeCommit",
            "version": "1"
         },
          "runOrder": 1,
          "roleArn": "arn:aws:iam::example-account-a-id:role/example-cross-account-access-role",
          "configuration": {
            "BranchName": "main",
            "OutputArtifactFormat": "CODE_ZIP",
            "PollForSourceChanges": "false",
            "RepositoryName": "example-account-a-repository"
          },
          "outputArtifacts": [
            {
              "name": "SourceArtifact"
            }
          ],
          "inputArtifacts": [],
          "region": "example-region",
          "namespace": "SourceVariables"
        }
      ]
    }

    Remarque : remplacez example-account-a-id par l’ID du compte A, example-cross-account-access-role par le rôle inter-comptes, example-account-a-repository par le référentiel du compte A, et example-region par votre région AWS.

  3. Supprimez la section de métadonnées située à la fin du fichier codepipeline.json. Supprimez également la virgule avant la section des métadonnées.
    Exemple :

    "metadata": {
        "pipelineArn": "arn:aws:codepipeline:ap-southeast-2:12345678912:Account_B_pipeline",
        "created": "2023-01-11T05:09:20.235000+00:00",
        "updated": "2023-01-11T17:34:37.294000+00:00"
    }
  4. Pour mettre à jour le pipeline, exécutez la commande update-pipeline :

    aws codepipeline update-pipeline --cli-input-json example-codepipeline.json

    Remarque : remplacez example-codepipeline.json par le fichier JSON du pipeline.

Remarque : vous pouvez également utiliser la résolution précédente pour utiliser CodeCommit ou Amazon S3 à partir d’un autre compte AWS sur d’autres services AWS. Pour ce faire, intégrez le service AWS dans les étapes du pipeline à l’étape source à partir d’un autre compte. Pour plus d’informations, consultez Créer un pipeline dans CodePipeline qui utilise les ressources d’un autre compte AWS.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 mois