[AWS]Cloudformationについて調べた結果

# はじめに
仕事でCloudFormationを使うことになったので、ググった検索結果の1ページ目のサイト等を参考に、どのようなものか、どのように使うのか、といったことを調べてまとめてみました。


## CloudFormartionとは、、？
AWSにシステム構成をJSON(YAML)形式で記述してテンプレート化し、構成の管理・修正・再利用を用意にするサービスのことです。
テンプレート化して作成した環境群を「スタック」と呼びます。
サンプルテンプレートが多数提供されているので、これらのテンプレートを使用することで簡単に環境構築が出来ます。

##メリット

- インフラストラクチャ(※1)とアプリケーションリソース全体を、テキストファイルまたはプログラミング言語のいずれかでモデル化できる。これにより、構成の一貫性、トラブルシューティング時間の短縮に役立つ。

- 安全で繰り返し可能な方法でアプリケーションリソースがプロビジョニング(※2)されるため、手作業やカスタムスクリプト作成を必要とせずにインフラストラクチャとアプリケーションの構築と再構築が可能。

- インフラストラクチャをコード化することで、バージョン管理システムにチェックインしプロダクションにデプロイする前に他の人と確認することができる。

- リソース(※3)はCloudFormationが一括管理するので、個別の管理が不要で、依存関係も自動的に管理してくれる。

- 使用料金は無料。(ただし、単独で利用することは無く、EC2やAWS ELBなどと併用するため、そちらの料金は発生する。)

- 同じテンプレートやリソースを使うため、新しいシステムでも事前に運用コストを予測できる。

##デメリット

- テンプレートやスタックの作成方法など、使い方を理解し、操作を覚えないといけない。

- 部分的な修正でも、再度テンプレートからスタックを作成して適用する必要があり、手動で修正するよりも時間がかかる。

- スタックの作成と削除を繰り返していると、AWSのリソース作成上限に達する可能性がある。

##テンプレートの基礎を理解していく
テンプレートは、いくつかのセッションに分かれています。

- Format Version (任意)
  - テンプレートの形式を指定します。現在は2010-09-09のみ利用できます。テンプレートファイルのお作法として、とりあえず指定しておきます。

- Description (任意)
  - テンプレートに関するコメントを含めることができる。

- Metadata (任意)
  - テンプレートの詳細を提供する任意の JSON または YAML オブジェクトを含めることができる。

- Parameters (任意)
  - テンプレートをカスタマイズします。パラメーターを使用すると、スタックを作成または更新するたびにテンプレートにカスタム値を入力できます。

- Mappings (任意)
  - キーと名前付きの一連の値とが対応付けられます。具体的なリージョン(※4)ごとに必要な値を指定します。
  
- Resources (必須)
  - スタックに含める、VPC(※5)やEC2インスタンスやS3バケットなどのリソースを宣言します。

- Outputs (任意)
  - 他のスタックにインポートする、応答として返す、またはAWS CloudFormationコンソールで表示する出力値を宣言します。

##サンプルテンプレートからの作成方法・手順

1.Management ConsoleのCloudFormation管理画面にある、「Create Stack」をクリックします。もし、Create Stackが表示されていない場合は、Actionsをクリックするとメニューが表示されますので、そちらをクリックします。

2.スタック名と使用するテンプレートを選択します。

3.LAMPスタック内で使用するMySQLのパスワードを、DBRootPasswordに入力し、入力が終わったらNextをクリックします。

4.スタックと、スタックに所属するリソース（EC2、RDS、ELBなど）に付与するタグを設定します。複数入力したい場合は、右側にある+ボタンをクリックすると追加できます。

5.入力が終わったらページ下部のNextをクリックします。内容に誤りがないことを確認して、ページ下部のCreateをクリックします。

6.作成完了後は、OutputsタブでLAMP(※10)スタックのURLが表示されます。

※編集する際は「Update Stack」、削除したいときは「Delete Stack」をクリックします。

##最低限のテンプレート作成からCloudFormation実行まで

1. まずは、下記の内容のファイルを準備します。

```yaml

# バージョン宣言
AWSTemplateFormatVersion: '2010-09-09'

# テンプレートに関するコメントを含めることができる
Description: Test Stack

# VPCやEC2インスタンスやS3バケットなどのリソースを宣言
Resources:
  FirstVPC:                         # テンプレート内で一意なID
    Type: AWS::EC2::VPC             # 作成するリソースのタイプ

    # 各リソースの作成時に指定するプロパティ
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
      - Key: Name
        Value: FirstVPC
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Name
        Value: FirstVPC-IGW
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref FirstVPC
      InternetGatewayId: !Ref InternetGateway
  FrontendRouteTable:
    Type: AWS::EC2::RouteTable
    DependsOn: AttachGateway
    Properties:
      VpcId: !Ref FirstVPC
      Tags:
      - Key: Name
        Value: FirstVPC-FrontendRoute
  FrontendRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref FrontendRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  FrontendSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: AttachGateway
    Properties:
      CidrBlock: 10.0.1.0/24
      MapPublicIpOnLaunch: 'true'
      VpcId: !Ref FirstVPC
      Tags:
      - Key: Name
        Value: FirstVPC-FrontendSubnet
  FrontendSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref FrontendSubnet
      RouteTableId: !Ref FrontendRouteTable
```

2.CloudFormationのWebコンソールを開き、「新しいスタックの作成」をクリックする。

3.テンプレートをAmazon S3にアップロード」を選択し、テンプレートファイルを選択し、次へ行きます。

4,スタック名を入力し、次へ。

5.オプションに関してはとりあえずスルーで、確認画面で確認してから作成をクリック。

##必要そうな予備知識
####!Ref(組み込み関数)
指定したパラメータまたはリソースの値を返します。
　・パラメータの論理名を指定すると、それはパラメータの値を返します。
　・リソースの論理名を指定すると、それはそのリソースを参照するために通常使用できる値
　　を返します

####DependsOn（リソース依存関係の定義）
特定リソースが他のリソースに続けて作成されるように指定します。通常、CloudFormationは、上で紹介した!Refを使用する場合、暗黙的に、参照先のリソースを事前に作成するルールが適用されますが、DependsOn属性を利用することで、任意のリソースに対しても、その作成する依存関係を定義することができます。

####リソースタイプの設定方法
[公式の一覧](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)から対応しているリソースタイプを選ぶ。

####プロパティの指定方法
リソースタイプの詳細にプロパティの例が載っているのでそちらを参考にする。

#終わりに
やはりAWS関連は難しいし覚えることが多すぎる、、
だけど、これだけ調べるとなんとなくは掴めてきてるのでこれから実際に使って行きながら慣れていきたいです！


##分からない単語一覧
※1 インフラストラクチャ
「インフラ」の正式名称。
情報システムを稼動させる基盤となるコンピュータなどの機材、ソフトウェアやデータ、通信回線やネットワークなどの総体のことを指します。

※2 プロビジョニング
設備やサービスに新たな利用申請や需要が生じた際に、資源の割り当てや設定などを行い、利用や運用が可能な状態にすること。
例えば、コンピュータシステムを新規の利用者が使えるようにする場合、ユーザーアカウントの作成やアクセス権限の指定、ソフトウェアの設定、個人用フォルダの割り当てなどの操作や作業を行う必要がある。

※3 リソース
資源、資産、資料、供給源などの意味を持つ英単語。
IT業界では、ソフトウェアやハードウェアを動作させるのに必要なコンピュータの構成要素やその能力、すなわち、CPUの処理速度やメモリ容量、ストレージ容量などを指すことがある。

※4 リージョン
データセンターが存在する独立した地域のこと。

※5 VPC( Virtual Private Cloud)
簡単に言うと、AWS専用で、ユーザー専用のプライベートなクラウド環境を提供するサービスのこと。

※6 サブネット
最初にVPCによって作られているCIDRブロックを分割したネットワーク群のこと。
主にパブリックサブネットとプライベートサブネットがあり、パブリックネットは、外のネットワークと直接繋がっているサブネットで、プライベートサブネットとは、直接は外のネットワークに繋ぐことのできないサブネットになります。

※7インターネットゲートウェイ(IGW)
VPCとその外のネットワークを繋ぐための接合点のようなもの。
IGWを作成して、サブネットに繋ぐことで、サブネットと外部とのネットワークのやりとりを可能にすることができます。

※8ルーティング
サブネットを利用するために、各サブネットに対してルートテーブルを作成する必要があります。
仮想的なルーター的なものです。

※9 ネットワークアクセスコントロール（NACL）
ネットワーク単位でIPアドレス単位での通信の制御をします。
外側と内側の通信に対して、プロトコル・ポート・IPアドレスを入れて許可するのか、しないのかを決めていきます。

※10 LAMP
「LINUXオペレーティングシステム」、「ApacheWebサーバー」、「MySQLデータベース」および「PHP」の頭文字を取ったものです。
これは単に、オペレーティングシステム、Webサーバー、データベース、プログラミング言語としてそれぞれLinux、Apache、MySQL、PHPを使用することを意味します。

##参考
[CloudFormationで環境構築を自動化する](https://www.atmarkit.co.jp/ait/articles/1408/25/news014.html#:~:text=CloudFormation%E3%81%AF%E3%80%81AWS%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0,%E5%AE%B9%E6%98%93%E3%81%AB%E3%81%99%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E3%81%99%E3%80%82&text=%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8BJSON,%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)

[AWS CloudFormation とは](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html)

[AWS CloudFormation](https://aws.amazon.com/jp/cloudformation/)

[AWS CloudFormationを活用して効率的にAWSを使おう](https://business.ntt-east.co.jp/content/cloudsolution/column-19.html)

[【CloudFormation入門】5分と6行で始めるAWS CloudFormationテンプレートによるインフラ構築](https://dev.classmethod.jp/articles/cloudformation-beginner01/)

[CloudFormation超入門
](https://dev.classmethod.jp/articles/chonyumon-cloudformation/)

[【AWS】CloudFormationまとめ](https://qiita.com/iron-breaker/items/a12d1228de12663e7d32)

[多分わかりやすいCloudFormation入門とチュートリアル](https://qiita.com/ryurock/items/766154e0afb8fdb629e2)