AWS CloudFormationを使いこなす(1)

#エピソード1〜AWS CloudFormationとは〜
業務でCloudFormationを触ることがあったため、そこで得たものをまとめていきます。

## AWS CloudFormationとは
AWSのリファレンスは、以下のように記述されており、要は「**設定さえ用意しておけば、いつでもリソースを構築でき、設定ファイルとして管理することが可能**」というサービスです。

> AWS CloudFormation では、Infrastructure as Code を実現することにより、AWS やサードパーティーの関連するリソースのコレクションをモデリングし、迅速に一貫してプロビジョニングし、ライフサイクル全体で管理することが容易になります。必要なリソースとその依存関係を CloudFormation テンプレートに記述すれば、1 つのスタックとして一括で起動し、設定できます。必要なときにはいつでもテンプレートを使用し、スタック全体を 1 つのユニットとして作成、更新、削除できます
引用：https://aws.amazon.com/jp/cloudformation/

## 必要なもの
### CloudFormation用のロール
後述しますが、CloudFormationを使用してリソースを構築する場合、各リソースを作成するためのロールを選択する必要があります。

ロールを作成する際に、以下を指定する必要があります。

- ユースケースの選択時に`CloudFormation`を選択
- 構築するリソースに対するアクセス権限(ポリシー)を付与

### CloudFormationテンプレート
テンプレートは、事前に用意してもよいですし、CloudFormationの機能である[デザイナー](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer.html)を利用して作成することも可能です。

テンプレートは`JSON`形式か`YAML`形式で記載することができます。

#### 補足
デザイナーを使用するにしろ、自前でテンプレートを用意するにしろ、各リソースを作成するには様々な設定値(プロパティ)があり、それらを設定する必要があります。(例: S3のバケット名)

以下のページに各リソースごとのプロパティがまとまっています。

- [AWS resource and property types reference](https://docs.aws.amazon.com/en_us/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)

注意して欲しいのが、現在(2021/09)時点で日本語のドキュメントがありません。頑張って英語のドキュメントを読みましょう。
そして、言語を`日本語`に設定していますとサイドバーにページ階層が表示されません。

![AWS_resource_and_property_types_reference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796366/55d23018-fea6-0cfd-3f33-047f99c07835.png)

ブラウザにて「`ColudFormation` `S3`」のような検索をすれば該当のページが表示されます。

## 使用方法
### 用語
- スタック
    - CloudFormationサービスにおけるリソースの単位。

         >スタックは、単一のユニットとして管理できる AWS リソースのコレクションです。
引用： https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacks.html

### 前提条件
今回はサンプルとして、S3バケットを構築します。以下のテンプレートを使用します。
デザイナーは使用しないため、ファイルとして用意しておいてください

```create_s3.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  # https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html
  S3BucketForRedirect:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: <バケット名>
```

※バケット名は各自で変更してください。

CloudFromation用のロールにはS3バケットを作成するための権限を付与してください。

操作しているリージョンにスタック及び、リソースが作成されるので、作成したいリージョンを選択してください。

### 実際に操作してみる
事前にテンプレートファイルを用意し、ローカル環境からアップロードする手順を紹介します。
また必要な項目以外は全てデフォルトの値を使用します。

#### スタックの作成

![01.CreateStack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796366/40c3e343-4ad3-1eb9-a9b1-20e8fcba1781.png)


|大項目|小項目|設定値|備考|
|:--|:--|:--|:--|
|テンプレートの準備|テンプレートの準備|テンプレートの準備完了||
|テンプレートの指定|テンプレートソース|テンプレートファイルのアップロード||
||テンプレートファイルのアップロード|create_s3.yml|上記にて作成したファイルを選択|

#### スタックの詳細を指定
![02.StackDetail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796366/6d4d882c-9818-9dfa-0d0e-45fe2a2dd276.png)

|大項目|小項目|設定値|備考|
|:--|:--|:--|:--|
|スタックの名前|スタックの名前|testforstudy|同一リージョン内のスタックにて一意|

#### スタックオプションの設定
![03.StackOption.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796366/8f7b5d88-a057-499b-e762-e8418c9ecf16.png)

|大項目|中項目|小項目|設定値|備考|
|:--|:--|:--|:--|:--|
|アクセス許可|IAMロール-オプション|第1項目|IAMロール名|ロールの指定方法を選択|
|||第2項目|MyStudyCloudFormationRole|CloudFormation用のロールを選択|

#### レビュー
各項目を確認します。

#### 完成
![04.CreateCoplete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/796366/2524a716-530a-10bd-c5f0-5f4617e0d080.png)

このように「`CREATE_COMPLETE`」となれば、完成です。
失敗した場合、イベントタブにエラー内容が表示されるため、それにしたがって修正を加えてください。

## 使用してみた感想
- テンプレートファイルを作成してしまえば、いくらでもリソースを構築が可能なのでとても便利。
- テンプレートファイルを用意するのが手間。
    - AWSコンソールにて使用している値との紐付けが手間。

## 参考
- [AWS CloudFormation（テンプレートを使ったリソースのモデル化と管理）| AWS](https://aws.amazon.com/jp/cloudformation/)
- [ユーザガイド](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html)
    - [AWS CloudFormation サービスロール](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-iam-servicerole.html)
    - [AWS CloudFormation テンプレートの使用](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-guide.html)
        - [AWS resource and property types reference](https://docs.aws.amazon.com/en_us/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)
        - [サンプルテンプレート](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-sample-templates.html)