CloudFormation使ってみた

## 初めに
現在設計を行っているプレイリストシステムを実際に構築を始めようと思い立ちました！と同時にせっかくなのでCloudFormationを使ってみようという気が起きました。
IaC(Infra as Code:インフラのコード化)は重要ということはちょいちょい耳に挟んでいたのでいつか試してみねばと思っていたので言い機会です。この記事ではCloudFormationとはから、実際に簡単なリソースを作るところまでやってみたいと思います。

## CloudFormationとは
CloudFormationはプログラミング言語やテキストファイルを使用してAWSリソースを自動で構築するサービスです。所望のAWS環境をテンプレート化しておくことで、同じ環境を作成する時間を削減することができます。CloudFormation特徴としては以下があげられます。

・AWSリソースを自動で作成できる
・テンプレートを作成すると、同じ構成を何度も構築できる
・利用料金は無料（利用するのに必要なリソース分の料金がかかる）

[【初心者必見】はじめてのAWS CloudFormation](https://www.ctc-g.co.jp/solutions/cloud/column/article/07.html#:~:text=CloudFormation%E3%81%AF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%82%84,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)


Pythonなどのプログラム言語でも書けるんですね。。勝手にYAML,JSONけいしきだけだとおもっていました。とはいえ、実際のPJで使用することを考えるとオーソドックスなYAMLがよさそうなのでこの記事内でもこの２つを使用します。

## テンプレートの書き方

VPCを作る例だと下記のようになります。
```
AWSTemplateFormatVersion: "2010-09-09"        ・・・①

Description:        ・・・②
  test vpc cloudformation

Resources:        ・・・③
  TestVPC:　　　・・・(A)
    Type: AWS::EC2::VPC　　　・・・(B)
    Properties:　　　・・・(C)
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: test-vpc-01
```
参考：https://blog.serverworks.co.jp/2021/12/08/174707

テンプレートは①~③の構成から成り立ちます。

①・・・テンプレートファイルのバージョン（今のところ"2010-09-09" のみサポート）

②・・・スタックの説明欄に入る言葉を記載

③・・・リソースの定義
　（A)・・・リソースの名前(この例だとVPCの名前)
　（B)・・・リソースのタイプ　※すべてのリソースタイプは[こちら](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)を参照
　（C)・・・リソースの設定値(タイプが異なると、設定値の記述方法が異なります)

## VPCを作ってみた
上記の設定で実際にVPCを作ってみましょう。

CloudFormationのスタート画面から「スタックの作成」を選択します。（スタックはテンプレートから作成されるリソースの集合のことです。）

![スクリーンショット 2022-10-06 172248.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/84f88c7c-5601-6417-2056-8b4086194351.png)

テンプレートを選択します。今回は「テンプレートの書き方」の章で例に挙げたテンプレートの内容を「cloudformation-template-01.txt」というファイル名で自分のPCに保存し、「テンプレートファイルのアップロード」からアップロードしました。（yamlファイルですが、ファイルの拡張子はtxtでも問題ありませんでした。）

![スクリーンショット 2022-10-06 152032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/5e2c794f-e799-37d8-b0ec-83e3867d9554.png)

スタックの名前を入力します。
VPCのCIDRはスタックごとに入力したいといった場合は、テンプレートの書き方次第でこの画面で入力できるようです。が、今回はパラメータは全部決め打ちなので特に入力は行えないです。

![スクリーンショット 2022-10-06 152106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/a561bf92-1756-c4a6-62c4-f2efb5d6cf6e.png)

スタックのいろいろなオプションを選択していきます。
ここでのタグはスタック自体のタグを指定します。
また、アクセス許可というのは、CloudFormationがリソースを作成する際に使用するロールを指定します。ロールを指定しない場合は、コンソールを操作しているIAMユーザーの情報を利用するらしいです。（この例ではAdministratorFullAccess権限のIAMユーザーで操作）

![スクリーンショット 2022-10-06 152311.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/e3f4ead5-9390-b8d8-fcb9-a49664724423.png)

続いて、スタックの失敗時のオプションはデフォルトのままにしましました。ここで「次へ」を選択すると確認画面が表示され、「スタックの作成」を選択します。

![スクリーンショット 2022-10-06 152327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/52ff08bf-974e-76a4-ff44-18fe7aa9f5b0.png)

作成をすると、スタックの詳細画面に遷移します。ステータスが「CREATE_IN_PROGRESS」（作成中）なのでしばらく待ち、ブラウザの更新ボタンを押します。

![スクリーンショット 2022-10-06 152358.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/1ced546c-65ea-ade4-e3b7-d0e7d29e82b4.png)

スタータスが、「CREATE_COMPLETE」になりました！

![スクリーンショット 2022-10-06 152419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/4fd9bef0-2f02-a6b3-830d-7d705160e7c2.png)

VPCの画面を見に行くと、テンプレートに書いた値でVPCが作られていることを確認できました！！

![スクリーンショット 2022-10-06 152521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823786/d0154d12-ca33-60b5-00b8-596074ad41d2.png)

## まとめ
VPC1つ作成するだけだと、思いのほか簡単にできました。ただ、これがもっと複雑な構成や、後からリソースを変更するとなるとやっかいそうです。。何はともあれ、IaCの第一歩を踏み出せました。