AWS CloudFormation で VPC と EC2 インスタンスを自動構築する

はじめに

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 を使うことでインフラをコードで管理でき、再現性の高い環境構築が実現できました。
今後も有効活用できるよう色々勉強していきます。

コメントする