CloudFormation が Git 同期をサポートしたので試してみる

記事タイトルとURLをコピーする

こんにちは、マネージドサービス部テクニカルサポート課の坂口です。

今回は re:Invent 2023 で発表された CloudFormation の Git 同期を試していきたいと思います。

Git 同期とは

Git リポジトリに保存されている CloudFormation テンプレートからスタックのデプロイが可能な機能となります。
この機能を使用することで、特定のブランチへの push 時に自動的にスタックのデプロイが可能となり、CodePipeline や GitHub Actions などの CI/CD パイプラインを構築せずに手軽にデプロイできます。

aws.amazon.com

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 テンプレートファイル

  • デプロイファイル
    テンプレートファイル内のパラメータを定義したファイル
    ※後述の手順で作成します

    docs.aws.amazon.com

設定

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 ロールとは異なる点、ご留意ください。

坂口 大樹 (記事一覧)

マネージドサービス部テクニカルサポート課

2023年3月にサーバーワークス入社。

スパイスカレーが好きです。