CloudFormationを用いたEC2 AutoScalingGroupスタックの作成
20新卒入社の加島です。
最近はAWSをやっているのでAWSの周辺で検証をしてみようかと思います。
今回はCloudFormation(以下CFn)を用いたEC2 Auto Scaling Groupスタックの作成を目指します。
目次
目標とする構成
次の図の通りです:
VPCの中にサブネットを切って、そのサブネットの中にAuto Scaling によってインスタンスが作られるというのを目指します。
Auto Scaling Groupには起動設定が食わせてあり、インスタンスはこの起動設定に応じて適切に作成されます。
ネットワークスタックの作成
Auto Scaling Groupスタックの作成の前に、まず、VPCを作っていきましょう。
チュートリアル: 別の AWS CloudFormation スタックのリソース出力を参照するのステップ1を参考にしています。
まず次のようなyaml形式のファイルを作りましょう。
大雑把には以下を行うテンプレートです。
- VPCを作る
- サブネットを切る
- インターネットゲートウェイを作る
- VPCにインターネットゲートウェイをアタッチする
- ルートテーブルを作成する
- 上記ルートテーブルにインターネットに出られるように設定を行う
- サブネットにルートテーブルを関連付ける
- あるIPアドレスからのSSH接続だけ許すようなセキュリティグループを作成する
- 作ったリソースを他のスタックが名前で参照できるようにする
AWSTemplateFormatVersion: "2010-09-09" Description: Network Configuration Parameters: VpcCidrBlock: Description: Input Cidr Block of VPC Type: String Default: 10.1.0.0/16 AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2}) PublicSubnetACidrBlock: Description: Input Cidr Block of Public Subnet A Type: String Default: 10.1.0.0/18 AllowedPattern: (\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2}) Resources: VPC: Type: AWS::EC2::VPC Properties: EnableDnsSupport: true EnableDnsHostnames: true CidrBlock: Ref: VpcCidrBlock PublicSubnetA: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC AvailabilityZone: ap-northeast-1a CidrBlock: Ref: PublicSubnetACidrBlock InternetGateway: Type: AWS::EC2::InternetGateway VPCGatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: Ref: VPC InternetGatewayId: Ref: InternetGateway PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: Ref: VPC PublicRoute: Type: AWS::EC2::Route DependsOn: VPCGatewayAttachment Properties: RouteTableId: Ref: PublicRouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: Ref: InternetGateway PublicSubnetRouteTableAssociation: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: Ref: PublicSubnetA RouteTableId: Ref: PublicRouteTable SSHSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Enable SSH Ingress VpcId: Ref: VPC SecurityGroupIngress: IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: xxx.xxx.xxx.xxx/32 # 個人のグローバルIPアドレスなどを入れてください。 Outputs: VPCId: Description: VPC ID Value: Ref: VPC Export: Name: !Sub '${AWS::StackName}-VPCID' PublicSubnetA: Description: SubnetA ID Value: Ref: PublicSubnetA Export: Name: !Sub '${AWS::StackName}-SubnetID' WebServerSecurityGroup: Description: Security Group ID Value: !GetAtt SSHSecurityGroup.GroupId Export: Name: !Sub '${AWS::StackName}-SecurityGroupID'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
AWSTemplateFormatVersion : "2010-09-09"
Description :
Network Configuration
Parameters :
VpcCidrBlock :
Description :
Input Cidr Block of VPC
Type : String
Default : 10.1.0.0/ 16
AllowedPattern : ( \ d { 1 , 3 } ) \ . ( \ d { 1 , 3 } ) \ . ( \ d { 1 , 3 } ) \ . ( \ d { 1 , 3 } )/ ( \ d { 1 , 2 } )
PublicSubnetACidrBlock :
Description :
Input Cidr Block of Public Subnet A
Type : String
Default : 10.1.0.0/ 18
AllowedPattern : ( \ d { 1 , 3 } ) \ . ( \ d { 1 , 3 } ) \ . ( \ d { 1 , 3 } ) \ . ( \ d { 1 , 3 } )/ ( \ d { 1 , 2 } )
Resources :
VPC :
Type : AWS : : EC2 : : VPC
Properties :
EnableDnsSupport : true
EnableDnsHostnames : true
CidrBlock :
Ref : VpcCidrBlock
PublicSubnetA :
Type : AWS : : EC2 : : Subnet
Properties :
VpcId :
Ref : VPC
AvailabilityZone : ap- northeast- 1a
CidrBlock :
Ref : PublicSubnetACidrBlock
InternetGateway :
Type : AWS : : EC2 : : InternetGateway
VPCGatewayAttachment :
Type : AWS : : EC2 : : VPCGatewayAttachment
Properties :
VpcId :
Ref : VPC
InternetGatewayId :
Ref : InternetGateway
PublicRouteTable :
Type : AWS : : EC2 : : RouteTable
Properties :
VpcId :
Ref : VPC
PublicRoute :
Type : AWS : : EC2 : : Route
DependsOn : VPCGatewayAttachment
Properties :
RouteTableId :
Ref : PublicRouteTable
DestinationCidrBlock : 0.0.0.0/ 0
GatewayId :
Ref : InternetGateway
PublicSubnetRouteTableAssociation :
Type : AWS : : EC2 : : SubnetRouteTableAssociation
Properties :
SubnetId :
Ref : PublicSubnetA
RouteTableId :
Ref : PublicRouteTable
SSHSecurityGroup :
Type : AWS : : EC2 : : SecurityGroup
Properties :
GroupDescription : Enable SSH Ingress
VpcId :
Ref : VPC
SecurityGroupIngress :
IpProtocol : tcp
FromPort : 22
ToPort : 22
CidrIp : xxx . xxx . xxx . xxx/ 32 # 個人のグローバルIPアドレスなどを入れてください。
Outputs :
VPCId :
Description :
VPC ID
Value :
Ref : VPC
Export :
Name :
! Sub '${AWS::StackName}-VPCID'
PublicSubnetA :
Description :
SubnetA ID
Value :
Ref : PublicSubnetA
Export :
Name :
! Sub '${AWS::StackName}-SubnetID'
WebServerSecurityGroup :
Description :
Security Group ID
Value :
! GetAtt SSHSecurityGroup . GroupId
Export :
Name :
! Sub '${AWS::StackName}-SecurityGroupID'
|
作成したらAWSマネジメントコンソールでCloudFormation > スタックから「スタックの作成」を行いましょう。
「スタックの作成」で、テンプレートの準備では「テンプレートの準備完了」を選択し、テンプレートの指定では作成した上記テンプレートファイルをアップロードすればOKです。
次に「スタックの詳細を指定」で、スタックの名前といくつかのパラメータの設定を行います。
スタックの名前は何でも構いませんが、後述の手順でこの名前を用いるので控えておいてください。この記事では "NetworkStack" とします。
パラメータは上で示した構成図と合わせるのであればPublicSubnetACidrBlockでは"10.2.1.0/24"、VpcCidrBlockでは"10.2.0.0/16"を指定してください。
あとは次へを何度かクリックするだけで大丈夫です。しばらく待てばネットワークスタックが完成します。
Auto Scaling Group スタックの作成
では本編、AutoScalingGroupスタックの作成に入ります。
手順としては起動設定の作成->Auto Scaling Groupの作成となります。
次のようなyaml形式のファイルを作りましょう。
大雑把には以下を行うテンプレートです。
- 起動設定を作成する
- AMIはAmazon Linux AMIとする
- インスタンスタイプは t2.micro とする
- 作成したセキュリティグループと関連付ける
- Auto Scaling Groupを作成する
- 作成したサブネットと関連付ける
- インスタンスは1つだけ起動する
- 作成したインスタンスはわかりやすいように名前をつけておく
AWSTemplateFormatVersion: "2010-09-09" Description: LC and Auto Scaling Group Configuration Parameters: NetworkStackName: Description: Name of the Stack related with network configuration Type: String MinLength: 1 MaxLength: 255 AllowedPattern: ^[a-zA-Z][-a-zA-Z0-9]*$ Default: TestNetworkCrossStack Resources: # 起動設定 LaunchConfiguration: Type: AWS::AutoScaling::LaunchConfiguration Properties: AssociatePublicIpAddress: true ImageId: ami-0ee1410f0644c1cac #Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type InstanceMonitoring: false InstanceType: t2.micro KeyName: キーペア名 LaunchConfigurationName: 起動設定名 SecurityGroups: - Fn::ImportValue: !Sub '${NetworkStackName}-SecurityGroupID' AutoScalingGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: AutoScalingGroupName: <AutoScalingGroup名> DesiredCapacity: 1 LaunchConfigurationName: Ref: LaunchConfiguration MaxSize: 1 MinSize: 1 Tags: - Key: Name PropagateAtLaunch: true Value: インスタンスにつけたい名前 VPCZoneIdentifier: - Fn::ImportValue: !Sub '${NetworkStackName}-SubnetID'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
AWSTemplateFormatVersion : "2010-09-09"
Description :
LC and Auto Scaling Group Configuration
Parameters :
NetworkStackName :
Description :
Name of the Stack related with network configuration
Type : String
MinLength : 1
MaxLength : 255
AllowedPattern : ^ [ a- zA- Z ] [- a- zA- Z0- 9 ]* $
Default : TestNetworkCrossStack
Resources :
# 起動設定
LaunchConfiguration :
Type : AWS : : AutoScaling : : LaunchConfiguration
Properties :
AssociatePublicIpAddress : true
ImageId : ami- 0ee1410f0644c1cac #Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type
InstanceMonitoring : false
InstanceType : t2 . micro
KeyName : キーペア名
LaunchConfigurationName : 起動設定名
SecurityGroups :
- Fn : : ImportValue :
! Sub '${NetworkStackName}-SecurityGroupID'
AutoScalingGroup :
Type : AWS : : AutoScaling : : AutoScalingGroup
Properties :
AutoScalingGroupName : < AutoScalingGroup名 >
DesiredCapacity : 1
LaunchConfigurationName :
Ref : LaunchConfiguration
MaxSize : 1
MinSize : 1
Tags :
- Key : Name
PropagateAtLaunch : true
Value : インスタンスにつけたい名前
VPCZoneIdentifier :
- Fn : : ImportValue :
! Sub '${NetworkStackName}-SubnetID'
|
作成したらAWSマネジメントコンソールでCloudFormation > スタックから「スタックの作成」を行いましょう。
ネットワークスタック同様に作成したyamlファイルはアップロードしてください。
詳細設定でのスタック名は任意の名前で構いません。一方でパラメータ設定では、先に作った「ネットワークスタック」の名前を正しく入力する必要があります。本記事では"NetworkStack"です。
あとは次へを何度かクリックするだけです。
作成に随分と時間がかかりますが、しばらく待てばAuto Scaling Group スタックが作成され、インスタンスも起動します。
インスタンスへの接続
インスタンス一覧を見ればAuto Scalingによって作成されたインスタンスのパブリックIPアドレスが表示されているはずなので、お好きなSSHクライアントでアクセスしてみましょう。
はい、見慣れた表示がされましたね。これで完了です!
アジアクエスト株式会社では一緒に働いていただける方を募集しています。
興味のある方は以下のURLを御覧ください。