こんにちは、なんどです。
パート1に引き続き、CloudFormationのGit同期機能を使ってみます。
GitHubのリポジトリにファイルを配置する
それでは、CloudFormationのスタック作成時に指定した 「test-gitconnection.yaml」 というファイルをリポジトリに配置してみましょう。
一点、リポジトリ作成時にパブリック公開しないように気を付けてください。知らないうちにあなたのAWS環境にリソースが作成されて、数百万円の請求が来てしまうかも。
配置するファイルは以下の内容で作成しました。
基本的なVPCを作成するのみの簡素なものです。
AWSTemplateFormatVersion: '2010-09-09'
Description: Create a single VPC
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC
もう一度スタックを作成してみる
それでは、リポジトリにテンプレートファイルが存在する状態でもう一度スタックを作成してみましょう。
注意として、1度目に作成したスタックの設定がまだ残っているため、異なるスタック名で作成してください。
作成後、画面下の「最新の同期イベント」を見ると、別のエラーが発生してしまいました。
エラー内容を要約すると「デプロイメントファイルを取得できませんでした」とのこと。
デプロイメントファイル...?

調べてみると、どうやらスタックを作成するために必要なCloudFormationテンプレート用のファイルのほかに、「デプロイメントファイル」 と呼ばれるものが必要な様子。
デプロイメントファイルとは?
CloudFormationのGit同期において、テンプレートを単に配置するだけでは足りない部分を補うためのファイルのようです。
具体的には、以下のメタ情報の定義が必要です。
・スタック名
・使用するテンプレートファイルの場所
・必要なパラメータ
・オプション設定(タグ、IAMロール、リージョンなど)
ここでパラメータを記載することができるため、テンプレートファイル側でパラメータを記載しなくてもよくなる、ということですね。
本来、CloudFormationテンプレートは変数(Parameters)をスタック作成時に入力させることが可能ですが、
(例:VPCを作成するスタック作成時、VPCのCIDRを作成者に手入力させるような機能)
Git同期でスタックを作成する場合は手入力が不可能なため、代わりにデプロイメントファイルでパラメータを指定することが可能なようです。
なお、デプロイメントファイルはこの画面で赤枠の選択肢を選んでいたら自動で作成することが可能なようです。

テンプレートファイル、デプロイメントファイルを作成しなおす
今回はVPCのCIDRをデプロイメントファイル側で指定する形としてみます。
こうすれば、例えば検証環境ではデプロイメントファイルAで、本番環境ではデプロイメントファイルBで、と環境に応じてデプロイメントファイルを使い分けることで、汎用性の高いテンプレートを運用することが可能です。
さらに、スタックの画面をよく見ると、「デプロイファイルのパス」がtest-gitconnection.yamlでした。そのため、テンプレートファイル名は適当な名前に差し替え、デプロイファイルの名前を上記に変更します。

AWSTemplateFormatVersion: '2010-09-09'
Description: Create a single VPC
# パラメータ定義セクション
Parameters:
VpcCidrBlock:
Type: String
Description: CIDR block for the VPC # この値はデプロイファイルから渡される
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCidrBlock # パラメータに入力された値を参照
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: MyVPC
テンプレートファイルには、パラメータ定義セクションを追加しました。
そのうえで、リソースセクションのCidrBlockで組み込み関数!Refを利用して、パラメータに入力された値を参照します。
template-file-path: test-gittemplate.yaml
parameters:
VpcCidrBlock: 10.0.0.0/16
デプロイメントファイルはこの通りです。
template-file-pathはフルパスで記載してあげる必要があるそうです。今回はリポジトリ直下にファイルを配置するためこれがフルパスになります。
両ファイルを作成したら、リポジトリに配置します。
もう一度スタックを作成する
無事に作成が完了しました!
なお、Gitリポジトリアクセス用のIAMロールを1度目にスタックを作成した際のもので使い回したところエラーが発生したことをお伝えしておきます。
理由としては、ポリシーの中にスタック名がARNとしてべた書きされており、使い回しが効かないロールとなっていました。同じところでハマっている方はご注意ください。
CloudFormationとGit同期に関しては以上となります。
次回はもう少し発展的な内容に出来ればと思いますのでぜひご覧ください!
