Comment déployer une pile AWS CloudFormation dans un compte différent à l'aide de CodePipeline ?

Date de la dernière mise à jour : 19/01/2022

Je veux utiliser AWS CodePipeline pour déployer une pile AWS CloudFormation dans un autre compte AWS. Comment puis-je faire la configuration ?

Brève description

Pour déployer une pile CloudFormation dans un compte AWS différent à l'aide de CodePipeline, procédez comme suit :

Remarque : cette procédure suppose que vous disposez de deux comptes AWS : compte 1 et compte 2.

1.    (Dans le compte 1) Créez une clé AWS Key Management Service (AWS KMS) gérée par le client qui accorde des autorisations d'utilisation des clés aux éléments suivants :

  • La fonction du service CodePipeline du compte 1
  • compte 2

2.    (Dans le compte 1) Créez un compartiment Amazon Simple Storage Service (Amazon S3) avec une politique de compartiment qui accorde au compte 2 l'accès au compartiment.

3.    (Dans le compte 2) Créez un rôle AWS Identity and Access Management (IAM) entre comptes qui autorise les actions suivantes :

  • Actions d'API CloudFormation
  • Accès au compartiment Amazon S3 dans le compte 1
  • Déchiffrement avec la clé AWS KMS gérée par le client dans le compte 1

4.    (Dans le compte 1) Ajoutez l'autorisation AssumeRole à la fonction du service CodePipeline du compte 1 pour lui permettre d'assumer le rôle entre comptes dans le compte 2.

5.    (Dans le compte 2) Créez une fonction du service pour la pile CloudFormation qui inclut les autorisations requises pour les services déployés par la pile.

6.    (Dans le compte 1) Mettez à jour la configuration de CodePipeline dans le compte 1 pour inclure les ressources associées au compte 2.

Solution

(Dans le compte 1) Créez une clé AWS KMS gérée par le client qui accorde des autorisations d'utilisation à la fonction du service CodePipeline du compte 1 et au compte 2

1.    Dans le compte 1, ouvrez la console AWS KMS.

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é). Choisissez ensuite Symmetric (Symétrique).

Remarque : dans la section Advanced options (Options avancées), laissez l'origine comme KMS.

4.    Pour Alias, entrez un nom pour votre clé.

5.    (Facultatif) Ajoutez des identifications en fonction de votre cas d'utilisation. Ensuite, sélectionnez Next (Suivant).

6.    Sur la page Define key administrative permissions (Définir les autorisations administratives des clés), pour Key administrators (Administrateurs de la clé), choisissez votre utilisateur AWS Identity and Access Management (IAM). De même, tout autre utilisateur ou groupe que vous voulez voir servir d'administrateur de la clé. Ensuite, sélectionnez Next (Suivant).

7.    Sur la page Define key usage permissions (Définir les autorisations d'utilisation de la clé), pour This account (Ce compte), ajoutez les identités IAM qui doivent avoir accès à la clé. Par exemple : la fonction du service CodePipeline.

8.    Dans Other AWS accounts (Autres comptes AWS), choisissez Add another AWS account (Ajouter un autre compte AWS). Saisissez ensuite l'Amazon Resource Name (ARN) du rôle IAM dans le compte 2.

9.    Choisissez Next (Suivant). Choisissez ensuite Finish (Terminer).

10.    Dans la section Customer managed keys (Clés gérées par le client), choisissez la clé que vous venez de créer. Copiez ensuite l'ARN de la clé.

Important : vous devez disposer de l'ARN de la clé AWS KMS lorsque vous mettez à jour votre pipeline et configurez vos politiques IAM.

(Dans le compte 1) Créez un compartiment Amazon S3 avec une politique de compartiment qui accorde au compte 2 l'accès au compartiment

1.    Dans le compte 1, ouvrez la console Amazon S3.

2.    Choisissez un compartiment Amazon S3 existant ou créez un nouveau compartiment S3 pour l'utiliser comme ArtifactStore pour CodePipeline.

Remarque : les artefacts peuvent inclure un fichier de modèle de pile, un fichier de configuration de modèle ou les deux. CodePipeline utilise ces artefacts pour travailler avec les piles et les jeux de modifications CloudFormation. Dans votre fichier de configuration de modèle, vous devez spécifier les valeurs des paramètres du modèle, une politique de pile et des identifications.

3.    Sur la page détails Amazon S3 du compartiment, choisissez Permissions (Autorisations).

4.    Choisissez Stratégie de compartiment.

5.    Dans l'éditeur de politique de compartiment, saisissez la politique suivante :

Important : remplacez codepipeline-source-artifact par le nom de compartiment SourceArtifact pour CodePipeline. Remplacez ACCOUNT_B_NO par le numéro de compte du compte 2.

{
  "Id": "Policy1553183091390",
  "Version": "2012-10-17",
  "Statement": [{
      "Sid": "",
      "Action": [
        "s3:Get*",
        "s3:Put*"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::codepipeline-source-artifact/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::ACCOUNT_B_NO:root"
        ]
      }
    },
    {
      "Sid": "",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::codepipeline-source-artifact",
      "Principal": {
        "AWS": [
          "arn:aws:iam::ACCOUNT_B_NO:root"
        ]
      }
    }
  ]
}

6.    Choisissez Save (Enregistrer).

(Dans le compte 2) Créez un rôle IAM entre comptes

Créez une politique IAM qui permet ce qui suit :

  • Le pipeline dans le compte 1 pour assumer le rôle IAM entre comptes dans le compte 2
  • Actions d'API CloudFormation
  • Les actions d'API Amazon S3 liées au SourceArtifact

1.    Dans le compte 2, ouvrez la console IAM.

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-source-artefact par le nom du compartiment du magasin d'artefacts de votre pipeline.

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Action": [
        "cloudformation:*",
        "iam:PassRole"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:Put*",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::codepipeline-source-artifact/*"
      ]
    }
  ]
}

4.    Choisissez Examiner une politique.

5.    Pour Name (Nom), saisissez un nom pour la politique.

6.    Choisissez Create policy (Créer une politique).

Créez une deuxième politique IAM qui autorise les actions d'API AWS KMS

1.    Dans le compte 2, ouvrez la console IAM.

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 arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id par l'ARN de votre clé AWS KMS que vous avez copié précédemment.

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Action": [
      "kms:DescribeKey",
      "kms:GenerateDataKey*",
      "kms:Encrypt",
      "kms:ReEncrypt*",
      "kms:Decrypt"
    ],
    "Resource": [
      "arn:aws:kms:REGION:ACCOUNT_A_NO:key/key-id"
    ]
  }]
}

4.    Choisissez Examiner une politique.

5.    Pour Name (Nom), saisissez un nom pour la politique.

6.    Choisissez Create policy (Créer une politique).

Créez le rôle IAM entre comptes à l'aide des politiques que vous avez créées

1.    Dans le compte 2, ouvrez la console IAM.

2.    Dans le volet de navigation, choisissez Rôles.

3.    Sélectionnez Créer un rôle.

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

5.    Pour Account ID (ID de compte), saisissez l'ID de compte du compte 1.

6.    Choisissez Next: Permissions (Suivant : Autorisations). Suivez ensuite les étapes pour créer le rôle IAM.

7.    Attachez au rôle que vous avez créé la politique de rôle entre comptes et la politique de clé KMS. Pour des instructions, consultez la section Ajout et suppression d'autorisations d'identité IAM.

(Dans le compte 1) Ajoutez l'autorisation AssumeRole à la fonction du service CodePipeline du compte 1 pour l'autoriser à assumer le rôle entre comptes dans le compte 2

1.    Dans le compte 1, ouvrez la console IAM.

2.    Dans le volet de navigation, choisissez Rôles.

3.    Choisissez le rôle de service IAM que vous utilisez pour CodePipeline.

4.    Sélectionnez Add inline policy (Ajouter une stratégie en ligne).

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

Important : remplacez ACCOUNT_B_NO par le numéro de compte du compte 2.

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

6.    Choisissez Review policy (Vérifier la politique), puis créez la politique.

(Dans le compte 2) Créez une fonction du service pour la pile CloudFormation qui inclut les autorisations requises pour les services déployés par la pile

Remarque : cette fonction du service est configurée directement sur la pile CloudFormation dans le compte 2. Le rôle doit inclure les autorisations pour les services déployés par la pile.

1.    Dans le compte 2, ouvrez la console IAM.

2.    Dans le volet de navigation, choisissez Rôles.

3.    Créez un rôle pour AWS CloudFormation à utiliser lors du lancement des services en votre nom.

4.    Appliquez les autorisations à votre rôle en fonction de votre cas d'utilisation.

Important : assurez-vous que la politique d'approbation est destinée à AWS CloudFormation et que votre rôle est autorisé à accéder aux services déployés par la pile.

(Dans le compte 1) Mettez à jour la configuration de CodePipeline pour inclure les ressources associées au compte 2

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

Vous ne pouvez pas utiliser la console CodePipeline pour créer ou modifier un pipeline qui utilise les ressources associées à un autre compte. Toutefois, vous pouvez utiliser la console pour créer la structure générale du pipeline. Ensuite, vous pouvez utiliser AWS CLI pour modifier le pipeline et ajouter les ressources associées à l’autre compte. Ou bien, vous pouvez mettre à jour un pipeline en cours avec les ressources du nouveau pipeline. Pour plus d'informations, consultez Créer un pipeline dans CodePipeline.

1.    Obtenez la structure JSON du pipeline en exécutant la commande AWS CLI suivante :

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

2.    Dans votre fichier local pipeline.json, confirmez que l'ID encryptionKey qui se trouve sous artifactStore contient l'ID avec l'ARN de la clé AWS KMS.

Remarque : pour plus d'informations sur la structure du pipeline, consultez create-pipeline dans la référence des commandes AWS CLI.

3.    Dans le fichier pipeline.json, mettez à jour la configuration d'action AWS CloudFormation.

Remarque : le RoleArn dans la structure JSON de la configuration d'action du pipeline est le rôle pour la pile CloudFormation (CFN_STACK_ROLE). Le roleArn en dehors de la structure JSON de la configuration d'action est le rôle entre comptes que le pipeline assume pour exploiter une pile CloudFormation (CROSS_ACCOUNT_ROLE).

4.    Vérifiez que le rôle est mis à jour pour les deux éléments suivants :

  • Le RoleArn à l'intérieur de la structure JSON de configuration d'action pour votre pipeline.
  • Le roleArn en dehors de la structure JSON de configuration d'action pour votre pipeline.

Remarque : dans l'exemple de code suivant, RoleArn est le rôle transmis à AWS CloudFormation pour lancer la pile. CodePipeline utilise roleArn pour exploiter une pile AWS CloudFormation.

{
  "name": "Prod_Deploy",
  "actions": [{
    "inputArtifacts": [{
      "name": "MyApp"
    }],
    "name": "test-cfn-x",
    "actionTypeId": {
      "category": "Deploy",
      "owner": "AWS",
      "version": "1",
      "provider": "CloudFormation"
    },
    "outputArtifacts": [],
    "configuration": {
      "ActionMode": "CHANGE_SET_REPLACE",
      "ChangeSetName": "test",
      "RoleArn": "ARN_FOR_CFN_STACK_ROLE",
      "Capabilities": "CAPABILITY_IAM",
      "StackName": "test-cfn-sam",
      "TemplatePath": "MyApp::template.yaml"
    },
    "roleArn": "ARN_FOR_CROSS_ACCOUNT_ROLE",
    "runOrder": 1
  }]
}

5.    Supprimez la configuration des métadonnéesdu fichier pipeline.json. Par exemple :

"metadata": {
  "pipelineArn": "arn:aws:codepipeline:REGION:ACC:my_test",
  "updated": 1551216777.183,
  "created": 1551207202.964
}

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

6.    (Facultatif) Pour créer un pipeline et mettre à jour la structure JSON, exécutez la commande suivante pour mettre à jour le pipeline avec le nouveau fichier de configuration :

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

7.    (Facultatif) Pour utiliser un pipeline en cours et mettre à jour la structure JSON, exécutez la commande suivante pour créer un nouveau pipeline :

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

Important : dans votre fichier pipeline.json, assurez-vous de modifier le nom de votre nouveau pipeline.


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


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