mazyu36の日記

某SIer所属のクラウドエンジニアのブログ

AWS CDKでCloudFormationのGit Sync機能を使用してデプロイする

CloudFormationのGit Sync機能が追加されました。

aws.amazon.com

こちらをAWS CDKで試してみたので、やり方などまとめます。

※CDKでできないかなーと試している時に、Xで以下のポスト見かけて参考にさせていただきました。感謝。

目次

CloudFormationのGit Sync(Git連携)とは

一言で言うと「GitにあるCloudFormationテンプレートをpullして、デプロイしてくれる機能」です。

これの何が嬉しいかというと、CloudFormationのデプロイの権限をAWS外に出す必要がなくなる点です。デプロイは強力な権限なので、認証情報を外に出したくない時があります。

この機能によりデプロに関する権限をAWSアカウント外に出さずに、AWSアカウント内に閉じた形で実行できます。

CDKでGit Syncを行うために必要なもの

以下になります。1,2はCDKの使用有無によらずCloudFormationでGit Syncを行うために必要なもの、3はCDKで行う場合に必要なものです。

  1. デプロイファイル:Git Syncによるデプロイの設定を記述するファイル。CloudFormationのGit Sync設定の過程で自動作成されます(詳細後述)
  2. CloudFormationテンプレート:cdk synthで作成されたものを使います。
  3. 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を使用してアップロードを行います。

github.com

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.jsoncdk 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を使用したパイプラインを構築するとともに、使い所を考えてみたいとと思います。