Direkt zum Inhalt

Wie passe ich meinen AWS CDK-Bootstrap an und stelle den CFNToolkit CloudFormation-Stack bereit?

Lesedauer: 5 Minute
0

Ich möchte meinen AWS Cloud Development Kit (AWS CDK)-Bootstrap anpassen und den CFN AWS CloudFormation-Stack bereitstellen.

Kurzbeschreibung

Um AWS CDK verwenden zu können, musst du das AWS-Konto booten. Die Bootstrap-Aktion erstellt die Ressourcen, die AWS CDK für das Konto benötigt. Du kannst die Bootstrap-Vorlage mit den folgenden Aktionen anpassen, um die Compliance- und Sicherheitsanforderungen zu implementieren:

  • Füge den Ressourcen Stichwörter hinzu.
  • Füge Verschlüsselung für Amazon Simple Storage Service (Amazon S3)-Buckets hinzu.
  • Verwende benutzerdefinierte S3-Bucket-Namen.
  • Verwende vorhandene S3-Buckets oder wende den Prinzipal mit den geringsten Rechten auf die von der Bootstrap-Vorlage generierten AWS Identity and Access Management (IAM)-Rollen an.

Der Befehl cdk bootstrap erstellt einen CloudFormation-Stack mit dem Namen cdkToolkit. Die im CDKToolkit CloudFormation-Stack bereitgestellten Ressourcen stammen aus der Vorlage.

Führe den folgenden Befehl aus, um die Bootstrap-Vorlage anzuzeigen:

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

Die vorherige Bootstrap-Vorlage enthält die folgenden Ressourcen:

  • Ressourcen wie der S3-Bucket
  • AWS Key Management Service (AWS KMS)-Richtlinie
  • IAM-Rollen
  • SSM-Parameter für die Versionsverwaltung

Weitere Informationen findest du unter AWS CDK-Bootstrap-Vorlage für benutzerdefiniertes Bootstrapping auf der GitHub-Website.

Du kannst die Bootstrap-Vorlage für die folgenden Anwendungsfälle anpassen:

  • Verwende AWS CDK, um nur die Ressourcen bereitzustellen, die du verwendest.
  • Aktualisiere oder erstelle einen benutzerdefinierten Qualifizierer und einen Namen für einen S3-Bucket zum Speichern von AWS CDK-App-Datei-Komponenten.
  • Verwende einen vorhandenen S3-Bucket zum Speichern von AWS CDK-App-Datei-Komponenten.

Lösung

Verwende eine der folgenden Methoden, um die Bootstrap-Vorlage anzupassen:

AWS CDK verwenden, um nur die Ressourcen bereitzustellen, die du verwendest

AWS CDK-Bootstrap erstellt eine Rolle CloudFormationExecutionRole, die CloudFormation für die Bereitstellung der Stacks annimmt. CloudFormation verwendet diese Rolle dann für die Bereitstellung vom lokalen Computer aus mit dem Befehl cdk deploy oder für die Bereitstellung über AWS CDK Pipelines für CI/CD.

Damit Ressourcen mit AWS CDK erstellt werden können, verfügt CloudFormationExecutionRole über die Richtlinie arn:aws:iam:aws:policy/AdministratorAccess, die vollen Zugriff auf alle Aktionen gewährt. Beachte, dass diese Richtlinie gegen das Prinzip der geringsten Privilegien verstößt. Um diese Richtlinie einzuschränken, musst du eine neue Richtlinie erstellen und dann AWS CDK mit der neuen benutzerdefinierten Richtlinie booten.

Hinweis: Stelle sicher, dass du alle Befehle überprüfst und alle Instances von Beispiel-Zeichenfolgen durch die erforderlichen Werte ersetzen.

  1. Erstelle eine benutzerdefinierte Richtlinie in IAM:

    aws iam create-policy \
      --policy-name cdkCFExecutionPolicy \
      --policy-document file://example-custom-Execution-Policy-name.json
  2. Verwende die neu erstellte IAM-Richtlinie, um das AWS CDK zu laden:

    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. (Optional) Wenn das Konto bereits geladen ist, führe den Befehl cdk bootstrap erneut mit der neuen benutzerdefinierten Richtlinie aus.

  4. (Optional) Aktualisiere die Richtlinie gemäß den Anforderungen der AWS CDK-Anwendung und erstelle eine neue Richtlinienversion. Neue Richtlinienversionen können als Standardrichtlinie festgelegt werden.

Hinweis: Nur fünf Richtlinienversionen können in IAM gespeichert werden. Lösche bei Bedarf frühere Versionen, wenn du die Richtlinie aktualisierst.

Einen benutzerdefinierten Qualifizierer und einen Namen für einen S3-Bucket zum Speichern von AWS CDK-App-Datei-Komponenten aktualisiere oder erstellen

  1. Übergebe zusätzliche Flags für Qualifizierer und bootstrap-bucket-name, um das Konto zu laden. Diese Flags erstellen oder aktualisieren den CDKToolkit CloudFormation-Stack mit neuen Werten für die Ressourcen.

    cdk bootstrap --template bootstrap-template.yml --qualifier <example-custom-qualifier-value> --bootstrap-bucket-name <example-custom-bucket-name> --profile <example-profile-name>
  2. Aktualisiere die Datei app.py mit den folgenden Werten:

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

Hinweis: Wenn der CDKToolkit-Stack aufgrund einer bereits vorhandenen Ressource nicht bereitgestellt werden kann, identifiziere zuerst die Ressource und lösche sie, falls sie nicht benötigt wird. Führe dann den Bootstrap erneut vom CloudFormation-Stack aus durch.

Einen vorhandenen S3-Bucket zum Speichern von AWS CDK-App-Dateiressourcen verwenden

AWS CDK-Anwendungen verwenden den Namen und Speicherort des S3-Buckets aus dem Abschnitt CDKToolkit AWS CloudFormation-Stack > Ausgaben. Um einen vorhandenen S3-Bucket zu verwenden, musst du bootstrap-template.yml ändern:

  1. Ändere den Wert Ausgaben für BucketName und BucketDomainName mit den vorhandenen S3-Bucket-Details:

    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. Fügeden ARN des vorhandenen S3-Buckets in die Ressourcen DeploymentActionRole und FilePublishingRoleDefaultPolicy der bootstrap-template.yml ein:

    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. Führe den Befehl cdk bootstrap aus. Der CDKToolkit CloudFormation-Stack wird mit den vorherigen Änderungen erstellt oder aktualisiert.

  4. Um die Datei-Komponenten in den vorhandenen S3-Bucket innerhalb des Projekts hochzuladen, bearbeite den Stack-Synthesizer für CDK. Füge Folgendes in die Datei app.py ein:

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

Hinweis: Du kannst zusätzliche Parameter konfigurieren und anpassen. Weitere Informationen findest du unter Bootstrapping anpassen.