Salta al contenuto

Come posso personalizzare il bootstrap del mio AWS CDK e distribuire lo stack CFNToolkit di CloudFormation?

6 minuti di lettura
0

Desidero personalizzare il bootstrap del mio Kit di sviluppo per il cloud AWS (AWS CDK) e distribuire lo stack CFN di AWS CloudFormation.

Breve descrizione

Per utilizzare AWS CDK, devi eseguire il bootstrap dell'account AWS. L'azione do bootstrap crea le risorse richieste da AWS CDK nell'account. Puoi personalizzare il modello di bootstrap per implementare i requisiti di conformità e sicurezza con le seguenti azioni:

  • Aggiungi tag alle risorse.
  • Aggiungi la crittografia per i bucket Amazon Simple Storage Service (Amazon S3).
  • Utilizza nomi di bucket S3 personalizzati.
  • Utilizza i bucket S3 esistenti o applica il principio del privilegio minimo ai ruoli AWS Identity and Access Management (AWS IAM) generati dal modello di bootstrap.

Il comando cdk bootstrap crea uno stack CloudFormation con il nome CDKToolkit. Le risorse distribuite nello stack CDKToolkit di CloudFormation provengono dal modello.

Per mostrare il modello di bootstrap, esegui questo comando:

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

Il modello di bootstrap precedente contiene le seguenti risorse:

  • Risorse come il bucket S3
  • Chiave del Servizio AWS di gestione delle chiavi (AWS KMS)
  • Ruoli IAM
  • Parametro SSM per il controllo delle versioni

Per ulteriori informazioni, consulta AWS CDK Bootstrap Template for Custom Bootstrap (Mlodello di bootstrap di AWS CDK per un bootstrap personalizzato) sul sito web GitHub.

Puoi personalizzare il modello di bootstrap per i seguenti casi d'uso:

  • Utilizza AWS CDK per distribuire solo le risorse che ti servono.
  • Aggiorna o crea un qualificatore e un nome personalizzati per un bucket S3 dove archiviare le risorse dei file delle app AWS CDK.
  • Utilizza un bucket S3 esistente per contenere le risorse dei file delle app AWS CDK.

Risoluzione

Per personalizzare il modello di bootstrap, utilizza uno dei seguenti metodi:

Utilizza AWS CDK per distribuire solo le risorse che ti servono

Il bootstrap di AWS CDK crea un ruolo CloudFormationExecutionRole che CloudFormation assume per distribuire lo stack. CloudFormation utilizza quindi questo ruolo per eseguire la distribuzione dal computer locale con il comando cdk deploy o tramite pipeline AWS CDK per CI/CD.

Per consentire la creazione di risorse con AWS CDK, il ruolo CloudFormationExecutionRole ha la policy arn:aws:iam:aws:policy/AdministratorAccess che garantisce l'accesso completo per eseguire tutte le azioni. Nota: questa policy è contraria al principio del privilegio minimo. Per limitare questa policy, devi creare una nuova policy e avviare AWS CDK con la nuova policy personalizzata.

Nota: assicurati di esaminare tutti i comandi e sostituire tutte le istanze degli esempi di stringa con i valori richiesti.

  1. Crea una policy personalizzata in IAM:

    aws iam create-policy \
      --policy-name cdkCFExecutionPolicy \
      --policy-document file://example-custom-Execution-Policy-name.json
  2. Utilizza la policy IAM appena creata per avviare 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. (Facoltativo) se il bootstrap dell'account è già stato effettuato, esegui nuovamente il comando cdk bootstrap con la nuova policy personalizzata.

  4. (Facoltativo) Aggiorna la policy come richiesto dall'applicazione AWS CDK e crea una nuova versione della policy. Le nuove versioni della policy possono essere impostate come policy predefinita.

Nota: in IAM possono essere salvate solo cinque versioni della policy. Nel caso in cui aggiorni la policy, elimina le versioni precedenti se necessario.

Aggiorna o crea un qualificatore e un nome personalizzati per un bucket S3 dove archiviare le risorse dei file delle app AWS CDK

  1. Passa i flag aggiuntivi per il qualificatore e bootstrap-bucket-name per avviare l'account. I flag creano o aggiornano lo stack CDKToolkit di CloudFormation con nuovi valori per le risorse.

    cdk bootstrap --template bootstrap-template.yml --qualifier <example-custom-qualifier-value> --bootstrap-bucket-name <example-custom-bucket-name> --profile <example-profile-name>
  2. Aggiorna il file app.py con i seguenti valori:

    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: se lo stack CDKToolkit non viene distribuito a causa di una risorsa già esistente, identifica ed elimina prima la risorsa se non è necessaria. Quindi esegui nuovamente il bootstrap dallo stack di CloudFormation.

Utilizza un bucket S3 esistente per conservare le risorse dei file delle app AWS CDK

Le applicazioni AWS CDK utilizzano il nome e la posizione del bucket S3 dalla sezione CDKToolkit AWS CloudFormation Stack > Outputs. Per utilizzare un bucket S3 esistente, devi modificare bootstrap-template.yml:

  1. Modifica il valore Outputs per BucketName e BucketDomainName con i dettagli del bucket S3 esistenti:

    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. Aggiungi l'ARN del bucket S3 esistente nelle risorse DeploymentActionRole e FilePublishingRoleDefaultPolicy di 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. Esegui il comando cdk bootstrap. Lo stack CDKToolkit di CloudFormation viene creato o aggiornato con le modifiche precedenti.

  4. Per caricare le risorse dei file nel bucket S3 esistente all'interno del progetto, modifica lo stack synthesizer per CDK. Includi quanto segue nel file app.py:

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

Nota: puoi configurare e personalizzare parametri aggiuntivi. Per ulteriori informazioni sulla personalizzazione del bootstrap, consulta Avvio di AWS CDK.