cloudFormationでECSの環境構築時に使ったものまとめ

# cloudFormation
> https://aws.amazon.com/jp/cloudformation/
クラウド環境内のすべてのインフラストラクチャリソースを記述してプロビジョニングするための共通言語を提供します。


jsonまたはyamlファイルに構築したい環境を記載して、AWSの各サービスを起動することができる。
メリットとしては、テキストファイル管理（Infrastructure as code）できるのでインフラの構造をversion管理できるようになる。

## cloudFormationの記法
| セクション名 | 役割 | 必須 |
|---|---|---|
| AWSTemplateFormatVersion | テンプレートのバージョンを記載する。 | × |
| Description | テンプレートのコメントを記載する。 | × |
| Metadata | テンプレートの詳細情報を記載する。 | × |
| Parameters | 作成時に自由に指定できる値を記載する。 | × |
| Mappings | Key, Valueを記載する。 | × |
| Resources | 実行する処理を記載する。 | ○ |
| Outputs | 実行後、出力したい値を記載する。 | × |

### Parameter
parameterは、スタックを実行する際に自由に値を入力し指定することができる。
例えば、事前にVPCを作成していた場合にそのVPCのIDを入力することで、入力したVPC上で作成される。

```yaml
Parameters: 
  vpcId:
    Type: String
  subnetId:
    type: String
  instanceType:
    type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
```

| property名 | 役割 |
|---|---|
| type | 入力できるデータ型を指定する。 |
| default | 初期値を指定する。 |
| AllowedValues | 入力できる値を指定する。 |
| Description | 値の説明を指定する。 |

上記の場合、`vpcId` `subnetId`はString型のみ有効で、`instanceType`は初期値に`t2.micro`が指定されており、String型のみ有効で`t2.micro`か`t2.small`しか入力できない。

#### その他、使用できるパラメーター
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#parameters-section-structure-properties

### Resources
作成していくAWSの情報を記載する。

```yaml
Resources:
  ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: !Sub ${AWS::Region}a
      InstanceType: !Ref instanceType
```
実行するリージョンのaで入力したインスタンスタイプのサーバーのインスタンスを作成させる。

#### type
大量にあるので、とりあえず一部だけ。

| type名 | 役割 | 公式 |
|---|---|---|
| AWS::EC2::VPC | VPCを指定する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html) |
| AWS::EC2::Subnet | サブネットを指定する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html) |
| AWS::EC2::InternetGateway | インターネットゲートウェイを指定する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html) |
| AWS::EC2::VPCGatewayAttachment | インターネットゲートウェイをアタッチする。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html) |
| AWS::EC2::SecurityGroup | セキュリティグループを指定する。 | [リファレンス]() |
| AWS::EC2::SecurityGroupIngress |  | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html) |
| AWS::EC2::SpotFleet | スポットフリートを指定する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html) |
| AWS::ECS::Service | ECSサービスを作成する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html) |
| AWS::ECS::Cluster | ECSクラスターを作成する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-cluster.html) |
| AWS::ECS::TaskDefinition | ECSにタスクを定義を追加する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html) |
| AWS::ECR::Repository | Dockerイメージ用にリポジトリを指定する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-repository.html) |
| AWS::IAM::Role | IAMロールを作成する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) |
| AWS::S3::Bucket | S3のバケットを作成する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html) |
| AWS::ElasticLoadBalancingV2::LoadBalancer | ALBまたは、NLBを指定する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-loadbalancer.html) |
| AWS::ElasticLoadBalancingV2::Listener | Load Balancerにリスナーを追加する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-listener.html) |
| AWS::ElasticLoadBalancingV2::TargetGroup | Load Balancerにターゲットを追加する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html) |
| AWS::Route53::RecordSetGroup | Route５３を追加・設定する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-route53-recordset.html) |
| AWS::Logs::LogGroup | Logのグループを追加する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-logs-loggroup.html) |
| AWS::CodeBuild::Project | build環境を作成する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html) |
| AWS::CodePipeline::Pipeline | ソースの変更方法を記述する。 | [リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html) |


### Outputs
Resourcesが実行された後に、記載したデータを他のスタックに引き継ぐことができる。

```yaml
Outputs:
  vpcId:
    Value: !Ref vpcId
    Export: 
      name: vpc-dev
```

他のスタックで、`vpc-dev`として呼び出すことができるようになる。

### 関数一覧

| Fn名 | 役割 |
|---|---|
| Ref | 指定した名前のValueを返却する。 例) !Ref vpcId |
| Sub | 変数に置き換えた値を返却する。 例) !Sub ${AWS:Region}a |
| ImportValue | 他のスタックでOutputされた値を返却する。 例) !ImportValue vpc-dev |

！Refなどの書き方は、省略形です。他の書き方は下記の形式。

```yaml
Ref : vpcId

Fn::Sub : ${AWS:Region}a
```

## まとめ
cloudFormationでテンプレートを作っておけば、新しくプロジェクトを作成するときなど、コピペで少し変えるだけで使えるのでかなり便利。それにコンソールだと、以前した操作を辿れないので覚えておかないといけないが、テキストファイルだと、Version管理もできて、かなり楽になる。