CloudformationでVPCやEC2を作成する

AWS

AWS Cloudformationを使ってVPCやEC2を作成してみます。
私はAWSをなるべく無料枠で使用したいので無料枠の有効期限(1年)が切れる度にアカウントを新規作成しています。
その際、新規作成したアカウントにVPCやサブネット等をイチから作成するのは面倒なので予めコード化したリソースをCloudformationで実行し作成することにしてます。

Cloudformationテンプレート

Cloudformationのテンプレート(実行ファイル)として「YAML」と「JSON」の2パターンありますが、今回は「YAML」を使用していきます。

テンプレート作成のためのマニュアルはこちらを参照します。

まずはVPC等のネットワークリソースを作成し、その後EC2インスタンスを作成します。

YAML

VPC作成のYAML

VPC等のネットワークリソース作成用のyamlを下記のとおり定義。

テンプレートの書き方についてはこちらを参照。

AWSTemplateFormatVersion: "2010-09-09"
Description: Create VPC Subnet

###------------------------------------------------------------#
### Parameters
###------------------------------------------------------------#

Parameters:

#### VPCアドレス
  VPCCIDR:
    Type: String
    Default: "192.168.0.0/16"

#### パブリックサブネット(メイン)
  PublicSubnetMainCIDR:
    Type: String
    Default: "192.168.1.0/24"

#### パブリックサブネット(サブ)
  PublicSubnetSubCIDR:
    Type: String
    Default: "192.168.11.0/24"

#### プライベートサブネット(メイン)
  PrivateSubnetMainCIDR:
    Type: String
    Default: "192.168.2.0/24"

#### プライベートサブネット(サブ)
  PrivateSubnetSubCIDR:
    Type: String
    Default: "192.168.21.0/24"

###------------------------------------------------------------#
### Resources
###------------------------------------------------------------#
Resources:

#### VPC
  VPC:
    Type: 'AWS::EC2::VPC'
    Properties:
    
      # VPCアドレス
      CidrBlock: !Ref VPCCIDR
      
      # DNS解決
      EnableDnsSupport: "true"
      
      # DNSホスト名
      EnableDnsHostnames: "true"
      
      # タグ
      Tags:
        - Key: Name
          Value: !Sub "vpc-main"

#### サブネット

  # パブリックサブネット(メイン)
  PublicSubnetMain:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PublicSubnetMainCIDR
      AvailabilityZone: "ap-northeast-1c"
      Tags:
        - Key: Name
          Value: "public-subnet-1"
          
  # パブリックサブネット(サブ)
  PublicSubnetSub:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PublicSubnetSubCIDR
      AvailabilityZone: "ap-northeast-1d"
      Tags:
        - Key: Name
          Value: "public-subnet-2"

  # プライベートサブネット(メイン)
  PrivateSubnetMain:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PrivateSubnetMainCIDR
      AvailabilityZone: "ap-northeast-1c"
      Tags:
        - Key: Name
          Value: "private-subnet-1"
          
  # プライベートサブネット(サブ)
  PrivateSubnetSub:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PrivateSubnetSubCIDR
      AvailabilityZone: "ap-northeast-1d"
      Tags:
        - Key: Name
          Value: "private-subnet-2"

#### インターネットゲートウェイ

  InternetGateway:
    Type: 'AWS::EC2::InternetGateway'
    Properties:
      Tags: 
        - Key: Name
          Value: "igw-main"

  AttachInternetGateway:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

#### ルートテーブル

  # パブリックサブネット用ルートテーブル
  PublicRouteTable: 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: "public-routetable"
          
  # プライベートサブネット用ルートテーブル
  PrivateRouteTable: 
    Type: "AWS::EC2::RouteTable"
    Properties: 
      VpcId: !Ref VPC 
      Tags: 
        - Key: Name
          Value: "private-routetable"

#### ルーティング
  # インターネットゲートウェイ(パブリックさサブネット用)
  PublicRoute:
    Type: 'AWS::EC2::Route'
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: "0.0.0.0/0"
      GatewayId: !Ref InternetGateway

  # パブリックサブネット(メイン)用
  PublicSubnetMainRouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref PublicSubnetMain
      RouteTableId: !Ref PublicRouteTable

  # パブリックサブネット(サブ)用
  PublicSubnetSubRouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref PublicSubnetSub
      RouteTableId: !Ref PublicRouteTable
 
  # プライベートサブネット(メイン)用
  PrivateSubnetMainRouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref PrivateSubnetMain
      RouteTableId: !Ref PrivateRouteTable
      
  # プライベートサブネット(サブ)用
  PrivateSunetSubRouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref PrivateSubnetSub
      RouteTableId: !Ref PrivateRouteTable

# ------------------------------------------------------------#
#  Outputs
# ------------------------------------------------------------#
Outputs:
#### VPC
  VPC:
    Value: !Ref VPC
    Export:
      Name: "vpc-id"

  VPCCIDR:
    Value: !Ref VPCCIDR
    Export:
      Name: "vpc-cidr"

#### Subnet
  PublicSubnetMain:
    Value: !Ref PublicSubnetMain
    Export:
      Name: "public-subnet-mai-id"

  PublicSubnetMainCIDR:
    Value: !Ref PublicSubnetMainCIDR
    Export:
      Name: !Sub "public-subnet-main-cidr"

  PublicSubnetSub:
    Value: !Ref PublicSubnetSub
    Export:
      Name: !Sub "public-subnet-sub-id"

  PublicSubnetSubCIDR:
    Value: !Ref PublicSubnetSubCIDR
    Export:
      Name: !Sub "public-subnet-sub-cidr"

  PrivateSubnetMain:
    Value: !Ref PrivateSubnetMain
    Export:
      Name: !Sub "private-subnet-main-id"

  PrivateSubnetMainCIDR:
    Value: !Ref PrivateSubnetMainCIDR
    Export:
      Name: !Sub "private-subnet-main-cidr"

  PrivateSubnetSub:
    Value: !Ref PrivateSubnetSub
    Export:
      Name: !Sub "private-subnet-sub-id"

  PrivateSubnetSubCIDR:
    Value: !Ref PrivateSubnetSubCIDR
    Export:
      Name: !Sub "private-subnet-sub-cidr"
 
 
#### Route
  PublicRouteTable:
    Value: !Ref PublicRouteTable
    Export:
      Name: !Sub "public-routetable"

  PrivateRouteTable:
    Value: !Ref PrivateRouteTable
    Export:
      Name: !Sub "private-routetable"

#### Internetgateway
  InternetGateway:
    Value: !Ref InternetGateway
    Export:
      Name: !Sub "internetgateway"

EC2インスタンス作成のYAML

EC2を作成するyamlは下記のとおり。

“LaunchTemplate”を使用している理由としては、「TagSpecifications」によるrootボリュームやネットワークインタフェースにタグ名を付けるためと、「MetadataOptions」によるインスタンスメタデータの指定をするためです。
※「AWS::EC2::Instance」の中で上記を指定することができないためです。

AWSTemplateFormatVersion: "2010-09-09"
Description: Create EC2 from AMI

###------------------------------------------------------------#
### Parameters
###------------------------------------------------------------#
Parameters:

#### インスタンスタイプ
  InstanceType:
    Type: String
    Default: t3.micro
    AllowedValues:
      - t2.micro
      - t3.micro
    ConstraintDescription: error
  
#### AMI
  ImageId:
    Default: ami-0c83761315c7e07ec
    Type: String
    
#### サブネット
  Subnet:
    Default: subnet-00847f3a2f659e433
    Type: String
    AllowedValues:
     - subnet-00847f3a2f659e433
     - subnet-0c4166124fadd89e7

#### IPアドレス
  PrivateIpv4:
    Default: 192.168.1.10
    Type: String
    

#### セキュリティーグループ
  SecurityGroup:
    Default: sg-04e4de147ba991996
    Type: String    
    
#### スナップショット
  Snapshot01:
    Description: DataVolume
    Default: snap-08be5fadd51c424b5
    Type: String

#### キーペア
  keypair:
    Default: keypair-3361
    Type: String
    
#### IAMロール 
  iamrole:
    Default: CloudWatchAccess
    Type: String

#### 詳細モニタリング
  Monitoring:
    Default: false
    Type: String
    AllowedValues:
     - true
     - false
    
#### 削除保護
  DeleteTermination:
    Default: false
    Type: String
    AllowedValues:
     - true
     - false
     
###------------------------------------------------------------#
### Resources
###------------------------------------------------------------#
Resources:

#### EC2インスタンス
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
    
      # AMI
      ImageId: !Ref ImageId
      
      # インスタンスタイプ
      InstanceType: !Ref InstanceType
      
      # ネットワークインタフェース
      NetworkInterfaces:
       - DeviceIndex: 0
       
         # 説明
         Description: test-NIC
         
         # パブリックIPアドレス
         AssociatePublicIpAddress: false

         # プライベートIPアドレス
         PrivateIpAddress: !Ref PrivateIpv4
         
         # セキュリティーグループ
         GroupSet: 
          - !Ref SecurityGroup
          
         # サブネット
         SubnetId: !Ref Subnet

      # IAMロール
      IamInstanceProfile: !Ref iamrole
      
      # キーペア
      KeyName: !Ref keypair
      
      # 詳細モニタリング
      Monitoring: !Ref Monitoring
      
      # 削除保護
      DisableApiTermination: !Ref DeleteTermination

      # ボリューム
      BlockDeviceMappings:  
        - DeviceName: /dev/sda1
          Ebs:  
            VolumeType: gp2
        - DeviceName: /dev/sdb
          Ebs:
            SnapshotId: !Ref Snapshot01
            VolumeType: gp2
            
      # タグ
      Tags:
        - Key: 'Name'
          Value: 'test-ec2'

      # テンプレート
      LaunchTemplate:
          LaunchTemplateId: !Ref LaunchTemplate
          Version: 1

#### テンプレート
####Volumeやネットワークインターフェースへのタグ付与、メタデータのバージョン指定にはLaunchTemplateから指定する必要あり
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties:
        # テンプレート名
        LaunchTemplateName: test-ec2-template
        
        # テンプレート内の値
        LaunchTemplateData: 
        
           # タグ
           TagSpecifications:
           
            # rootボリューム
            - ResourceType: volume
              Tags:
                 - Key: Name
                   Value: ebs-test-ec2-root
                   
            # ネットワークインタフェース
            - ResourceType: network-interface
              Tags:
                 - Key: Name
                   Value: eni-test-ec2-eth0

           # メタデータ(V2を設定するにはrequiredを指定)
           MetadataOptions:
               HttpTokens: required


###------------------------------------------------------------#
### Output Parameters
###------------------------------------------------------------#
Outputs:
  EC2:
      Value: !Ref EC2Instance
      Export:
        Name: "test-ec2"

Cloudformation実行

VPC作成のスタック実行

まずはCloudformationでVPCを作成していきます。

vpc作成用のyamlファイルをアップロード。

スタックの名前と各パラメータを設定(パタメータはデフォルト値をそのまま使用)

あとはそのまま「次へ」で進めていってスタックを送信。

ステータスがCREATE_COMPLETEになれば作成完了。
VPCやサブネット、ルーティングされてます。

EC2作成のスタック実行

同様にEC2のスタックも実行。
値はテンプレートのデフォルト値を使用。

テンプレートの値どおりの設定でEC2が作成されます。

テンプレートも作成されてます。

作成したリソースの削除

Cloudformationで作成したVPCやEC2はスタックを削除することにより全て削除されます。

EC2が終了済みになる。

以上で完了。

コメント

タイトルとURLをコピーしました