20新卒入社の加島です。
最近はAWSをやっているのでAWSの周辺で検証をしてみようかと思います。
今回はCloudFormation(以下CFn)を用いたEC2 Auto Scaling Groupスタックの作成を目指します。
次の図の通りです:
VPCの中にサブネットを切って、そのサブネットの中にAuto Scaling によってインスタンスが作られるというのを目指します。
Auto Scaling Groupには起動設定が食わせてあり、インスタンスはこの起動設定に応じて適切に作成されます。
Auto Scaling Groupスタックの作成の前に、まず、VPCを作っていきましょう。
チュートリアル: 別の AWS CloudFormation スタックのリソース出力を参照するのステップ1を参考にしています。
まず次のようなyaml形式のファイルを作りましょう。
大雑把には以下を行うテンプレートです。
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"を指定してください。
あとは次へを何度かクリックするだけで大丈夫です。しばらく待てばネットワークスタックが完成します。
では本編、AutoScalingGroupスタックの作成に入ります。
手順としては起動設定の作成->Auto Scaling Groupの作成となります。
次のようなyaml形式のファイルを作りましょう。
大雑把には以下を行うテンプレートです。
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クライアントでアクセスしてみましょう。
はい、見慣れた表示がされましたね。これで完了です!