AWS_Cloudformationで環境構築してみた②

前回の記事
https://qiita.com/shinichi_yoshioka/items/487662c0749fe7b1ca8c

前回の続きで、Networkレイヤは作成済。
以下のシンプルな構成で、今回はEC2インスタンスとセキュリティグループをCloudFormationで作成します。
![CloudFormation構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/6d960192-3d92-7ed2-67fc-b11d21bf1391.png)

# テンプレートの作成
①CloudFormationのymlを作成するにあたって、CloudFormationのRain(CLI実行ツール)を使ってテンプレート（EC2用ymlとセキュリティグループ用yml）を出力する。
Rainの使い方の詳細は以下のURLを参照。
https://dev.classmethod.jp/articles/aws-cloudformation-rain/

②出力されたymlそれぞれをクロススタック参照するようにパラメータを入れる。
**Secutiry.yml**

```
AWSTemplateFormatVersion: "2010-09-09"

Description: Template generated by rain

Resources:
  MySecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow SSH from ALL
      SecurityGroupEgress:
        - Description: Outbound
          CidrIp: 0.0.0.0/0
          IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          #CidrIpv6: CHANGEME # Optional
          #DestinationPrefixListId: CHANGEME # Optional
          #DestinationSecurityGroupId: CHANGEME # Optional

      SecurityGroupIngress:
        - Description: Inbound
          CidrIp: 0.0.0.0/0
          IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          #CidrIpv6: CHANGEME # Optional
          #SourcePrefixListId: CHANGEME # Optional
          #SourceSecurityGroupId: CHANGEME # Optional
          #SourceSecurityGroupName: CHANGEME # Optional
          #SourceSecurityGroupOwnerId: CHANGEME # Optional
          
      Tags:
        - Key: Name
          Value: TEST-SG
      VpcId: vpc-0af10c6c61fb430cc

Outputs:
  MySecurityGroupGroupId:
    Value: !GetAtt MySecurityGroup.GroupId
    Export:
      Name: TEST-SGfromCF
```

パラメータメモ
SecurityGroupEgress:　セキュリティグループのアウトバウンド
SecurityGroupIngress:　セキュリティグループのインバウンド
Outputs:　GetAtt関数を用いてMySecurityGroupのGroupIdを「TEST-SGfromCF」の名前タグをつけてエクスポートする






**Application.yml** (EC2インスタンス作成)

```
AWSTemplateFormatVersion: "2010-09-09"

Description: Template generated by rain

Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: Secret-key
      AvailabilityZone: ap-northeast-1a
      ImageId: ami-0f27d081df46f326c
      InstanceType: t2.micro
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          #DeleteOnTermination: false # Optional
          #Description: CHANGEME # Optional
          DeviceIndex: "0"
          GroupSet:
            - !ImportValue TEST-SGfromCF
          SubnetId: subnet-068305cddc05d01bd
      #SecurityGroupIds:
        #- !ImportValue TEST-SGfromCF
      #SecurityGroups:
        #- !ImportValue TEST-SGfromCF
      #SubnetId: subnet-068305cddc05d01bd
      Tags:
        - Key: Name
          Value: TEST-EC2_fromCF
      #UserData: CHANGEME # Optional
      #Volumes:
        #- Device: CHANGEME
          #VolumeId: CHANGEME
```
パラメータメモ
KeyName:秘密鍵の名前(.pemは不要)
ImageId: ami-0f27d081df46f326c　←AmazonLinux
AssociatePublicIpAddress: true ←パブリックIPアドレスを自動で割り当てる
DeviceIndex: "0"　←自動でパブリックIPアドレスを割り当てる際は"0"にする
GroupSet: Import関数でセキュリティグループを参照


# スタックを作成
マネージメントコンソール- **[CloudFormation]**から**[スタックの作成]**をクリックし、
Application.ymlとSecutiry.ymlをアップロードして、スタックを作成する。
![Security-Layer.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/c05432eb-0c8b-6d17-df7d-96f56e9924a9.png)
![Application-Layer.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/f445c891-4cf4-b599-6e54-26bd61532f38.png)
イベントタブのステータスがCREATE_COMPLETEになっていれば、正常に作成されたことを確認できる。
作成したEC2にセキュリティグループが適用され、EC2に秘密鍵を使ってSSH接続できることを確認した。

![EC2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/86ac63d9-2c91-4c66-1148-881bd2a14158.png)

# 最後に
EC2のセキュリティグループに関して紛わしい部分があるので、以下にメモを残しておきます。
①NetworkInterfaces配下のGroupSet・・・EC2インスタンス起動時に新しくネットワークインターフェースを作成する場合にセキュリティグループのIDを参照する際に使用
②SecurityGroups・・・デフォルトVPCのセキュリティグループを作成する際に使用
③SecurityGroupIds・・・推奨。参照するセキュリティグループ(AWS::EC2::SecurityGroup)を作成して、それを参照する際に使用

![謎.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032344/7ca825e4-63b6-31c9-ffd4-69a7a0e4b69b.png)

***
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com