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が終了済みになる。

以上で完了。

コメント