Ir para o conteúdo

Como uso o CodePipeline para implantar um CloudFormation StackSet gerenciado por serviços em uma conta de administrador delegado?

5 minuto de leitura
0

Quero usar o AWS CodePipeline para implantar um AWS CloudFormation StackSet para direcionar unidades organizacionais (UOs) no AWS Organizations. Quero usar permissões gerenciadas pelo serviço para implantar a pilha em uma conta de administrador delegado.

Resolução

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Pré-requisito: ative o acesso confiável entre AWS CloudFormation StackSets e o Organizations. Para obter permissões, consulte Permissions required to enable trusted access (Permissões necessárias para ativar o acesso confiável). Você deve ser um usuário administrador na conta gerencial para ativar o acesso confiável.

Registrar a conta de administrador delegado

Para delegar uma conta de membro como conta de administrador, execute o seguinte comando register-delegated-administrator da AWS CLI:

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

Observação: substitua 111122223333 pelo ID da sua conta.

Para verificar o registro, execute o seguinte comando list-delegated-administrators da CLI:

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

Configurar o pipeline

Para criar um pipeline que permita ações do CloudFormation, é possível usar o console do Codepipeline ou a AWS CLI.

Usar o console

Para usar o console do CodePipeline para criar um pipeline, consulte Create a pipeline from static templates (Criar um pipeline a partir de modelos estáticos). Em Configurar modelo, adicione o seguinte modelo cp-template.yaml:

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

Observação: o perfil de serviço do AWS Identity and Access Management (AWS IAM) que você especificou para CallAs deve ter a permissão organizations:ListDelegatedAdministrators.

Usar a AWS CLI

Para usar a AWS CLI para criar o pipeline, consulte Criar um pipeline (CLI).

(Opcional) Criar uma pilha

Se você não usar um modelo para criar seu pipeline, deverá criar uma pilha no CloudFormation para seu pipeline.

Usar o console

Para usar o console do CloudFormation para criar uma pilha, consulte Criar uma pilha. Na seção Parâmetros, adicione as regiões AWS nas quais as instâncias do StackSet são implantadas. Por exemplo, inclua aa-example-1, aa-example-2 em TargetRegions. Certifique-se de que o perfil de serviço do IAM que você especificou para CallAs tenha a permissão organizations:ListDelegatedAdministrators.

Observação: depois de criar a pilha, espera-se que o pipeline falhe porque você não fez o upload do arquivo .zip de origem. Carregue o arquivo .zip depois de preparar os arquivos de origem.

Usar a AWS CLI

Use o mesmo caminho de arquivo usado para cp-template.yaml e, em seguida, execute o seguinte comando create-stack da AWS CLI:

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

Observação: substitua stack-name pelo nome da sua pilha, //./cp-template.yaml pelo seu caminho de arquivo e aa-example-1 e aa-example-2 pelas suas regiões.

Fazer upload de arquivos de origem no bucket do Amazon S3

Preparar os arquivos de origem

Para definir destinos de implantação, crie um arquivo .txt e nomeie-o como ou.txt. Adicione o código a seguir ao arquivo.txt:

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

Para definir os parâmetros do modelo do CloudFormation, crie um arquivo .txt e nomeie-o como parameters.txt. Adicione o código a seguir ao arquivo.txt:

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

Para criar o modelo do StackSet, crie um arquivo .txt e nomeie-o como template.yaml. Adicione o código a seguir ao arquivo.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

Implantar os arquivos de origem

Comprima os três arquivos em source.zip e, em seguida, faça o upload do arquivo .zip no diretório raiz do bucket de origem do Amazon Simple Storage Service (Amazon S3). Se o pipeline falhar e você receber o erro "Account used is not a delegated administrator", confirme que registrou a conta como administrador delegado.

Informações relacionadas

AWS CloudFormation StackSets deploy action reference (Referência de ação de implantação do AWS CloudFormation StackSets)

Como resolvo o erro ao executar a operação ListStackSets?"Account used is not a delegated administrator"

AWS OFICIALAtualizada há 3 meses