こんにちは、マネージドサービス部テクニカルサポート課の坂口です。
今回は re:Invent 2023 で発表された CloudFormation の Git 同期を試していきたいと思います。
Git 同期とは
Git リポジトリに保存されている CloudFormation テンプレートからスタックのデプロイが可能な機能となります。
この機能を使用することで、特定のブランチへの push 時に自動的にスタックのデプロイが可能となり、CodePipeline や GitHub Actions などの CI/CD パイプラインを構築せずに手軽にデプロイできます。
yml ファイル
今回使用する yml ファイル
AWSTemplateFormatVersion: '2010-09-09' Parameters: VpcCidrBlock: Type: String Description: CIDR block for the VPC Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidrBlock EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: VPC
補足事項
Git 同期には2種類のファイルが必要になります。
テンプレートファイル
スタックを定義する CloudFormation テンプレートファイルデプロイファイル
テンプレートファイル内のパラメータを定義したファイル
※後述の手順で作成します
設定
1.「CloudFormation スタック」ページの「スタックの作成」を押下し、「テンプレートの指定」カラムの「Git から同期」を選択し「次へ」を押下します。
2.「スタックの詳細を指定」ページで必要な項目を入力および選択し、「次へ」を押下します。
スタック名
任意のスタック名を入力します。デプロイファイルをスタック
- デプロイファイルをリポジトリに配置していない場合は「次のパラメータを使用してファイルを作成し、リポジトリに配置します。」を選択します。
- 既に配置済みの場合は「リポジトリに自分のファイルを提供しています。」を選択します。
※今回は、リポジトリに配置していない状態ですので、前者の「次のパラメータを使用してファイルを作成し、リポジトリに配置します。」を選択しております。
テンプレート定義リポジトリ
- Git 同期を行う、「リポジトリ」「ブランチ」を選択します。
- 「デプロイファイルのパス」に、デプロイファイル(パラメータを定義したファイル)のパスを入力します。
IAM ロール
Git 同期を行うためにアクセス許可が必要になります。
作成していない場合は「新しい IAM ロール」を選択し、既に作成している場合は「Existing IAM role」を選択し IAM ロールを選択してください。
※必要なアクセス許可に関しては、以下の公式ドキュメントに記載されております。
docs.aws.amazon.comデプロイファイルパラメーター
- 「テンプレートファイルパス」に、テンプレートファイル(CloudFormation テンプレートファイル)のパスを入力します。
- 「パラメータを追加」を押下し、「キー」「値」を入力します。
3.「スタックオプションの設定」ページの「アクセス許可」カラムでスタックを実行する IAM ロールを選択し画面下部の「次へ」を押下します。
4.「レビュー」ページで入力および選択に問題がない事を確認し「送信」を押下します。
5.スタック作成後「Git と同期」タブの「最新の同期イベント」カラムにて、指定したリポジトリにデプロイファイルが存在しないエラーが表示されます。
6.GitHub のリポジトリページにてデプロイファイル作成に関するプルリクエストが作成されていますので、このプルリクエストを承認およびマージします。
7.マージされると Git 同期が実施され、「プロビジョニングのステータス」が「成功しました」になります。
動作確認
以下変更をリポジトリに push してみます。
* テンプレートファイル(vpc.yml)にサブネットを追加
AWSTemplateFormatVersion: '2010-09-09' Parameters: VpcCidrBlock: Type: String Description: CIDR block for the VPC PublicSubnetCidrBlock: Type: String Description: CIDR block for the PublicSubnet Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: !Ref VpcCidrBlock EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: VPC PublicSubnet: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: !Ref PublicSubnetCidrBlock MapPublicIpOnLaunch: true AvailabilityZone: ap-northeast-1a
- デプロイファイル(vpc-deployment.yml)にサブネット用のパラメータを追加
template-file-path: vpc.yml parameters: VpcCidrBlock: 172.16.0.0/16 PublicSubnetCidrBlock: 172.16.0.0/24 tags: {}
push 後「Git 同期」タブの「最新の同期イベント」カラムを確認すると、変更セットを作成したうえで、スタックの更新を行っているのが確認できます。
実際に追加したリソースが作成されているのを確認できました。
まとめ
新規で CloudFormation スタックをデプロイする場合は使えますが、執筆時点(2023/12/5)では、既存スタックから Git 同期を設定しようとするとパラメータ指定エラーが発生しました。
なお、既存スタックの Git 同期設定時にパラメータを指定することは出来ないかつ、AWS CLI コマンドが提供されていないため、現状既存スタックはサポートされていない点に注意が必要です。
追記(2023/12/18)
Git 同期の設定前に、既存スタックに対しアクセス許可で IAM ロールを指定することで、エラーが発生せず正しく Git 同期が行われます。
なお、Git 同期を設定する際の「テンプレート定義リポジトリ」内 IAM ロールとは異なる点、ご留意ください。