[aws] CloudFormationによるインスタンスの作成

## 概要

awsの`CloudFormatinon`を使用し、テスト用にインスタンスを一つ作成します。

## CloudFormationとは

AWSのシステム構成を`JSON`や`YAML`で書かれたテンプレートを使用し、管理・修正・編集などを自動で行うことができる機能です。
テンプレートによって作成された環境は`スタック`と呼ばれます。
ファイルを作成しておくことで環境を使いまわせる点が非常に便利です。

### テンプレートについて

今回作成する環境のテンプレートは以下の通りです。
テスト用のインスタンスを一つ立ち上げる構成となっています。
組み込み関数である`Ref`で構成を紐づけているイメージとなります。
なお以下例ではsshのSGを`0.0.0.0/0`としているので、各自の環境に合わせ修正してください。

```yaml
# デフォルト記述
AWSTemplateFormatVersion: '2010-09-09'
# Key pair の指定。
# AWSコンソールでパラメータを指定
Parameters:
  KeyPair:
    Description: KeyPair Name
    Type: AWS::EC2::KeyPair::KeyName
# EC2のイメージID
Mappings:
  StackConfig:
    EC2:
      ImageId: 'ami-923d12f5'
Resources:
# VPCの作成
  PracticeVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: PracticeVPC
# InternetGateWayの作成
  PracticeIGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: PracticeIGW
# IGWをVPCにアタッチ
  AttachIGW:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref PracticeIGW
      VpcId: !Ref PracticeVPC
# RouteTableの作成
  PracticePublicRoute:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref PracticeVPC
      Tags:
        - Key: Name
          Value: PracticePublicRoute
# Routeingの設定
  Route:
    Type: AWS::EC2::Route
    DependsOn: AttachIGW
    Properties:
      RouteTableId: !Ref PracticePublicRoute
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref PracticeIGW
# PublicSubnetの作成
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref PracticeVPC
      Tags:
        - Key: Name
          Value: PracticePublicSubnet
# SubnetにRouteテーブルを紐づける
  PublicSubnetRouteTabelAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PracticePublicRoute
# セキュリティグループの作成
# port22と80を解放
  PracticeSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref PracticeVPC
      GroupDescription: PracticeSG
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: PracticeSG
# EC2インスタンスの作成
  PracticeEC2:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: ap-northeast-1a
      InstanceType: t2.micro
      ImageId: !FindInMap [ StackConfig, EC2, ImageId ]
      KeyName: !Ref KeyPair
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !GetAtt PracticeSG.GroupId
      Tags:
        - Key: Name
          Value: PracticeEnv
# ElasticIPの作成
  PracticeIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref PracticeEC2
```

### 環境の作成

AWSコンソールにて以下手順で作成を行います。
`サービス → CloudFormation → スタックの作成 → スタックの詳細 → オプションの設定 → スタックの作成`

* スタックの作成

作成したyamlファイルをアップロードします。

![スクリーンショット 2020-10-30 17.58.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/c1d47fc3-a83c-4c30-04be-93f5b4a87471.png)

* スタックの詳細

スタックの名前とパラメータを指定します。
任意の名前と、sshを行うための各自の秘密鍵を指定してください。

![スクリーンショット 2020-10-30 18.12.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/c8d5099c-a342-c006-2f6c-6cbcb9a4eb28.png)


* オプションの設定

タグやIAMロール、アラームなどを設定できますが今回は特に設定を行いません。

![スクリーンショット 2020-10-30 18.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/b1443939-5c9e-1cd1-fd07-a5d9e237d58c.png)

スタックの作成を押下し、`CREATE_COMPLETE`となれば完了です。

![スクリーンショット 2020-10-30 18.38.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/01c19ace-0d9c-cf31-dd2a-32d070e5df11.png)

### 環境の削除

CloudFormationで作成した環境は、対象のスタックを削除することでそのスタックで作成された環境を一括で削除することができます。

![スクリーンショット 2020-10-30 18.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/655d402c-f985-c259-10a4-6ed21cd61606.png)

---