CloudFormationのGit Sync機能が追加されました。
こちらをAWS CDKで試してみたので、やり方などまとめます。
※CDKでできないかなーと試している時に、Xで以下のポスト見かけて参考にさせていただきました。感謝。
CloudFormation git sync with AWS CDK?
— Pahud Hsieh (@pahudnet) 2023年11月28日
1. link your cfn stack to the git repo
2. prepare your CDK app
3. `cdk synth` to synthesize the template
4. `cdk-assets publish` to upload your assets to S3/ECR
5. commit your json template to trigger git sync deploy
That's it! pic.twitter.com/BEDbgdXgG2
目次
CloudFormationのGit Sync(Git連携)とは
一言で言うと「GitにあるCloudFormationテンプレートをpullして、デプロイしてくれる機能」です。
これの何が嬉しいかというと、CloudFormationのデプロイの権限をAWS外に出す必要がなくなる点です。デプロイは強力な権限なので、認証情報を外に出したくない時があります。
この機能によりデプロに関する権限をAWSアカウント外に出さずに、AWSアカウント内に閉じた形で実行できます。
CDKでGit Syncを行うために必要なもの
以下になります。1,2はCDKの使用有無によらずCloudFormationでGit Syncを行うために必要なもの、3はCDKで行う場合に必要なものです。
- デプロイファイル:Git Syncによるデプロイの設定を記述するファイル。CloudFormationのGit Sync設定の過程で自動作成されます(詳細後述)
- CloudFormationテンプレート:
cdk synth
で作成されたものを使います。 - Assets:LambdaやDockerイメージを使用する場合は必要。あらかじめS3やECRにアップロードが必要になります(Assetsがない場合は不要)
CDKでGit Syncを使う
実際にやってみます。
1. CDKプロジェクトの作成および実装
cdk init
でプロジェクトを作成します。
初期生成時に実装されているSQSのキューに、Lambda関数を追加しています。
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as sqs from 'aws-cdk-lib/aws-sqs'; import { aws_lambda as lambda } from 'aws-cdk-lib'; import * as path from 'path'; export class CdkGitTestStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const queue = new sqs.Queue(this, 'CdkGitTestQueue', { visibilityTimeout: cdk.Duration.seconds(300) }); // Lambda functionを追加 new lambda.Function(this, 'LambdaFunction', { runtime: lambda.Runtime.PYTHON_3_11, handler: 'function.handler', code: lambda.Code.fromAsset(path.join(__dirname, '../lambda')), }) } }
2. Gitリポジトリを作成してPush
Git Sync用のリポジトリを作成し、上記をPushします。
3. CloudFormationでGit Syncの設定
CloudFormationでGit Syncの設定を行なっていきます。
「テンプレート定義リポジトリ」の設定
2で作成したGitリポジトリを設定していきます。
一点注意が必要なのは「デプロイファイルのパス」です。ここに記載したパスにGit Sync用の設定ファイルが生成されます。
今回はCDKプロジェクトのcfn_git_sync
ディレクトリ配下に一連のファイルを格納する方針にしたいと思います。
そのためcfn_git_sync/deployment.yaml
にしました。
「デプロイファイルパラメーター」の設定
CloudFormationテンプレートを格納するGitリポジトリ上のパスを設定します。
ここではcfn_git_sync/template.yaml
としました。後ほどこのパスにcdk synth
でテンプレートを生成します。
「パラメータ」はCloudFormationのパラメータに設定できるものですが、今回は使用しないので未設定にします。
上記以外の設定
IAMロールの設定などがありますが、この辺りは通常のCloudFormationの設定と同様に実施していきます。
Git Syncの設定完了後に処理が終わると、以下のようにステータスがCREATE_COMPLETE
になります。
4. Pullリクエストの確認およびマージ
Git Syncの設定が終わると対象のGitHubリポジトリにおいて、デプロイファイルを追加するPullリクエストが自動生成されます。
実際にGitリポジトリを見に行くとPullリクエストが生成されています。
3で設定した通りcfn_git_sync/deployment.yaml
のデプロイファイルを作成するPullリクエストになっています。
こちらをマージします。
5. CDKプロジェクト上の操作
CDKプロジェクトを操作して、Assetsのpublish、およびCloudFormationテンプレートの生成・GitリポジトリへのPushを行います。
git pullでデプロイファイルを取得
4で作成されたデプロイファイルを取得しておきます。
cdk synthでCloudFormationテンプレートを生成
今回はyamlで生成してみます。以下のように3で設定したCloudFormationテンプレートのパスを指定する形で生成します。
cdk synth > cfn_git_sync/template.yaml
※yamlではなく、cdk synth
で生成されるJSONのテンプレートでも問題なく使用可能です。その場合は3のCloudFormationの設定でJSONのテンプレートのパスを指定します。
cdk-assetsでAssetsをPublish
今回Lambdaが含まれているため、Assetsのアップロードを行います(S3にアップロードする形)。
ここではcdk-assets
を使用してアップロードを行います。
2023/11/29時点ではCDKデフォルトでは使用できず、npm install
した上で使う必要があります。
# cdk-assetsをインストール npm i cdk-assets # cdk-assetsでAssetsをpublish npx cdk-assets publish -p cdk.out/CdkGitTestStack.assets.json
cdk-assets
でpublishする際に使用するassets.json
はcdk synth
で、cdk.out
配下に生成されるので、それをそのまま使えば良いです。
以下のように進行状況が100%になったら完了です。
info : [0%] start: Publishing 5ed2aed96e2bf17f2a362e4826dcf07dc29ed1c1643a0adcbd8a5e1210ad7490:current_account-current_region info : [50%] success: Published 5ed2aed96e2bf17f2a362e4826dcf07dc29ed1c1643a0adcbd8a5e1210ad7490:current_account-current_region info : [50%] start: Publishing cb6b17a51cf5c3c7d5e91b4df7ad4c5eb467e8a3cd5f1956f76c472d35fd5cae:current_account-current_region info : [100%] success: Published cb6b17a51cf5c3c7d5e91b4df7ad4c5eb467e8a3cd5f1956f76c472d35fd5cae:current_account-current_region
GitリポジトリにCloudFormationテンプレートをPush
ここまでで事前設定は終わりました。CDKプロジェクトの最終系を確認します(一部削っています)
. ├── cdk.json ├── cdk.out │ ├── CdkGitTestStack.assets.json # cdk-assets publishで使用するassets.json │ ├── CdkGitTestStack.template.json # CloudFormationテンプレート(今回は未使用) │ ├── cdk.out │ ├── manifest.json │ └── tree.json ├── cfn_git_sync # git sync関係のファイルを格納するディレクトリ │ ├── deployment.yaml # Git Syncの設定により自動生成されたデプロイファイル │ └── template.yaml # 今回Git Syncで使用するCloudFormationテンプレート ├── lambda │ └── function.py # Lambdaの実装コード ├── lib │ └── cdk_git_test-stack.ts ├── node_modules ├── package-lock.json ├── package.json └── tsconfig.json
ここまでできたらGitリポジトリにPushします。
6. CloudFormation上のデプロイ
Git SyncによりCloudFormationでGitリポジトリ上のテンプレート更新を検知しデプロイが開始されます。
Stackの生成・更新が完了しました。
CDKでテンプレートを生成しているためConstruct treeビューでリソースを確認できます。
以上でCDKを使用したGit Syncの動作確認ができました。
おわりに
Git Syncを使うことでCDKのデプロイの選択肢が1つ増えました。
次回はGitHub Actionsを使用してGit Syncを使用したパイプラインを構築するとともに、使い所を考えてみたいとと思います。