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

# はじめに

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

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

## 前回までのおさらい

テンプレートの定義には
Resources 以外に Outputs というオプションが存在する。

Outputs で出力されたパラメータはエクスポート名という名前で参照できる。
エクスポート名はクロススタック参照という方法で利用できる。

また、テンプレート内の値を参照する場合は組み込み関数を利用することで
動的に参照することが可能である。

[【AWS】用語を整理しながら学ぶ AWS - part5 Cloud Formation - 2](https://qiita.com/ymd65536/items/678cd34454798957379e)

## 前回の内容を実践

よくある VPC ネットワークを構築してみる。

| ファイル名          | 用途                               |
| :------------------ | :--------------------------------- |
| vpc_network.yml     | VPC の構成を管理                   |
| public_network.yml  | パブリックサブネットの構成を管理   |
| private_network.yml | プライベートサブネットの構成を管理 |

VPC ネットワークを定義する。

```yml:vpc_network.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MainVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/21
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: MainVpcfromCF

Outputs:
  MainVpc:
    Value: !Ref MainVpc
    Export:
      Name: MainVpcId

```

パブリックサブネットを定義する。

```yml:public_subnet.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  subnetName:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      VpcId: !ImportValue MainVpcId
      CidrBlock: 10.0.2.0/24
      Tags:
        - Key: Name
          Value: PublicSubnet
  secGroupName:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: PublicSecGrp
      GroupDescription: PublicSecGrp
      VpcId: !ImportValue MainVpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: MainVpc

Outputs:
  PublicSubnet:
    Value: !Ref subnetName
    Export:
      Name: PublicSubnet
  PublicSecGrp:
    Value: !GetAtt secGroupName.GroupId
    Export:
      Name: PublicSecGrp

```

続いてプライベートサブネットを定義する。

```yml:private_subnet.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  subnetName:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      VpcId: !ImportValue MainVpcId
      CidrBlock: 10.0.1.0/24
      Tags:
        - Key: Name
          Value: PrivateSubnet

Outputs:
  PrivateSubnet:
    Value: !Ref subnetName
    Export:
      Name: PrivateSubnet

```

## 次にやること

プライベートネットワークとパブリックサブネット内に EC2 を配置する。

| ファイル名      | 用途                                    |
| :-------------- | :-------------------------------------- |
| public_ec2.yml  | パブリックサブネット内の EC2 を管理     |
| private_ec2.yml | プライベートサブネットの内の EC2 を管理 |

次回の Part5 - 4 に持ち越し

### EC2 を テンプレートで定義すると

仮にですが、思いつきでパッどEC2を定義してみると...

``` yml:public_ec2.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  myEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: Mykeypair
      ImageId: ami-0992fc94ca0f1415a
      InstanceType: t2.micro
      Monitoring: false
      SecurityGroupIds:
        - !ImportValue PublicSecGrp
      SubnetId: !ImportValue PublicSubnet
      Tags:
        - Key: Name
          Value: CFec2

```

こんな感じになるかと思うのですが
個人的には幾つか気に入らない点がありまして文字数

## 気に入らない点

### キーペアの管理

鍵を管理するのが面倒くさい。

### AMI のID

コード内にIDをハードコートしたくない。
というのもリージョンごとに異なるIDとなる為
冗長化するときに一々、AMI IDを調べないといけない。

## じゃあどうするか

鍵は管理しない代わりにSSMを利用する。
AMIのIDは常に最新に保とうとしましたが
AMIが変わったことによる不具合などに悩まされたくないので一旦、ハードコートする。

良い方法を後程、考えます。

## まとめ

Cloud Formatinを利用してVPCネットワークを構築してサブネットを切りました。
次回はこのネットワークにEC2を構築します。

## おわり