Saltar al contenido

¿Cómo personalizo el arranque de AWS CDK e implemento la pila CloudFormation de CFNToolkit?

6 minutos de lectura
0

Quiero personalizar el arranque de AWS Cloud Development Kit (AWS CDK) e implementar la pila AWS CloudFormation de CFN.

Descripción corta

Para usar AWS CDK, debes iniciar tu cuenta de AWS. La acción de arranque crea los recursos que AWS CDK necesita en la cuenta. Puedes personalizar la plantilla de arranque para implementar los requisitos de cumplimiento y seguridad con las siguientes acciones:

  • Agrega etiquetas a los recursos.
  • Agrega el cifrado para los buckets de Amazon Simple Storage Service (Amazon S3).
  • Usa nombres de bucket de S3 personalizados.
  • Utiliza los buckets de S3 existentes o aplica la entidad principal con menos privilegios en los roles de AWS Identity and Access Management (IAM) que haya generado la plantilla de arranque.

El comando cdk bootstrap crea una pila de CloudFormation con el nombre CDKToolkit. Los recursos implementados en la pila de CloudFormation CDKToolkit provienen de la plantilla.

Para mostrar la plantilla de arranque, ejecuta el siguiente comando:

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

La plantilla de arranque anterior tiene los siguientes recursos:

  • Recursos como el bucket de S3
  • Clave de AWS Key Management Service (AWS KMS)
  • Roles de IAM
  • Parámetro SSM para el control de versiones

Para más información, consulta la plantilla de arranque de AWS CDK para realizar un arranque personalizado en el sitio web de GitHub.

Puedes personalizar tu plantilla de arranque en los siguientes casos prácticos:

  • Usa AWS CDK para implementar solo los recursos que uses.
  • Actualiza o crea un calificador y un nombre personalizados para un bucket de S3 y así almacenar los activos de archivos de la aplicación AWS CDK.
  • Utiliza un bucket de S3 existente para almacenar los activos de archivos de la aplicación AWS CDK.

Resolución

Para personalizar la plantilla de arranque, utiliza uno de los métodos siguientes:

Usa AWS CDK para implementar solo los recursos que uses.

El arranque de AWS CDK crea un rol CloudFormationExecutionRole que CloudFormation asume para implementar la pila. A continuación, CloudFormation usa este rol para realizar la implementación desde tu máquina local con el comando cdk deploy o para implementar mediante canalizaciones de AWS CDK para CI/CD.

Para permitir la creación de recursos con AWS CDK, CloudFormationExecutionRole cuenta con la política arn:aws:iam:aws:policy/AdministratorAccess que otorga acceso total para realizar todas las acciones. Ten en cuenta que esta política va en contra del principio de privilegio mínimo. Para restringir esta política, debes crear una nueva y, a continuación, iniciar AWS CDK con la nueva política personalizada.

**Nota:**Asegúrate de revisar todos los comandos y reemplazar todas las instancias de cadenas de ejemplo por los valores requeridos.

  1. Crea una política personalizada en IAM:

    aws iam create-policy \
      --policy-name cdkCFExecutionPolicy \
      --policy-document file://example-custom-Execution-Policy-name.json
  2. Usa la política de IAM recién creada para iniciar 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) si la cuenta ya se ha iniciado, vuelve a ejecutar el comando cdk bootstrap con la nueva política personalizada.

  4. (Opcional) Actualiza la política según lo requiera la aplicación AWS CDK y cree una nueva versión de la política. Las nuevas versiones de la política se pueden establecer como la política predeterminada.

Nota: Solo se pueden guardar cinco versiones de políticas en IAM. Elimina las versiones anteriores según sea necesario si actualizas la política.

Actualiza o crea un calificador y un nombre personalizados para un bucket de S3 y así almacenar los activos de archivos de la aplicación AWS CDK.

  1. Pasa marcas adicionales para el calificador y bootstrap-bucket-name para iniciar la cuenta. Estas marcas crean o actualizan la pila CloudFormation de CDKToolkit con nuevos valores para los recursos.

    cdk bootstrap --template bootstrap-template.yml --qualifier <example-custom-qualifier-value> --bootstrap-bucket-name <example-custom-bucket-name> --profile <example-profile-name>
  2. Actualiza el archivo app.py con los valores siguientes:

    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()

Nota: Si la pila de CDKToolkit no se implementa debido a un recurso que ya existe, primero identifica y elimina el recurso si no es necesario. A continuación, vuelve a ejecutar el arranque desde la pila de CloudFormation.

Utiliza un bucket de S3 existente para almacenar los activos de archivos de la aplicación AWS CDK.

Las aplicaciones de AWS CDK utilizan el nombre y la ubicación del bucket de S3 de la sección Pila de AWS CloudFormation de CDKToolkit > Salidas. Para usar un bucket de S3 existente, debes modificar bootstrap-template.yml:

  1. Modifica el valor Salidas de BucketName y BucketDomainName con los detalles de tu bucket de S3 actual:

    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. Agrega el ARN del bucket de S3 existente a los recursos DeploymentActionRole y FilePublishingRoleDefaultPolicy de 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. Ejecuta el comando cdk bootstrap. La pila CloudFormation de CDKToolkit se crea o actualiza con los cambios anteriores.

  4. Para cargar los activos del archivo a tu bucket de S3 existente en tu proyecto, edita el sintetizador de pila para CDK. Incluye lo siguiente en el archivo app.py:

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

Nota: Puedes configurar y personalizar parámetros adicionales. Para obtener más información, consulta Personalización del arranque.