cdk bootstrapってなんだ?

cdk bootstrapってなんだ?
この記事をシェアする

はじめに

こんにちは、スカイアーチHRソリューションズのsugawaraです。

AWS CDKを利用する方なら誰しも一度は実行したことのあるcdk bootstrapコマンド。最初に実行するだけなので、これまであまり意識してきませんでした。

ただ、改めてお客様環境でCDKを利用する上で、このコマンドは一体何をしているんだ?と気になったのでまとめてみました。

概要

まずはDeveloper Guideからの引用です。

Bootstrapping is the process of preparing an environment for deployment. Bootstrapping is a one-time action that you must perform for every environment that you deploy resources into.

「ブートストラッピングは、デプロイメントのための環境を準備するプロセスです。ブートストラッピングは、リソースをデプロイするすべての環境に対して一度だけ実行しなければならないアクションです。」

したがって、本番/検証/開発環境など異なるアカウントを利用する場合には、各環境の初回デプロイ時に必ず実行する必要があります。

下記は引き続き引用です。

Bootstrapping provisions resources in your environment such as an Amazon Simple Storage Service (Amazon S3) bucket for storing files and AWS Identity and Access Management (IAM) roles that grant permissions needed to perform deployments. These resources get provisioned in an AWS CloudFormation stack, called the bootstrap stack. It is usually named CDKToolkit. Like any AWS CloudFormation stack, it will appear in the AWS CloudFormation console of your environment once it has been deployed.

「ブートストラッピングは、ファイルを保存するためのAmazon Simple Storage Service(Amazon S3)バケットや、デプロイメントを実行するために必要な権限を付与するAWS Identity and Access Management(IAM)ロールなど、環境内のリソースを準備します。これらのリソースは、ブートストラップスタックと呼ばれるAWS CloudFormationスタック内にプロビジョニングされます。通常、CDKToolkitと名付けられます。他のAWS CloudFormationスタックと同様に、デプロイされた後は環境のAWS CloudFormationコンソールに表示されます。」

つまり、cdk bootstrapコマンドでブートストラップすることにより、デプロイ時に必要なリソースをCDKToolkitというスタック名で自動作成してくれるわけですね。

では、一体どういったリソースが作成されるのでしょうか?

自動作成されるリソース

CDKToolkitスタック内で自動作成されるリソースはIAMロールやポリシー、S3バケットなどです。下記にリストアップします。

  • DeploymentActionRole
  • LookupRole
  • CloudFormationExecutionRole
  • ImagePublishingRole
    • ImagePublishingRoleDefaultPolicy
  • FilePublishingRole
    • FilePublishingRoleDefaultPolicy
  • ContainerAssetsRepository
  • StagingBucket
  • StagingBucketPolicy
  • CdkBootstrapVersion

作成されるリソースについては、CloudFormationコンソール内のCDKToolkitスタックのリソースタブから確認することができます。

次に、これらのリソースがそれぞれ何をやっているのかを簡単に見ていきます。

DeploymentActionRole

このIAMロールはcdkコマンド実行時に利用されます。例えば、CloudFormationのスタックや変更セットの作成・更新・削除、デプロイ用アーティファクトをS3へPUTやGETなどです。

また、CDKはクロスアカウントデプロイをサポートしているため、ソースアカウントとターゲットアカウントを指定することも可能です。(※信頼関係の設定が必要)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudformation:CreateChangeSet",
                "cloudformation:DeleteChangeSet",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStacks",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:CreateStack",
                "cloudformation:UpdateStack"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "CloudFormationPermissions"
        },
        {
            "Condition": {
                "StringNotEquals": {
                    "s3:ResourceAccount": "XXXXXXXXXXXX"
                }
            },
            "Action": [
                "s3:GetObject*",
                "s3:GetBucket*",
                "s3:List*",
                "s3:Abort*",
                "s3:DeleteObject*",
                "s3:PutObject*"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "PipelineCrossAccountArtifactsBucket"
        },
        {
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "s3.ap-northeast-1.amazonaws.com"
                }
            },
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:Encrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "PipelineCrossAccountArtifactsKey"
        },
        {
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::XXXXXXXXXXXX:role/cdk-hnb659fds-cfn-exec-role-XXXXXXXXXXXX-ap-northeast-1",
            "Effect": "Allow"
        },
        {
            "Action": [
                "cloudformation:DescribeStackEvents",
                "cloudformation:GetTemplate",
                "cloudformation:DeleteStack",
                "cloudformation:UpdateTerminationProtection",
                "sts:GetCallerIdentity",
                "cloudformation:GetTemplateSummary"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Sid": "CliPermissions"
        },
        {
            "Action": [
                "s3:GetObject*",
                "s3:GetBucket*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::cdk-hnb659fds-assets-XXXXXXXXXXXX-ap-northeast-1",
                "arn:aws:s3:::cdk-hnb659fds-assets-XXXXXXXXXXXX-ap-northeast-1/*"
            ],
            "Effect": "Allow",
            "Sid": "CliStagingBucket"
        },
        {
            "Action": [
                "ssm:GetParameter"
            ],
            "Resource": [
                "arn:aws:ssm:ap-northeast-1:XXXXXXXXXXXX:parameter/cdk-bootstrap/hnb659fds/version"
            ],
            "Effect": "Allow",
            "Sid": "ReadVersion"
        }
    ]
}

LookupRole

こちらのIAMロールは既存リソースの参照に使われるfromLookup()などのメソッドを実行するためのロールです。AWS管理ポリシーであるReadOnlyPolicyがアタッチされており、基本的にはすべてのリソースのRead権限が与えられています。ただし、下記のように別のポリシーもアタッチされており、明示的にDenyすることでKMSのシークレットは見れないようです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Effect": "Deny",
            "Sid": "DontReadSecrets"
        }
    ]
}

CloudFormationExecutionRole

このIAMロールにはAWS管理ポリシーのAdministratorAccessがデフォルトで付与されています。下記の信頼関係にあるように、こちらはCloudFormationに対するアドミン権限となります。したがって、CloudFormationはどんなリソースも作成や更新、削除が可能となっています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudformation.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

ImagePublishingRole

後述するContainerAssetsRepositoryで作成されるECRへコンテナイメージをプッシュするためのIAMロールです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:BatchCheckLayerAvailability",
                "ecr:DescribeRepositories",
                "ecr:DescribeImages",
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": "arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/cdk-hnb659fds-container-assets-XXXXXXXXXXXX-ap-northeast-1",
            "Effect": "Allow"
        },
        {
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

FilePublishingRole

後述するStagingBucketで作成されるS3バケットへアーティファクトをアップロードなどするためのIAMロールです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject*",
                "s3:GetBucket*",
                "s3:GetEncryptionConfiguration",
                "s3:List*",
                "s3:DeleteObject*",
                "s3:PutObject*",
                "s3:Abort*"
            ],
            "Resource": [
                "arn:aws:s3:::cdk-hnb659fds-assets-XXXXXXXXXXXX-ap-northeast-1",
                "arn:aws:s3:::cdk-hnb659fds-assets-XXXXXXXXXXXX-ap-northeast-1/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:Encrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*"
            ],
            "Resource": "arn:aws:kms:ap-northeast-1:XXXXXXXXXXXX:key/AWS_MANAGED_KEY",
            "Effect": "Allow"
        }
    ]
}

ContainerAssetsRepository

こちらは自動作成されるECRリポジトリです。もしECSやDockerなどを利用する場合、作成されたECRにコンテナイメージが格納されます。逆に、特にコンテナを利用しない場合にはリポジトリのみ作成され、中身は空のままです。

なお、デフォルトでスキャン頻度は手動、タグのイミュータビリティは有効、暗号化タイプはAES-256という設定になっています。

StagingBucket

こちらは自動作成されるS3バケットです。CDKのデプロイなどで作成されるアーティファクトはすべてこのS3バケットにアップロードされます。具体的には、CloudFormationテンプレートやLambdaのソースコードのzipファイルなどです。

なお、デフォルトでバージョニングは有効となっています。

CdkBootstrapVersion

ブートストラップのバージョンを管理するSystems Manager Parameter Storeです。定期的なブートストラップテンプレートの更新があり、こちらでトラッキングが可能です。公式ドキュメントでは、2024年2月21日現在、テンプレートバージョンは19が最新のようです。

おわりに

cdk bootstrapコマンドを実行すると、知らないうちに色々なリソースが作成されています。CDKでAWSリソースを構築していく場合には、具体的に何が作成されているのかは予め知っておいた方がいいでしょう。

また、公式ドキュメントによると、ブーストラップテンプレートのカスタマイズができるようです。今後このあたりも深掘りしていけたらなと思います。

この記事をシェアする
著者:sugawara
元高校英語教員。2023 Japan AWS All Certifications Engineers。IaCやCI/CD、Platform Engineeringに興味あり。