AWS CloudFormationがスタックのGit管理をしたので試してみる


# AWS CloudFormationがスタックのGit管理を導入しました。

昨年の11月、AWS CloudFormation は、Git リポジトリに保存されたテンプレートからスタックを同期できるようになりました。
これにより、Git ワークフローに CloudFormation デプロイを統合し、スタックパラメータやタグなどの値は YAML デプロイファイルで指定でき、Git ファイルで変更履歴を追跡できるようになっています。

またAWS CloudFormationはコミットごとにスタックを自動的に更新してくれるので一回設定をしてしまえば継続してリソースを最新化してくれます。Git 同期は、GitHub や GitLab などのサービスで動作し東京リージョンをはじめ、多くのリージョンで利用可能です。

今回はこの機能を試してみたいと思います。
AWS マネジメントコンソールで確認していきます。

# 用語説明
デモの前に用語の説明を行います。今回はデプロイファイルとスタックテンプレートを作成していきます。
スタックテンプレートはCloudfromationを実行する際に普段作成するjson/Yamlファイルを指しており、詳細は割愛します。

#### デプロイファイル
デプロイファイルはCloudFormation スタックを管理するパラメータと値を含むJson/Yaml形式のファイルです。
このファイルへの変更がリポジトリにコミットされると、関連するスタックが自動的に更新されます。

- template-file-path
CloudFormation テンプレート ファイルのリポジトリの完全パスを記載します。

- parameters
パラメーターにて、ポート番号やタスク設定などのキーと値を記載します。最大 50 個のパラメータを含めることができます。

- tags
タグにて、スタック内のリソースのタグ設定が可能です。最大 50 個のタグを含めることができます。

# スタックの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/0e737f88-3b0c-2bfd-296d-86a60ad28523.png)
まずはCloudfromationでスタックを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/795a321d-eb60-00b3-2bb8-bb5a840b15f0.png)

早速テンプレートの設定の項目に既存のS3とテンプレートのアップロードに加え「Gitから同期」の項目が増えています。
注意書きにもありますが、この機能はAWSのコンプライアンスプログラムの対象外となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/4f2d83e7-ebab-7dc7-b85e-afac5d55f116.png)
次の画面で適当に名前を作成し、デプロイファイルの作成方法を記載します。
Json/Yaml形式のファイルで自分で作成して使用することもできますが、この画面で作成することもできるため今回は後者で進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/49d1fa2d-22bc-a29b-7cc0-72d731c397ce.png)
続いて、同期するGitレポジトリを指定します。
2回目以降はリンクされているGitレポジトリを使用してリンクの作業を省略できます。
今回はGitHubと連携します。

早速接続の項目で、「新しい接続を作成する」を選択し、Gitとのリンクを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/d35b1b8b-c8f5-7a1d-e956-603032daf1e9.png)
任意の名前を選択し、次に進むと以下の画面に切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/0aaf849f-157f-4339-1c2b-ff1cd3d0952c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/e93f36ee-5ea2-cfae-7b90-ca19d84805ee.png)
「新しいアプリをインストールする」をクリックするとGitのログインに移るためログインを完了することで認証が完了します。

![Photokako-mosaic-Wuh84MoMlHS2NsIu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/270fa152-7460-640a-0aff-ab3f9d34bb14.png)

Cloudfromationのスタック作成画面に戻り先ほど作成した接続名を選択し、レポジトリとブランチを指定します。
デプロイファイルのパスを指定しますが、今回はわかりやすくdeployfile.yamlと記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/a8280d17-a342-2a86-c876-c5a4469fb9d6.png)

IAMロールは今回は新規に作成します。
事前作成する場合、以下の権限が必要です。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/git-sync-prereq.html
- cloudformation:CreateChangeSet
- cloudformation:DeleteChangeSet
- cloudformation:DescribeChangeSet
- cloudformation:DescribeStackEvents
- cloudformation:DescribeStacks
- cloudformation:ExecuteChangeSet
- cloudformation:ListChangeSets
- cloudformation:ValidateTemplate
- events:PutRule
- events:PutTargets

テンプレートファイル名はstacktemplate.yamlと指定します。この時点でGit上にファイルはまだ格納していません。
タグを任意に設定したらスタックを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/e7830231-d297-dd21-91c1-0872234b9f8d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/30c14749-9a77-9783-e39b-7f743baeedad.png)

作成が完了したらstacktemplate.yamlがまだ格納していないのでなにも実行されていないスタックができています。
事前にstacktemplate.yamlを配置していた場合、リソースが作成されます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/49bbaf3b-b8d1-9a16-4fbf-803500c18a9d.png)
Git Hubを確認するとdeployfile.yamlのプルリクエストが届いているため、内容を確認し、承認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/42558989-700c-d4ee-5066-760df0b90a7c.png)
上記のようなファイルが作成されたはずです。


続いてstacktemplate.yamlを配置します。
テスト用のVPCを作成するテンプレートを格納します。
```stacktemplate.yaml
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  VPCname:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.10.0.0/16
      Tags:
        -
          Key: Name
          Value: Gittest
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/91f350e5-97a1-dc3e-0a89-304cd715abd6.png)
格納が完了すると自動的にリソースが作成されます。


続いて、stacktemplate.yamlにサブネット作成の処理を追加してコミットしてみます。
```stacktemplate.yaml
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  VPCname:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.10.0.0/16
      Tags:
        -
          Key: Name
          Value: Gittest
  Subnetname:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.10.1.0/24
      MapPublicIpOnLaunch: true
      VpcId: !Ref VPCname
      AvailabilityZone: 
        Fn::Select: 
          - 0
          - Fn::GetAZs: ""
      Tags:
        - Key: Name
          Value: GittestSubnet
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/dcb52091-e873-b293-0b61-114db932bad9.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/e9b85aeb-bd94-ea41-b88d-3bb00e3218c9.png)
サブネットも無事作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616483/3567e657-e5b4-2e52-ddd4-a8bdc0f708a8.png)
また、Gitと同期タブからログも確認できるため、失敗した場合のエラー調査も可能です。