AWS CDK ブートストラップをカスタマイズして CFNToolkit CloudFormation スタックをデプロイする方法を教えてください。

所要時間3分
0

AWS Cloud Development Kit (AWS CDK) のブートストラップをカスタマイズして、CFN AWS CloudFormation スタックをデプロイしたいです。

簡単な説明

AWS CDK を使用するには、AWS アカウントをブートストラップする必要があります。ブートストラップアクションは、アカウントの AWS CDK に必要なリソースを作成します。ブートストラップテンプレートをカスタマイズすると、次のアクションでコンプライアンス要件とセキュリティ要件を実装できます。

  • リソースにタグを追加します。
  • Amazon Simple Storage Service (Amazon S3) バケット用の暗号化を追加します。
  • カスタム S3 バケット名を使用してください。
  • 既存の S3 バケットを使用するか、ブートストラップテンプレートによって生成された AWS Identity and Access Management (IAM) ロールに最小特権のプリンシパルを適用します。

cdk bootstrap コマンドは、CDKToolkit という名前の CloudFormation スタックを作成します。CDKToolkit CloudFormation スタックにデプロイされるリソースは、テンプレートから取得されます。

ブートストラップテンプレートを表示するには、次のコマンドを実行します。

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

前述のブートストラップテンプレートには次のリソースがあります。

  • S3 バケットなどのリソース
  • AWS Key Management Service (AWS KMS) キー
  • IAM ロール
  • バージョン管理用の SSM パラメータ

詳細については、GitHub のウェブサイトで「カスタムブートストラップ用の AWS CDK ブートストラップテンプレート」を参照してください。

ブートストラップテンプレートは、次のユースケースに合わせてカスタマイズできます。

  • AWS CDK を使用して、使用するリソースのみをデプロイする。
  • AWS CDK アプリファイルアセットを保存する S3 バケット用のカスタム修飾子と名前を更新または作成する。
  • 既存の S3 バケットを使用して AWS CDK アプリケーションファイルアセットを保持する。

解決策

ブートストラップテンプレートをカスタマイズするには、次のいずれかの方法をとります。

AWS CDK を使用して、使用するリソースのみをデプロイする

AWS CDK ブートストラップは、CloudFormationExecutionRole というロールを作成し、CloudFormation はこれを引き受けることでスタックをデプロイします。CloudFormation は次に、このロールを使用して cdk deploy コマンドでローカルマシンからデプロイするか、CI/CD 用の AWS CDK パイプライン経由でデプロイします。

CloudFormationExecutionRole には、AWS CDK でリソースを作成できるように、すべてのアクションを実行するためのフルアクセスを付与する arn:aws:iam:aws:policy/AdministratorAccess ポリシーがあります。このポリシーは、最小特権の原則に反していることに注意してください。このポリシーを制限するには、新しいポリシーを作成し、その新しいカスタムポリシーで AWS CDK をブートストラップする必要があります。

注: 必ずすべてのコマンドを確認し、サンプル文字列のすべてのインスタンスを必要な値に置き換えてください。

  1. IAM でカスタムポリシーを作成します。

    aws iam create-policy \
      --policy-name cdkCFExecutionPolicy \
      --policy-document file://example-custom-Execution-Policy-name.json
  2. 新しく作成した IAM ポリシーを使用して 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. (オプション) アカウントがすでにブートストラップされている場合は、新しいカスタムポリシーで cdk bootstrap コマンドを再実行します。

  4. (オプション) AWS CDK アプリケーションの必要に応じてポリシーを更新し、新しいポリシーバージョンを作成します。新しいポリシーバージョンをデフォルトポリシーとして設定できます。

注: IAM に保存できるポリシーバージョンは 5 つだけです。ポリシーを更新する場合は、必要に応じて以前のバージョンを削除してください。

AWS CDK アプリケーションファイルアセットを保存する S3 バケットのカスタム修飾子と名前を更新または作成する

  1. 修飾子と bootstrap-bucket-name に追加のフラグを渡し、アカウントをブートストラップします。これらのフラグは、リソースの新しい値を使用して CDKToolkit CloudFormation スタックを作成または更新します。

    cdk bootstrap --template bootstrap-template.yml --qualifier <example-custom-qualifier-value> --bootstrap-bucket-name <example-custom-bucket-name> --profile <example-profile-name>
  2. app.py ファイルを次の値で更新します。

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

注: 既に存在するリソースが原因で CDKToolkit スタックをデプロイできない場合は、まずそのリソースを特定し、不要な場合は削除します。次に、CloudFormation スタックからブートストラップを再度実行します。

既存の S3 バケットを使用して AWS CDK アプリケーションファイルアセットを保持する

AWS CDK アプリケーションは、[CDKToolkit AWS CloudFormation Stack] > [出力] セクションにある S3 バケットの名前と場所を使用します。既存の S3 バケットを使用するには、bootstrap-template.yml を変更する必要があります。

  1. BucketNameBucketDomainName[出力] 値は、既存の S3 バケットの詳細情報を使用して変更します。

    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. bootstrap-template.ymlDeploymentActionRole および FilePublishingRoleDefaultPolicy リソースに、既存の S3 バケットの ARN を追加します。

    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. cdk bootstrap コマンドを実行します。CDKToolkit CloudFormation スタックが、上記の変更によって作成または更新されます。

  4. プロジェクト内の既存の S3 バケットにファイルアセットをアップロードするには、CDK のスタックシンセサイザーを編集します。app.py ファイルに以下を含めます。

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

注: 追加のパラメータを設定およびカスタマイズできます。詳細については、「ブートストラップのカスタマイズ」を参照してください。

AWS公式
AWS公式更新しました 5ヶ月前
コメントはありません

関連するコンテンツ