CloudFormationでパブリック、プライベートどちらにも対応したEC2を構築する方法

# CloudFromationとは
CloudFormationはプログラミング言語やYAML,JSONを使用してAWSリソースを構築出来、AWS環境をテンプレート化しておくことで、同じ環境を作成する際に時間を削減することができます。

今回はYAMLで作成していきますので、JSONに変換したい方は次の記事をご参照下さい。
<a href="https://qiita.com/kazunobu2211/items/49deda949e97ea86bbf4" rel="nofollow noopener" target="_blank">YAMLからJSONに変換する方法</a>

## 完成したテンプレート
```:テンプレート
AWSTemplateFormatVersion: "2010-09-09"  

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: EC2
        Parameters:
          - Ec2Name
          - InstanceType
          - ImageId
          - SshKeyName
          - Ec2PubricIp
          - SecurityGroupIds
          - SubnetId
      -
        Label:
          default: EBS
        Parameters:
          - VolumeType
          - VolumeSizeGiB
          - EbsKmsArn

Parameters:
  Ec2Name:
    Type: String
    Default: 'EC2-NAME'

  InstanceType:
      Type: String
      Default: 't2.micro'
      # 許可するインスタンスタイプ
      AllowedValues:
        - t2.micro
        - t2.nano

  ImageId:
    Type: AWS::EC2::Image::Id

  SshKeyName:
    Type: AWS::EC2::KeyPair::KeyName
 
  Ec2PubricIp:
    Type: String
    AllowedValues:
      - "true"
      - "false"

  SecurityGroupIds:
    Type: AWS::EC2::SecurityGroup::Id
  
  SubnetId:
    Type: AWS::EC2::Subnet::Id
  
  VolumeType:
    Type: String
    AllowedValues:
      - gp2
      - gp3
      - io1
      - io2
      - sc1
      - st1
      - standard
    # 許可するボリュームタイプ
    AllowedValues:
        - gp2

  VolumeSizeGiB:
    Type: Number
    Default: '8'
  
  EbsKmsArn:
    Type: String
    Default: 'KMS-ARN'

Resources:  
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      NetworkInterfaces: 
        - AssociatePublicIpAddress: !Ref Ec2PubricIp
          DeleteOnTermination: "true" 
          Description: "Public IP Address" 
          SubnetId: !Ref SubnetId
          DeviceIndex: '0' 
          GroupSet:
            - !Ref SecurityGroupIds 
      InstanceType: !Ref InstanceType
      ImageId: !Ref ImageId
      KeyName: !Ref SshKeyName
      BlockDeviceMappings: 
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: "true"
            VolumeType: !Ref VolumeType
            VolumeSize: !Ref VolumeSizeGiB
            Encrypted: true
            KmsKeyId: !Ref EbsKmsArn
      Tags:
      - Key: Name
        Value: !Ref Ec2Name
```
## 構築手順
### １ スタックの新規作成 
AWS CloudFormation管理コンソールから、スタックの作成をクリックし、[新しいリソースを使用(標準)]を選択。

### ２ テンプレートアップロード 
[スタックの作成]で、[テンプレートの準備完了]を選択し、[テンプレートファイルのアップロード]>
[ファイルの選択]で、テンプレートを選択。
![スクリーンショット 2022-11-22 20.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/6334bb44-c5c2-617e-656d-a71daadb9056.png)

### ３ パラメータ入力 
各パラメータを入力します。`スタックの名前は任意の名前を入れる`
![スクリーンショット 2022-11-27 14.43.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/de07782c-f024-f1ec-abeb-8a381b55aac3.png)

#### パラメータの詳細
|パラメータ名|用途|備考|
|-|-|-|
|Ec2Name|EC2の名前|例:CF-EC2|
|InstanceType|インスタンスタイプの入力|例:t2.micro|
|ImageId|インスタンスのAMIID|例:ami-xxxxxxxxxxx|
|SshKeyName|SSHのKeyNameを選択|事前に作成が必要になります|
|Ec2PubricIp|EC2にパブリックIPアドレスを付与するか|true=付与,false=付与しない|
|SecurityGroupIds|EC2にアタッチするSGを選択|事前に作成が必要になります|
|SubnetId|EC2インスタンスを起動するサブネットを選択|事前に作成が必要になります|
|VolumeType|ボリュームのタイプを選択|例：gp2|
|VolumeSizeGiB|ボリュームのサイズ（GiB）|例：８|
|EbsKmsArn|EBS暗号化のKMSのARN|例：arn:aws:kms:452345234nafofpu:579823475723:key/ssssscasdfsdafsadfas|

### 4 CloudFormation詳細設定 
次へを選択。`CloudFormationの詳しい設定について次の記事をご覧下さい。`
<a href="https://qiita.com/kazunobu2211/items/3fd42d5482a3331332d0#cloudformation%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E6%89%8B%E9%A0%86" target="_blank rel="nofollow noopener"">CloudFormationの詳しい設定について</a>

### 5 最終確認
最終確認を行い`送信`を選択

### 6 正常終了確認 
ステータスがCREATE_COMPLETEになったらスタック正常終了です。
![スクリーンショット 2022-11-22 22.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/990585d8-b6a0-5de4-0a15-7ff8cf6329a5.png)

## 参考にした記事
<a href="https://cloud5.jp/cf-ec2/" target="_blank rel="nofollow noopener"">CloudFormationによる【EC2】の構築</a>