【AWS】用語を整理しながら学ぶAWS - part5 Cloud Formation - 1

# はじめに

この記事では AWS Cloud Tech を通して Cloud Formation を学習して実践していく記事です。
主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）
誤りなどがあれば書き直していく予定です。

https://aws-cloud-tech.com/

## 🤔 本題の前にそもそも IaC とは

Infrastructure as a Code の略
要はプログラムの実行環境などをソースコードのようなモノで管理できる仕組み、概念

考え方としてはルータの設定やスイッチの設定をコンフィギュレーションという形で管理することに近い。
ただし、今回扱う IaC はルータやスイッチなどのコンフィギュレーションではなく
より抽象化されたクラウドのインフラストラクチャーをコードという形で表現することと定義します。

## 実は番外編で

ちょっと前の記事
「[【AWS】用語を整理しながら学ぶ AWS - 番外編-EC2 上に Rails6 環境を構築(一部 Terraform 利用)](https://qiita.com/ymd65536/items/75bb90f627e27e7186d2)」で

Terraform を扱っていましたがこれも IaC のひとつです。
特徴は記事に書きましたので割愛しますが
今回の IaC とは大きく何が違うかを簡単に述べておくと

Cloud Formation は AWS に特化した IaC であることです。

## 🤔Cloud Formation とは

IaC を利用して AWS のインフラ構築をコードで管理できるサービス
AWS リソースをコードで管理できる。

### 😍 メリット・Cloud Formation のここがすごい

リージョンに障害発生した時、ダウンタイムありの障害復旧対策として
あらかじめシステムのインフラ構成をコードで管理しておくことで
別のリージョンに同じ構成を復元することができる。

同じインフラ構成をコールドスタンバイで構えることができるので
コスト最適化の側面があるが
コードを AWS で実行する必要がある為、多少の手間が必要である。

(もしかして、このあたりもやりようによっては自動化できるのかな)

### 🤔 なぜ、Cloud Formation を使うのか

AWS のリソースのみを管理するだけであれば Terraform である必要はないから。
ただし、他のクラウドも視野に入れて検討すると Cloud Formation でインフラ構成を管理するのは厳しい。

### 形式

形式は YML(YAML Ain't a Markup Language)と呼ばれる形式です。

yaml なのか yml なのかという議論もあるかと思いますが
今回は yml で統一します。

docker や CircleCI,Rails で使われる主流な形式なので覚えておきましょう。

### YAML の特徴

パレンティスといったカッコ書きでブロックを表すのではなく
タブでブロックを表す。

### 😎 百聞は一見に如かず

実際にコードを見よう

```yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MyVPC2:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.8.0/21
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: MYVPC2fromCF
  subnetName:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      VpcId: !Ref MyVPC2
      CidrBlock: 10.0.8.0/24
      Tags:
        - Key: Name
          Value: subnet1formCF
  secGroupName:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: GroupName-SG
      GroupDescription: GroupDescription-SG
      VpcId: !Ref MyVPC2
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: SGfromCF
Outputs:
  Subnet1:
    Value: !Ref subnetName
    Export:
      Name: Subnet1Name
  SG1:
    Value: !GetAtt secGroupName.GroupId
    Export:
      Name: SG1Name
```

## 各項目の説明

### テンプレートバージョン

AWS 公式ガイドにはこうある。

> AWSTemplateFormatVersion セクション (任意) は、テンプレートの機能を識別します。
> 最新のテンプレートの形式バージョンは 2010-09-09 であり、現時点で唯一の有効な値です。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/format-version-structure.html

最新のテンプレートはどうやら 2010-09-09 とあるので
まぁそういうもんだと思い、固定で書いておく。

### Resources

AWS 公式ガイドにはこうある。

> 必須の Resources セクションでは、スタックに含める AWS リソース
> (Amazon EC2 インスタンスや Amazon S3 バケットなど) を宣言します。

スタックとは AWS リソースを定義する場所、格納先のこと
Cloud Formation テンプレートでは必須の項目である。

AWS リソースの定義はここに書く。
今回、例に出すコードで言えば VPC は論理 ID を「MyVPC2」とした。

### 論理 ID とは

スタック内のリソースを管理する為の識別子のことを指す。

今回のコードの場合は
VPC を「MyVPC2」
サブネットを「subnetName」
セキュリティグループを「secGroupName」とした。

### Type

AWS リソースの種類を選択する。
論理 ID が「MyVPC2」の場合は

「AWS::EC2::VPC」とあるので
VPC に関する記述であるということがわかる。

他にも存在するが、AWS のサービスの数だけ存在する為
ユーザーズガイドの「テンプレートリファレンス」を参照

[ユーザーズガイド](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html)

### Properties

前述の Type で指定したリソースに関する設定をここに書く。

リソース Type 毎に設定項目の数が異なるので
VPC を例に挙げて説明する。

```yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MyVPC2:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.8.0/21
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: MYVPC2fromCF
```

上記の VPC の場合は

CidrBlock は VPC で利用できるネットワークを定義
EnableDnsSupport は DNS 解決を有効にするかどうかの定義
Tags は その VPC を特定する Key と Key の値を定義する。

### コラム

AWS SAA 資格試験 のポイント

～ VPC ネットワーク内で名前解決ができないときは VPC の構成を見なおす～
～ 作成できる最小の VPC は /28 ネットマスク (16 の IPv4 アドレス)
～ 作成できる最大の VPC は /16 ネットマスク (65,536 の IPv4 アドレス) ～

## まとめ

単一のリソースは
論理 ID、Type、プロパティの 3 つで成立しており
Resources にまとめられることでスタックとして定義できる。
また、プロパティ内でリソースの細かい設定を行うことで
リソースを変更することができる。

## おわり

Outputs の話を書こうと思いましたが
CloudFormation は奥が深いのでいくつかに分けて書きます。

あぁ＾ Terraform の知識が役に立つんじゃあ＾

次は実際に構成を作っていくゾ