CloudFormationがCD Pipelineなしで そのままGit連携デプロイが可能に! #AWSreInvent

2023.11.27

ども、re:Invent現地参加組の もこ@札幌オフィス です。

まだ現地ではキーノートが始まっておらず、まだラスベガスにも到着出来ていない現状ですが、ぽろぽろと出てきているアップデートをご紹介していきます!

CloudFormationのStack更新がGitからできるようになった!

このサービス、簡潔にまとめると「CloudFormationのStack deployment fileを元にして良い感じに指定したブランチに更新があったらデプロイするよ!」といったサービスです。

Stack deployment fileを簡単に説明するとCloudFormationのTemplateにおけるパラメータを定義できるモノです。

今回のアップデートであるGitとの同期機能では、指定したブランチが更新された時にCI/CDパイプラインを書かずとも、このStack deployment fileで記入したパラメーターを元にして自動的にCloudFormationを実行してくれるといったアップデートとなります!

早速設定してみる

何はともあれ、早速やってみましょう。

マネジメントコンソールからCloudFormationを開くと、「Gitから同期」が増えていることを確認できます!

CloudFormationのGit Sync機能では、「デプロイテンプレート」と「テンプレート」の2つを定義する必要があります。これは先程説明したStack deployment fileと、実際にデプロイするCloudFormationのテンプレートを指定します。

テンプレートでは、デプロイ時に設定するパラメーターを指定する事ができます。今回はport: 8080としてみます。

設定すると、連携したGitHubのリポジトリへ、Pull Requestが作成されます。

作成される差分はこんな感じで、先程マネジメントコンソールで作成したパラメーターが入っていることを確認できます

template.yaml の方として、こんな感じのCloudFormationを用意してみました。

AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  port:
    Type: Number
    Description: コンテナのポート番号

Resources:
  NginxTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: nginx-example
      ContainerDefinitions:
        - Name: nginx
          Image: nginx:latest
          Essential: true
          Memory: 1024
          PortMappings:
            - ContainerPort: !Ref port
              HostPort: !Ref port
              Protocol: tcp

これをCommitしてPushしてみます。

すると、CloudFormation側のステータスを確認するとPushをトリガーとして諸々が走り...

リソースが作成されていることを確認できます!

テンプレート以外のリソースのトリガー

念のため、試しに、CloudFormation Template以外のコードも変更した時にもトリガーされるのかを確認してみましょう。

echo test > test.txt
git add test.txt
git commit -m "Create test"
git push

結果は下記の通りで、CloudFormationのテンプレート外の更新コミットに対しても実行が走り、Changesetを作成して差分が無い事を確認してくれています。

これらを応用して、例えば「S3にアップロードするような静的コンテンツを管理しているリポジトリで、ファイルの更新があった場合、CloudFormationとGit 同期機能で自動デプロイする」といった事が実現可能となります。

使い所について

CloudFormationをメインのIaCとしてフル活用されている場合は嬉しいアップデートかと思いつつも、最近はAWS CDKの台頭でCloudFormationをそのまま書く機会は減ってきているため、個人的には、「ちょっと静的サイト作りたいんだけど、CD Pipeline 書くの面倒なんだよね」であったり、「既にCloudFormationを活用してるけれど、アプリケーションの自動デプロイまではできていない」といったケースで嬉しいアップデートかと思います。

一方で、現状CDKを利用されていたり、GitHub Actions上などでしっかりとしたCI/CD環境を整備されている状態であれば、あえてこの機能を選択する必要性は無いと思われます。

あくまでも上記で挙げたような「CloudFormationのCDをサクッと自動化したい」であったり、「CloudFormationテンプレートとりあえず書いてるけど、これからIaCもちゃんと自動デプロイしていきたい!!」といったようなケースにおいては、CD環境を1から作るよりかは工数少なめでサクッと導入できるため、便利な機能かと思います。

CloudFormationのCIについては、CloudFormation Linterを自前でGitHub Actions上で組んでいただくと、より良いCloudFormationのCI/CD環境を整備できるかと思います。

現時点(2023/11/26)で対応しているソースリポジトリ

現時点でサポートされているソースリポジトリは次の通りです。

  • GitHub
  • GitHub Enterprise
  • GitLab
  • Bitbucket

References

AWS CloudFormation introduces Git management of stacks

Working with AWS CloudFormation Git sync