タイトル通りです。
今回は普段コンソールから作成しているEC2をCloudformationで作ってみたので、その備忘として書いていきます。
Cloudformationのテンプレート形式はこちらにあります。
docs.aws.amazon.com
EC2のCloudformationのリソースタイプリファレンスは以下に記載されています。
docs.aws.amazon.com
今日使用したCloudformationは以下にアップしています。
github.com
実施作業
EC2を構築・起動する
cloudformationのyamlファイルを作成します。
AWSTemplateFormatVersion: "2010-09-09"
Description: EC2 template
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
# ベースとなるAMIのIDを指定(Windows Server 2019 Japanese)
ImageId: "ami-027a63125bb60c403"
# インスタンスタイプを指定
InstanceType: t2.micro
# Cドライブに設定するEBSを設定する
BlockDeviceMappings:
-
DeviceName: /dev/sda1
Ebs:
VolumeType: gp2
DeleteOnTermination: false
VolumeSize: 30
デプロイはAWS CLIの以下のコマンドを使用して行います。
docs.aws.amazon.com
docs.aws.amazon.com
cloudformation packageコマンドはS3バケットを指定する必要があるので、以下のコマンドでS3バケットを作成しておきます。(ただし今回は使いません)
$ aws s3api create-bucket --bucket test-tmp-20210301 --region ap-northeast-1 --create-bucket-configuration LocationConstraint=ap-northeast-1
S3バケットが作成されました。

以下のコマンドでpackageファイルを出力します。
$ aws cloudformation package --template ec2-instance.yaml --s3-bucket test-tmp-20210301 --output-template-file ec2-instance-packaged.yaml
出力されたpackageファイルはこちらです。
AWSTemplateFormatVersion: '2010-09-09'
Description: EC2 template
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-027a63125bb60c403
InstanceType: t2.micro
BlockDeviceMappings:
- DeviceName: /dev/sda1
Ebs:
VolumeType: gp2
DeleteOnTermination: false
VolumeSize: 30
続いて以下のコマンドでCloudformationをデプロイします。
$ aws cloudformation deploy --template-file ec2-instance-packaged.yaml --stack-name ec2-instance-stack
cloudformationがデプロイされ、stackが作成されています。
CREATE_COMPLETEとなっているのでリソースは作成できてそうです。

EC2が作成されていました。
アタッチされているIPやVPCを見る限り、デフォルトのVPCとサブネットに紐づいているようでした。

作成したEC2は不要になれば以下のコマンドでStackから削除することも可能です。
$ aws cloudformation delete-stack --stack-name ec2-instance-stack
CloudformationのDeleteOnTerminationパラメータをfalseに設定していたため、EC2は削除されましたがEBSは削除されずに残っています。

VPCとサブネットを指定してEC2を構築・起動する
さて、CloudformationでEC2を構築できることは確認できたので、次はもう少し設定を入れていきます。
以下の追加したパラメータは以下になります。
- サブネット
- keypair
- タグ
また併せてEBSのDeleteOnTerminationパラメータをtrueに変更しました。
修正後yamlファイル
AWSTemplateFormatVersion: "2010-09-09"
Description: EC2 template
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
# ベースとなるAMIのIDを指定(Windows Server 2019 Japanese)
ImageId: "ami-027a63125bb60c403"
# インスタンスタイプを指定
InstanceType: t2.micro
# 作成するサブネットを指定(test-subnet-a)
SubnetId: "subnet-XXXXXXXXXXXXXXXXXXX"
# keypair指定
KeyName: test-key
# タグ指定
Tags:
- key: Name
Value: "TEST-SERVER"
# Cドライブに設定するEBSを設定する
BlockDeviceMappings:
-
DeviceName: /dev/sda1
Ebs:
VolumeType: gp2
DeleteOnTermination: true
VolumeSize: 30
上記の内容でもう一度パッケージファイルを作成し、デプロイをします。
設定した内容でEC2が構築されていることが確認できます。

キーペアも想定通り設定されていました。

最後にStackを削除した時にEC2にアタッチされたEBSが削除されるか見てみます。
以下の通り、EC2と一緒に削除されていました。

感想及び所感
今回はCloudformationを使ってEC2を構築してみました。
手動でやるときはコンソールからそれっぽい設定を選んでやっていましたが、Cloudformationを使用することでちゃんと設定する内容を理解しながらできるので、とてもよかったです。