Passer au contenu

Comment utiliser CodePipeline pour déployer un CloudFormation StackSet géré par des services dans un compte administrateur délégué ?

Lecture de 5 minute(s)
0

Je souhaite utiliser AWS CodePipeline pour déployer un StackSet AWS CloudFormation afin de cibler les unités organisationnelles (UO) dans AWS Organizations. Je souhaite utiliser les autorisations gérées par les services pour déployer la pile dans un compte d'administrateur délégué.

Résolution

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

Prérequis : Activez l'accès autorisé entre AWS CloudFormation StackSets et Organizations. Pour les autorisations, consultez la section Autorisations requises pour activer l’accès autorisé. Vous devez être un utilisateur administrateur du compte de gestion pour activer l'accès autorisé.

Enregistrer le compte d'administrateur délégué

Pour déléguer un compte de membre en tant que compte d'administrateur, exécutez la commande register-delegated-administrator de l’AWS CLI suivante :

aws organizations register-delegated-administrator \
  --service-principal=member.org.stacksets.cloudformation.amazonaws.com \
  --account-id="111122223333"

Remarque : Remplacez 111122223333 par votre ID de compte.

Pour vérifier l'enregistrement, exécutez la commande CLI list-delegated-administrators suivante :

aws organizations list-delegated-administrators \
    --service-principal=member.org.stacksets.cloudformation.amazonaws.com

Configurer le pipeline

Pour créer un pipeline qui autorise les actions CloudFormation, vous pouvez utiliser la console Codepipeline ou l'AWS CLI.

Utiliser la console

Pour utiliser la console CodePipeline afin de créer un pipeline, consultez la section Créer un pipeline à partir de modèles statiques. Pour Configurer le modèle, ajoutez le modèle cp-template.yaml suivant :

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  TargetRegions:
    Type: String

Resources:
  Bucket:
    Type: "AWS::S3::Bucket"
    DeletionPolicy: Retain
    Properties:
      VersioningConfiguration:
        Status: Enabled

  ServiceRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - codepipeline.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: CodePipelinePermissions
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetObject
                  - s3:GetObjectVersion
                  - s3:GetBucketVersioning
                  - s3:PutObject
                  - s3:PutObjectAcl
                Resource:
                  - !Sub arn:aws:s3:::${Bucket}
                  - !Sub arn:aws:s3:::${Bucket}/*
              - Effect: Allow
                Action:
                  - cloudformation:CreateStackSet
                  - cloudformation:UpdateStackSet
                  - cloudformation:DeleteStackSet
                  - cloudformation:DescribeStackSet
                  - cloudformation:DescribeStackSetOperation
                  - cloudformation:ListStackInstances
                  - cloudformation:CreateStackInstances
                Resource: "*"
              - Effect: Allow
                Action:
                  - organizations:ListDelegatedAdministrators
                Resource: "*"

  Pipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      RoleArn: !GetAtt ServiceRole.Arn
      ArtifactStore:
        Type: S3
        Location: !Ref Bucket
      Stages:
        - Name: Source
          Actions:
            - Name: SourceAction
              ActionTypeId:
                Category: Source
                Owner: AWS
                Provider: S3
                Version: "1"
              Configuration:
                S3Bucket: !Ref Bucket
                S3ObjectKey: "source.zip"
                PollForSourceChanges: false
              OutputArtifacts:
                - Name: SourceArtifact
        - Name: Deploy
          Actions:
            - Name: ServiceManaged-SS
              RunOrder: "1"
              ActionTypeId:
                Category: Deploy
                Owner: AWS
                Provider: CloudFormationStackSet
                Version: "1"
              Configuration:
                PermissionModel: SERVICE_MANAGED
                CallAs: DELEGATED_ADMIN
                OrganizationsAutoDeployment: Enabled
                Regions: !Ref TargetRegions
                StackSetName: !Sub codepipeline-deployed-cfn-${AWS::AccountId}-stackset
                MaxConcurrentPercentage: "50"
                FailureTolerancePercentage: "100"
                ConcurrencyMode: SOFT_FAILURE_TOLERANCE
                Capabilities: CAPABILITY_NAMED_IAM,CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND
                DeploymentTargets: "SourceArtifact::ou.txt"
                TemplatePath: "SourceArtifact::template.yaml"
                Parameters: "SourceArtifact::parameters.txt"
              InputArtifacts:
                - Name: SourceArtifact

Remarque : Le rôle de service Gestion des identités et des accès AWS (AWS IAM) que vous avez spécifié pour CallAs doit disposer de l'autorisation organizations:ListDelegatedAdministrators.

Utiliser l’AWS CLI

Pour utiliser l'AWS CLI afin de créer le pipeline, consultez la section Créer un pipeline (CLI).

(Facultatif) Créer une pile

Si vous n'utilisez pas de modèle pour créer votre pipeline, vous devez créer une pile dans CloudFormation pour votre pipeline.

Utiliser la console

Pour utiliser la console CloudFormation afin de créer une pile, consultez la section Création d'une pile. Dans la section Paramètres, ajoutez les régions AWS dans lesquelles les instances StackSet sont déployées. Par exemple, incluez aa-example-1, aa-example-2 dans TargetRegions. Assurez-vous que le rôle de service IAM que vous avez spécifié pour CallAs dispose de l'autorisation organizations:ListDelegatedAdministrators.

Remarque : Une fois la pile créée, on s'attend à ce que le pipeline échoue car vous n'avez pas chargé le fichier .zip source. Vous chargez le fichier .zip après avoir préparé les fichiers source.

Utiliser l’AWS CLI

Utilisez le même chemin de fichier que celui que vous avez utilisé pour cp-template.yaml, puis exécutez la commande create-stack de l’AWS CLI suivante :

aws cloudformation create-stack \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM \
  --template-body file://cp-template.yaml \
  --parameters ParameterKey=TargetRegions,ParameterValue=aa-example-1\\,aa-example-2

Remarque : Remplacez stack-name par le nom de votre pile, //./cp-template.yaml par le chemin de votre fichier et aa-example-1 et aa-example-2 par vos régions.

Charger les fichiers source dans votre compartiment Amazon S3

Préparer les fichiers source

Pour définir les cibles de déploiement, créez un fichier .txt et nommez-le ou.txt. Ajoutez le code suivant au fichier .txt :

["ou-xrop-xxxxxxxx","ou-xrop-yyyyyyyy"]

Pour définir les paramètres du modèle CloudFormation, créez un fichier .txt et nommez-le parameters.txt. Ajoutez le code suivant au fichier .txt :

[
  {
    "ParameterKey": "VersioningStatus",
    "ParameterValue": "Enabled"
  }
]

Pour créer le modèle StackSet, créez un fichier .txt et nommez-le template.yaml. Ajoutez le code suivant au fichier .txt :

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  VersioningStatus:
    Type: String
    Default: Suspended
    AllowedValues:
      - Enabled
      - Suspended

Resources:
  S3Bucket:
    Type: 'AWS::S3::Bucket'
    DeletionPolicy: Delete
    Properties:
      VersioningConfiguration:
        Status: !Ref VersioningStatus

Déployer les fichiers source

Compressez les trois fichiers dans source.zip, puis chargez le fichier .zip dans le répertoire racine du compartiment Amazon Simple Storage Service (Amazon S3) source. Si le pipeline échoue et que vous obtenez le message d'erreur "Account used is not a delegated administrator", confirmez que vous avez enregistré le compte en tant qu'administrateur délégué.

Informations connexes

Référence de l’action de déploiement d'AWS CloudFormation StackSets

Comment résoudre l'erreur lorsque j'exécute l'opération ListStackSets ?"Account used is not a delegated administrator"

AWS OFFICIELA mis à jour il y a 3 mois