はじめに
AWS CloudFormation を使って VPC・EC2 インスタンスを自動構築する手順をまとめます。
実際に試した際のトラブルシューティングも含めて紹介します。
構成図は以下です。シンプルなパブリックインスタンスになります。

ハマったポイント
テンプレートアップロード時のエラー
CloudFormation にテンプレートファイルをアップロードしようとするとエラーが発生しました。
原因は `Ref` で存在しないパラメータを参照していたためです。
アップロード時にバリデーションチェックが走るようです。パラメータ名を修正したら無事成功しました。
セキュリティグループ名を指定できない?
セキュリティグループを作成するとき、セキュリティグループ名を指定するには `SecurityGroupName` プロパティを使用します。
一部の情報では「このプロパティはデフォルトの VPC でのみ使用可能で、新たに作成する VPC では使用できない」とされていました。
しかし、公式ドキュメントを確認したところ、`GroupName` プロパティで設定できそうだったので試してみました。
以下のように GroupName プロパティを追加したところ、問題なく設定できました。
GroupName: 'roishi-cfn-test-ssh-sg'参照していた情報が古かったようです。
スタックの更新
「既存のテンプレートを置換」からテンプレートを差し替えることでスタックの更新も問題なく完了しました。
デプロイタイムラインでリソースの作成状況をリアルタイムに確認できるのが面白いポイントです。
最終的なテンプレート
AWSTemplateFormatVersion: "2010-09-09"
Description: EC2 Test
Parameters:
KeyName:
Type: AWS::EC2::KeyPair::KeyName
Description: 'EC2 Key Pair Name'
InstanceType:
Type: String
Default: t3.micro
AllowedValues:
- t3.micro
- t3.small
- t3.medium
Description: 'EC2 Instance Type'
Resources:
Vpc:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: '192.168.0.0/16'
Tags:
- Key: 'Name'
Value: 'roishi-cfn-test'
Subnet:
Type: 'AWS::EC2::Subnet'
Properties:
CidrBlock: '192.168.1.0/24'
MapPublicIpOnLaunch: true
Tags:
- Key: 'Name'
Value: 'roishi-cfn-subnet'
VpcId: !Ref Vpc
InternetGateway:
Type: 'AWS::EC2::InternetGateway'
Properties:
Tags:
- Key: 'Name'
Value: 'roishi-cfn-igw'
AttachGateway:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId: !Ref Vpc
InternetGatewayId: !Ref InternetGateway
RouteTable:
Type: 'AWS::EC2::RouteTable'
Properties:
Tags:
- Key: 'Name'
Value: 'roishi-cfn-rt'
VpcId: !Ref Vpc
Route:
Type: 'AWS::EC2::Route'
DependsOn: InternetGateway
Properties:
RouteTableId: !Ref RouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
SubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref Subnet
RouteTableId: !Ref RouteTable
EC2Instance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: "ami-0c036b62d1a414d7f"
InstanceType: !Ref InstanceType
SubnetId: !Ref Subnet
BlockDeviceMappings:
- DeviceName: '/dev/xvda'
Ebs:
VolumeType: 'gp2'
VolumeSize: 8
Tags:
- Key: 'Name'
Value: 'roishi-cfn-test'
SecurityGroupIds:
- !Ref SecurityGroup
KeyName: !Ref KeyName
SecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "cfnSecurityGroup"
VpcId: !Ref Vpc
Tags:
- Key: 'Name'
Value: 'roishi-cfn-test-ssh-sg'
GroupName: 'roishi-cfn-test-ssh-sg'
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: xxx.xxx.xx.x/xx # 接続元IPアドレスを指定まとめ
CloudFormation を使うことでインフラをコードで管理でき、再現性の高い環境構築が実現できました。
今後も有効活用できるよう色々勉強していきます。