Ir para o conteúdo

Como personalizo meu bootstrap do AWS CDK e implanto a pilha CFNToolkit do CloudFormation?

6 minuto de leitura
0

Quero personalizar meu bootstrap do AWS Cloud Development Kit (AWS CDK) e implantar a pilha CFN do AWS CloudFormation.

Breve descrição

Para usar o AWS CDK, você deve executar um bootstrap na sua conta da AWS. A ação de bootstrap cria os recursos exigidos pelo AWS CDK na conta. É possível personalizar seu modelo de bootstrap para implementar requisitos de conformidade e segurança com as seguintes ações:

  • Adicione tags aos recursos.
  • Adicione criptografia para buckets do Amazon Simple Storage Service (Amazon S3).
  • Use nomes de bucket personalizados do S3.
  • Use buckets do S3 existentes ou aplique a entidade principal de privilégio mínimo nos perfis do AWS Identity and Access Management (AWS IAM) gerados pelo modelo de bootstrap.

O comando cdk bootstrap cria uma pilha do CloudFormation com o nome CDKToolkit. Os recursos implantados na pilha CDKToolkit do CloudFormation vêm do modelo.

Para mostrar seu modelo de bootstrap, execute o seguinte comando:

cdk bootstrap --show-template > bootstrap-template.yml

O modelo de bootstrap anterior tem os seguintes recursos:

  • Recursos como o bucket do S3
  • Chave do AWS Key Management Service (AWS KMS)
  • Perfis do IAM
  • Parâmetro SSM para versionamento

Para obter mais informações, consulte o AWS CDK Bootstrap Template for Custom Bootstrapping [Modelo de bootstrap do AWS CDK para processo de bootstrap personalizado] no site do GitHub.

É possível personalizar seu modelo de bootstrap para os seguintes casos de uso:

  • Use o AWS CDK para implantar somente os recursos que você usa.
  • Atualize ou crie um qualificador e um nome personalizados para um bucket do S3 para armazenar ativos de arquivos da aplicação AWS CDK.
  • Use um bucket do S3 existente para armazenar ativos de arquivos da aplicação AWS CDK.

Resolução

Para personalizar seu modelo de bootstrap, use um dos seguintes métodos:

Use o AWS CDK para implantar somente os recursos que você usa

O bootstrap do AWS CDK cria um perfil CloudFormationExecutionRole que o CloudFormation assume para implantar sua pilha. Em seguida, o CloudFormation usa esse perfil para implantar a partir de sua máquina local com o comando cdk deploy ou para implantar por meio de CDK pipelines do AWS para CI/CD.

Para permitir que recursos sejam criados com o AWS CDK, o CloudFormationExecutionRole tem a política arn:aws:iam:aws:policy/AdministratorAccess que concede acesso total para realizar todas as ações. Observe que essa política vai contra o princípio do privilégio mínimo. Para restringir essa política, você deve criar uma nova política e, em seguida, executar um bootstrap no AWS CDK com a nova política personalizada.

Observação: Certifique-se de revisar todos os comandos e substituir todas as instâncias de strings de exemplo pelos valores necessários.

  1. Crie uma política personalizada no IAM:

    aws iam create-policy \
      --policy-name cdkCFExecutionPolicy \
      --policy-document file://example-custom-Execution-Policy-name.json
  2. Use a política do IAM recém-criada para executar um bootstrap no AWS CDK:

    ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
    cdk bootstrap aws://$ACCOUNT_ID/example-Region \
      --cloudformation-execution-policies "arn:aws:iam::$ACCOUNT_ID:policy/example-custom-Execution-Policy-name"
  3. (Opcional) se a conta já estiver inicializada, execute novamente o comando cdk bootstrap com a nova política personalizada.

  4. (Opcional) Atualize sua política conforme exigido pela aplicação AWS CDK e crie uma nova versão da política. Novas versões da política podem ser definidas como a política padrão.

Observação: Somente cinco versões da política podem ser salvas no IAM. Exclua as versões anteriores conforme necessário se você atualizar sua política.

Atualize ou crie um qualificador e um nome personalizados para um bucket do S3 para armazenar ativos de arquivos da aplicação AWS CDK

  1. Passe sinalizadores extras para qualificador e bootstrap-bucket-name para inicializar a conta. Esses sinalizadores criam ou atualizam a pilha CDKToolkit CloudFormation com novos valores para os recursos.

    cdk bootstrap --template bootstrap-template.yml --qualifier <example-custom-qualifier-value> --bootstrap-bucket-name <example-custom-bucket-name> --profile <example-profile-name>
  2. Atualize o arquivo app.py com os seguintes valores:

    import os
    import aws_cdk as cdk
    from myproject.myproject_stack import MyprojectStack
    app = cdk.App()
    MyprojectStack(app, "MyprojectStack", synthesizer=cdk.DefaultStackSynthesizer(qualifier="<example-custom-qualifier-value>", file_assets_bucket_name="<example-custom-bucket-name>"))
    app.synth()

Observação: Se a pilha CDKToolkit falhar na implantação devido a um recurso que já existe, primeiro identifique e exclua o recurso se ele não for necessário. Em seguida, execute o bootstrap a partir da pilha do CloudFormation novamente.

Use um bucket do S3 existente para armazenar ativos de arquivos da aplicação AWS CDK

As aplicações do AWS CDK usam o nome e a localização do bucket do S3 na seção Pilha CDKToolkit AWS CloudFormation > Saídas. Para usar um bucket do S3 existente, você deve modificar o bootstrap-template.yml:

  1. Modifique o valor de Saídas para BucketName e BucketDomainName pelos detalhes do seu bucket do S3 existente:

    Outputs:
        BucketName:
            Description: The name of S3 bucket owned by the CDK toolkit stack
            Value: <example-existing-bucket-name>
        BucketDomainName:
            Description: The domain name of the S3 bucket owned by the CDK toolkit stack
            Value: <example-existing-bucket-name>.s3.<example-Region>.amazonaws.com
  2. Adicione o ARN do bucket do S3 existente nos recursos DeploymentActionRole e FilePublishingRoleDefaultPolicy do bootstrap-template.yml:

    Resources:
        DeploymentActionRole:
            Type: AWS::IAM::Role
            Properties:
              AssumeRolePolicyDocument:
                Statement:
                  - Action: sts:AssumeRole
                    Effect: Allow
                    Principal:
                      AWS:
                        Ref: AWS::AccountId
                  - Fn::If:
                      - HasTrustedAccounts
                      - Action: sts:AssumeRole
                        Effect: Allow
                        Principal:
                          AWS:
                            Ref: TrustedAccounts
                      - Ref: AWS::NoValue
              Policies:
                - PolicyDocument:
                    Statement:
                      - Sid: CliStagingBucket
                        Effect: Allow
                        Action:
                          - s3:GetObject*
                          - s3:GetBucket*
                          - s3:List*
                        Resource:
                          - Fn::Sub: ${StagingBucket.Arn}
                          - Fn::Sub: ${StagingBucket.Arn}/*
                          - arn:aws:s3:::<example-existing-bucket-name>
                          - arn:aws:s3:::<example-existing-bucket-name>/
                    Version: "example-version"
                  PolicyName: default
              RoleName:
                Fn::Sub: cdk-${Qualifier}-deploy-role-${AWS::AccountId}-${AWS::Region}
              Tags:
                - Key: aws-cdk:bootstrap-role
                  Value: deploy
        FilePublishingRoleDefaultPolicy:
            Type: AWS::IAM::Policy
            Properties:
              PolicyDocument:
                Statement:
                  - Action:
                      - s3:GetObject*
                      - s3:GetBucket*
                      - s3:GetEncryptionConfiguration
                      - s3:List*
                      - s3:DeleteObject*
                      - s3:PutObject*
                      - s3:Abort*
                    Resource:
                      - Fn::Sub: ${StagingBucket.Arn}
                      - Fn::Sub: ${StagingBucket.Arn}/*
                      - arn:aws:s3:::<example-existing-bucket-name>/
                      - arn:aws:s3:::<example-existing-bucket-name>
                    Effect: Allow
                  - Action:
                      - kms:Decrypt
                      - kms:DescribeKey
                      - kms:Encrypt
                      - kms:ReEncrypt*
                      - kms:GenerateDataKey*
                    Effect: Allow
                    Resource:
                      Fn::If:
                        - CreateNewKey
                        - Fn::Sub: ${FileAssetsBucketEncryptionKey.Arn}
                        - Fn::Sub: arn:${AWS::Partition}:kms:${AWS::Region}:${AWS::AccountId}:key/${FileAssetsBucketKmsKeyId}
                Version: "example-version"
              Roles:
                - Ref: FilePublishingRole
              PolicyName:
                Fn::Sub: cdk-${Qualifier}-file-publishing-role-default-policy-${AWS::AccountId}-${AWS::Region}
  3. Execute o comando cdk bootstrap. A pilha CDKToolkit do CloudFormation é criada ou atualizada com as alterações anteriores.

  4. Para fazer o upload dos ativos do arquivo para seu bucket do S3 existente em seu projeto, edite o sintetizador de pilha para CDK. Inclua o seguinte em seu arquivo app.py:

    MyprojectStack(app, "MyprojectStack", synthesizer=cdk.DefaultStackSynthesizer(file_assets_bucket_name="<example-existing-bucket-name>"))

Observação: É possível configurar e personalizar parâmetros extras. Para obter mais informações, consulte Personalizando o processo de bootstrap.