【IaC】AWS CloudFormationとは？

# はじめに
`AWS CloudFormation`とは、テキストファイルからAWSリソースの構築を自動で行うことができるAWSサービスです。
AWSリソースの設定をテキストで書くことができる、所謂Infrastructure as Code(IaC)技術です。
CloudFormationを使えば、今まで手動で作成していたAWSリソースをコード化しデプロイすることで、間違えがなく再現性の高い環境構築を行うことができるようになります。
是非、これを機にCloudFormationへの理解を深め、使いこなせるようになっていきましょう。

# 対象読者
- マネジメントコンソール上での環境構築に疲れた方
- 再現性の高い環境構築を行いたい方
- IaC及びCloudFormationに興味のある方

# 概要
冒頭でも説明しましたが、CloudFormationは、テキストファイルからAWSリソースの構築を自動でを行うことができるサービスです。
(後述しますがサードパーティリソースも扱えます)
`Amazon EC2`や`Amazon S3`などのAWSリソースの設定を、テキストファイルで記述したものをCloudFormationテンプレート(以下、テンプレート)と呼び、こちらをデプロイすることで環境構築を行うことができます。
以下に簡単なS3バケットを作成するYAML形式のテンプレートを記述します。
```yaml:template.yml
AWSTemplateFormatVersion: '2010-09-09'
Description: S3 Bucket

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: '***-cfn-s3-sample'
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
```
詳細は説明しませんが、上記のテンプレートではアクセス許可やブロックパブリックアクセスの設定がされており、実際にデプロイしたS3のリソースを確認すると同様の設定がされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703623/d49c11d8-5bd5-3ecf-dd5e-a1d21904ffea.png)
また、デプロイした後のリソースは`スタック`と言う単位で管理されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703623/f2f4bd23-6207-2d27-d15f-6e2c299d1f87.png)
スタックには、テンプレート内で記述したAWSリソースがひとまとめになって管理されており、AWSリソースの起動や更新、削除もスタック単位で実行ができるため、手軽に環境を再構築したり複製することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703623/afccc50e-b605-bf0f-08cf-7422b8b28e20.png)

# 特徴
### 環境構築の自動化
従来のAWSリソースの環境構築は、手順書をもとにマネジメントコンソールからリソースの設定を行なっていたかと思います。
CloudFormationで環境を構築する場合、テンプレートファイルからAWSリソースを自動で設定するため人が介入する作業が極端に減ります。
そのため、環境構築を行う上で問題であった、人為的なミスや属人化しがちといったデメリットを軽減することができます。
また、環境変数を用いることで各環境に同等の環境をリリースできるため、安心かつ素早い環境構築ができます。

### テンプレートの管理
CloudFormationテンプレートは、JSONやYAML形式のテキストファイルで記述しているので、Git等のバージョン管理が可能です。
手動でAWSリソースの環境構築を行う際は、手順書を作成して毎度その通りに実行する必要がありました。
テンプレートをバージョン管理することができるので、構築部分の手順書を作成する必要もなく、他のプロジェクトにも流用できるため大幅に工数が削減できます。

### 未対応のリソースへのサポート
CloudFormationはAWSのサービスです。
そのため、サードパーティのリソースが対応していなかったり、まだCloudFormationに対応していないAWSサービスがあったりします。
しかし、CloudFormationレジストリやカスタムリソースを使用すれば、CloudFormationで記述することが可能となります。
詳細は説明しませんが、両者の違いは以下のようになっています。
- CloudFormtionレジストリ: AWSが用意したサードパーティリソースに対応した拡張機能。
- カスタムリソース: ユーザーがオリジナルのプロビジョニングロジックを記述し、任意のリソースに対応できる新たなリソースを作成できる機能。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/registry.html

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-custom-resources.html

### 学習コストがかかる
各サービスごとに異なる様々なパラメータが存在するので、学習コストがかかるとされています。
ただし、リソースについて詳しく知っていれば、各パラメータについてすんなり理解できると思います。
そのため、いきなりCloudFormationで環境を構築し始めるのではなく、リソースへの理解を深めてからCloudFormationで環境構築するのが良いかもしれません。
また、公式のサンプルも存在するので、こちらも参考にすることをおすすめします。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-sample-templates.html

# おわりに
CloudFormationの基本的な概念について説明させていただきました。
使いこなすことによって、これからのAWSライフをより快適に過ごせるようになると思います。
とっかかりづらい技術ではあると思うので、ハンズオンであったり、自分の作成したアプリケーションをCloudFormationで置き換えてみると楽しく学べるのではないでしょうか。
筆者がCloudFormationの理解を深めるために行ったハンズオンは以下となります。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-cfn-2020-reg-event-LP.html

最後までご覧いただきありがとうございました。

# 参考
https://aws.amazon.com/jp/cloudformation/faqs/

https://dev.classmethod.jp/articles/cloudformation-s3bucket-type/

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/registry.html

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-custom-resources.html

https://dev.classmethod.jp/articles/study_cloudformation/