CloudFormation にはテンプレートに1行ずつ定義していくやり方と、デザイナーというツールを使って視覚的にアイコンを組み合わせて作るやり方があります。
今までデザイナーの使い方がよくわからなくて使ったことがなかったですが、今回はそのデザイナーを使ってEC2インスタンス環境を構築する手順を解説します。
過去の CloudFormation の記事一覧です。
【AWS】CloudFormation の基本的な解説(VPCの作成手順)
【AWS】CloudFormation で Amazon EC2 インスタンスを作成する手順【単純な作成】【Part.1】
【AWS】CloudFormation で Amazon EC2 インスタンスを作成する手順【VPC&サブネット&セキュリティグループ&EC2インスタンス】【Part.2】
【AWS】CloudFormation と CloudWatch のスケジュール機能を使ってタグ付けされた EC2 と RDS をまとめて自動停止する設定手順
【AWS】CloudFormation のスタックのバックアップ及びリストア手順
最終的なイメージ
最終的には下図のような環境を構築します。
CloudFormation 設計
以下の設計で構築します。
VPC ← 192.168.0.0/24
サブネット ← 192.168.0.0/24
EIP ← インターネット経由でログインするために設定します。
InternetGateway ← インターネットに出ていくために設定します。
ルートテーブル ← 1つ作成します。
ルート ← デフォゲをインターネットゲートウェイに関連付けてインターネットに出ていけるようにします。
セキュリティグループ ← インターネット経由で ssh ログインできるように設定します。
EC2 インスタンス ← RedHat8 で構築します。
スタックを作成する
最初にスタックを作成します。
AWS 管理コンソールから「CloudFormation」 に移動します。
「スタックの作成」 ボタンをクリックします。
「スタックの作成」 画面で「デザイナーでテンプレートを作成」 をクリックします。
初期のデザイナーの画面は下図のようになっています。
最低限のオブジェクトを作成する
今回は EC2 インスタンスに ssh ログインができるという必要最低限の構成で構築します。
デザイナーを起動したら、以下のように必要最低限のオブジェクトを作成します。
VPC ← 大枠の VPC を作成します。
Subnet ← サブネットを作ります。
EC2Instance ← EC2インスタンスを作成します。
SecurityGroup ← セキュリティグループを作成します。
EIP ← Elastic IP アドレスを設定します。
RouteTable ← ルートテーブルを作成します。
Route ← ルートテーブルにルートを設定します。
InternetGateway ← インターネットにアクセスする場合必要です。
VPCGatewayAttachment ← インターネットにアクセスする場合必要です。
デザイナーで作成途中でプロパティを保存する方法
デザイナーで構成を作る場合、慣れない最初のうちは時間がかかります。
そのため、作成途中でプロパティを保存すると最初から作り直す必要がありません。
デザイナーの画面の左上の保存のアイコンをクリックします。
「保存」 をクリックします。
テンプレートの保存で「ローカルファイル」 を選択し任意のファイル名を記載して「保存」 ボタンをクリックします。
以下のようなテンプレートで保存されます。
VPC の作成
まず最初に大枠の VPC から作成します。
左側ペインより「リソースタイプ」 で「EC2」 を選択します。
「VPC」 を選択してドラッグ&ドロップします。
下図のように VPC が作成されることを確認します。
VPC の枠をクリックすることで VPC の枠を広げたり、形を変えることができます。
「VPC」 を選択して下図のように「プロパティ」 タブをクリックすると、細かく設定を入れることができます。
テンプレートの言語を「JSON」 から「YAML」 に変更することもできます。
Propertiesのカッコの中にカーソルを入れて「Ctrl+Space」 を押下します。
「Ctrl+Space」 を押下すると、設定できる項目一覧が表示されます。
AWS::EC2::VPC
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html
CidrBlock ← 必須。VPC のプライマリ IPv4 CIDR ブロックを指定します。
プロパティ設定後は下図のようになります。
■プロパティの内容
Resources:
EC2VPC5C7MU:
Type: ‘AWS::EC2::VPC’
Properties: {
CidrBlock: 192.168.0.0/24
}
Subnet の作成
次に Subnet(サブネット)を作成します。
左側ペインより「Subnet」 を選択してドラッグ&ドロップします。
AWS::EC2::Subnet
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html
CidrBlock ← 必須。サブネットに割り当てる IPv4 CIDR ブロックを設定します。
VpcId ← 必須。サブネットがある VPC の ID を設定します。
プロパティを入力すると「Designerが最新のものではないので、リフレッシュをクリックしてください。」 と表示されるので、「リフレッシュ」 ボタンをクリックします。
プロパティは以下のようになります。
■プロパティの内容
Resources:
EC2S1L2J3:
Type: ‘AWS::EC2::Subnet’
Properties:
VpcId: !Ref EC2VPC5C7MU
CidrBlock: 192.168.0.0/24
SecurityGroup の作成
次にセキュリティグループを指定します。
左側ペインより「SecurityGroup」 をドラッグ&ドロップします。
下図のようにドラッグ&ドロップします。
AWS::EC2::SecurityGroup
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html
GroupDescription ← 必須。セキュリティグループの説明を入れます。
プロパティは以下のようになります。
■プロパティの内容
Resources:
EC2SGTIX1:
Type: ‘AWS::EC2::SecurityGroup’
Properties:
GroupDescription: ssh login
VpcId: !Ref EC2VPC5C7MU
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
設定すると下図のようにセキュリティグループと VPC が線でつながります。
EC2Instance の作成
次に CE2 インスタンスを作成します。
ドラッグ&ドロップすると下図のようになります。
AWS::EC2::Instance
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html
ImageId ← 条件付き必須。AMI の ID を指定します。今回は、RedHat8 で構築するので ami-09f31cc5d5eecca1a を指定します。
InstanceType ← 必須ではない。インスタンスタイプによっては CloudFormation で指定できないものあるので注意です。t3.micro を 指定します。
KeyName ← 必須ではないですが、指定しないとログインができません。任意のキー(例では basic-network) を指定します。
PrivateIpAddress ← 必須ではない。プライマリ IPv4 アドレスです。今回は、192.168.0.10 を指定します。
SecurityGroupIds ← 条件付き必須。セキュリティグループを指定します。
SubnetId ← 必須ではない。インスタンスを起動するサブネットの ID を指定します。
■イメージID
イメージ ID はインスタンスの作成時に AMI の ID が表示されるので、これをコピーします。
プロパティは以下のようになります。
■プロパティの内容
Resources:
EC2I3PIMR:
Type: ‘AWS::EC2::Instance’
Properties:
ImageId: ami-096553c82f2f3fa8c
KeyName: basic-network
InstanceType: t3.micro
SubnetId: !Ref EC2S3ARYY
NetworkInterfaces:
– GroupSet:
– !Ref EC2SG3O51D
AssociatePublicIpAddress: ‘true’
DeviceIndex: ‘0’
SubnetId: !Ref
下図のように EC2 インスタンスとセキュリティグループが線でつながります。
EIP の作成
次に EIP を作成します。
ドラッグ&ドロップすると下図のようになります。
AWS::EC2::EIP
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-eip.html
InstanceId ← 必須ではない。インスタンスの ID を指定します。
プロパティは以下のようになります。
■プロパティの内容
Resources:
EC2EIP50O02:
Type: ‘AWS::EC2::EIP’
Properties: {
InstanceId: !Ref EC2I3PIMR
}
下図のように EC2 インスタンスと線がつながります。
InternetGateway の作成
次にインターネットゲートウェイを作成します。
ドラッグ&ドロップすると下図のようになります。
AWS::EC2::InternetGateway
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html
InternetGateway の場合、プロパティは以下のように何もない状態になります。
■プロパティの内容
Resources:
EC2IG54PVV:
Type: ‘AWS::EC2::InternetGateway’
Properties: {}
VPCGatewayAttachment の作成
次に VPCGatewayAttachment を作成します。
InternetGatewayの●にマウスを合わせ、VPCGatewayAttachmentを表示させます。
ドラッグして対象の VPC と接続させます。
AWS::EC2::VPCGatewayAttachment
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html
VpcId ← 必須
InternetGatewayId ← インターネットゲートウェイのIDを指定します。必須ではありません。
プロパティは以下のようになります。
■プロパティの内容
Resources:
EC2VPCG4UWYA:
Type: ‘AWS::EC2::VPCGatewayAttachment’
Properties:
InternetGatewayId: !Ref EC2IG54PVV
VpcId: !Ref EC2VPCEWYP
RouteTable の作成
次にルートテーブルを作成します。
ドラッグすると下図のようになります。
AWS::EC2::RouteTable
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route-table.html
プロパティは以下のようになります。
■プロパティの内容
Resources:
EC2RTTEXK:
Type: ‘AWS::EC2::RouteTable’
Properties:
VpcId: !Ref EC2VPCEWYP
Route の作成
次にルートを作成します。
ドラッグすると下図のようになります。
AWS::EC2::Route
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html
GatewayId ← 必須ではない。VPC にアタッチされているゲートウェイの ID。
RouteTableId ← 必須。ルートテーブルの ID。
DestinationCidrBlock ← 必須ではないが、設定しないとエラーになる。DestinationCidrBlock: 0.0.0.0/0 を追加する。
プロパティは以下のようになります。
■プロパティの内容
Resources:
EC2R3PAHH:
Type: ‘AWS::EC2::Route’
Properties:
RouteTableId: !Ref EC2RT2N379
GatewayId: !Ref EC2IG54PVV
DestinationCidrBlock: 0.0.0.0/0
SubnetRouteTableAssociation の作成
ルートテーブルとサブネットを関連付ける「SubnetRouteTableAssociation」 を作成します。
ルートテーブルの●をクリックして「SubnetRouteTableAssociation」 を表示させます。
ドラッグ&ドロップしてサブネットに関連付けます。
プロパティは以下のようになります。
■プロパティの内容
Resources:
EC2SRTA11SO3:
Type: ‘AWS::EC2::SubnetRouteTableAssociation’
Properties:
RouteTableId: !Ref EC2RT2N379
SubnetId: !Ref EC2S3ARYY
スタックの作成
設定が完了したらスタックを作成します。
数の「スタックの作成」 アイコンをクリックします。
「スタックの作成」 画面でテンプレートソースで「Amazon S3 URL」 を選択して、S3 のパスが入っていることを確認し「次へ」 ボタンをクリックします。
「スタックの詳細を指定」 画面で「スタックの名前」 を設定して「次へ」 ボタンをクリックします。
「スタックオプションの設定」 画面で必要なら設定して「次へ」 ボタンをクリックします。
「スタックの作成」 ボタンをクリックします。
下図のようにスタータスが「CREATE_COMPLETE」 となることを確認します。
作成したスタックのテンプレート
参考例として今回作成したスタックのテンプレートです。
AWSTemplateFormatVersion: 2010-09-09
Metadata:
‘AWS::CloudFormation::Designer’:
84ea3c02-9f7f-486c-b8ee-6df5705a4b3d:
size:
width: 480
height: 300
position:
x: 170
‘y’: 100
z: 0
embeds:
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00:
size:
width: 270
height: 170
position:
x: 340
‘y’: 160
z: 1
parent: 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
embeds:
– cd0f272a-1388-4301-bde2-f0975eb7cf8d
– 07fe6cc5-2ae5-438b-aef3-66a17cb75dca
iscontainedinside:
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
cd0f272a-1388-4301-bde2-f0975eb7cf8d:
size:
width: 60
height: 60
position:
x: 390
‘y’: 250
z: 2
parent: a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
embeds: []
iscontainedinside:
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
07fe6cc5-2ae5-438b-aef3-66a17cb75dca:
size:
width: 60
height: 60
position:
x: 500
‘y’: 210
z: 2
parent: a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
embeds: []
iscontainedinside:
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
– a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
8ffd937f-f85f-4cd2-afab-15dc1c714f5b:
size:
width: 60
height: 60
position:
x: 700
‘y’: 240
z: 0
embeds: []
isassociatedwith:
– 07fe6cc5-2ae5-438b-aef3-66a17cb75dca
49363f25-51c8-447d-acc8-cf6fcbfeff9c:
size:
width: 60
height: 60
position:
x: 70
‘y’: 220
z: 0
embeds: []
53b7c6ed-45b2-4d9b-a8c9-8185c2e51b2e:
source:
id: 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
target:
id: 49363f25-51c8-447d-acc8-cf6fcbfeff9c
z: 0
1297c55b-6ac3-4732-a61d-3a0f83cf2074:
size:
width: 120
height: 120
position:
x: 200
‘y’: 210
z: 1
parent: 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
embeds:
– 296392af-72b6-47cd-8765-9de283b6cc2d
iscontainedinside:
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
– 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
296392af-72b6-47cd-8765-9de283b6cc2d:
size:
width: 60
height: 60
position:
x: 230
‘y’: 240
z: 2
parent: 1297c55b-6ac3-4732-a61d-3a0f83cf2074
embeds: []
isassociatedwith:
– 49363f25-51c8-447d-acc8-cf6fcbfeff9c
iscontainedinside:
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
– 1297c55b-6ac3-4732-a61d-3a0f83cf2074
6b3f58f8-61cb-4c31-aefc-33ca1d415527:
source:
id: 1297c55b-6ac3-4732-a61d-3a0f83cf2074
target:
id: a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
z: 3
Resources:
EC2VPCEWYP:
Type: ‘AWS::EC2::VPC’
Properties:
CidrBlock: 192.168.0.0/24
Metadata:
‘AWS::CloudFormation::Designer’:
id: 84ea3c02-9f7f-486c-b8ee-6df5705a4b3d
EC2S3ARYY:
Type: ‘AWS::EC2::Subnet’
Properties:
VpcId: !Ref EC2VPCEWYP
CidrBlock: 192.168.0.0/24
Metadata:
‘AWS::CloudFormation::Designer’:
id: a31b5f3d-bdb2-40b8-81ce-3e5bacc96e00
EC2SG3O51D:
Type: ‘AWS::EC2::SecurityGroup’
Properties:
GroupDescription: ssh login
VpcId: !Ref EC2VPCEWYP
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Metadata:
‘AWS::CloudFormation::Designer’:
id: cd0f272a-1388-4301-bde2-f0975eb7cf8d
EC2I3PIMR:
Type: ‘AWS::EC2::Instance’
Properties:
ImageId: ami-07dd14faa8a17fb3e
KeyName: basic-network
InstanceType: t3.micro
NetworkInterfaces:
– GroupSet:
– !Ref EC2SG3O51D
AssociatePublicIpAddress: ‘true’
DeviceIndex: ‘0’
SubnetId: !Ref EC2S3ARYY
Metadata:
‘AWS::CloudFormation::Designer’:
id: 07fe6cc5-2ae5-438b-aef3-66a17cb75dca
EC2EIP50O02:
Type: ‘AWS::EC2::EIP’
Properties:
InstanceId: !Ref EC2I3PIMR
Metadata:
‘AWS::CloudFormation::Designer’:
id: 8ffd937f-f85f-4cd2-afab-15dc1c714f5b
EC2IG54PVV:
Type: ‘AWS::EC2::InternetGateway’
Properties: {}
Metadata:
‘AWS::CloudFormation::Designer’:
id: 49363f25-51c8-447d-acc8-cf6fcbfeff9c
EC2VPCG4UWYA:
Type: ‘AWS::EC2::VPCGatewayAttachment’
Properties:
InternetGatewayId: !Ref EC2IG54PVV
VpcId: !Ref EC2VPCEWYP
Metadata:
‘AWS::CloudFormation::Designer’:
id: 53b7c6ed-45b2-4d9b-a8c9-8185c2e51b2e
EC2RT2N379:
Type: ‘AWS::EC2::RouteTable’
Properties:
VpcId: !Ref EC2VPCEWYP
Metadata:
‘AWS::CloudFormation::Designer’:
id: 1297c55b-6ac3-4732-a61d-3a0f83cf2074
EC2R3PAHH:
Type: ‘AWS::EC2::Route’
Properties:
RouteTableId: !Ref EC2RT2N379
GatewayId: !Ref EC2IG54PVV
DestinationCidrBlock: 0.0.0.0/0
Metadata:
‘AWS::CloudFormation::Designer’:
id: 296392af-72b6-47cd-8765-9de283b6cc2d
EC2SRTA11SO3:
Type: ‘AWS::EC2::SubnetRouteTableAssociation’
Properties:
RouteTableId: !Ref EC2RT2N379
SubnetId: !Ref EC2S3ARYY
Metadata:
‘AWS::CloudFormation::Designer’:
id: 6b3f58f8-61cb-4c31-aefc-33ca1d415527
確認
EC2 インスタンス一覧を確認して新規で EC2 インスタンスが作成されていることを確認します。
ログイン確認
sshでログインできることを確認します。
This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
To register this system, run: insights-client –register
[ec2-user@ip-192-168-0-181 ~]$
[ec2-user@ip-192-168-0-181 ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.2 (Ootpa)
[ec2-user@ip-192-168-0-181 ~]$
スタックのテンプレートをバックアップし、リストアする場合の手順です。
【AWS】CloudFormation のスタックのバックアップ及びリストア手順
コメント