CloudFormation で EC2 インスタンス構築のテンプレートを解説します。
【AWS】CloudFormation の基本的な解説(VPCの作成手順)
【AWS】CloudFormation で Amazon EC2 インスタンスを作成する手順【単純な作成】【Part.1】
【AWS】CloudFormation で EC2 インスタンス(Amazon Linux2)を作成する手順【コマンドラインから実行】【Part.2】
一番シンプルな EC2 インスタンスのテンプレート
以下の一番シンプルなEC2インスタンス構築のテンプレートを発展させていきます。
■一番シンプルな EC2 インスタンスのテンプレート
AWSTemplateFormatVersion: “2010-09-09”
Description: “Template EC2 Create”
Resources:
MyEC2Instance: # Amazon Linux2 の構築
Type: AWS::EC2::Instance
Properties:
ImageId: “ami-09ebacdc178ae23b7” # Amazon Linux 2 AMI (HVM), SSD Volume Type
InstanceType: “t2.micro”
KeyName: “DevOps-test-EC2-key” # 既存のキーペアを指定します。
BlockDeviceMappings:
– DeviceName: “/dev/sdm”
Ebs:
VolumeType: “io1”
Iops: “200”
DeleteOnTermination: “false”
VolumeSize: “20”
– DeviceName: “/dev/sdk”
NoDevice: {}
このテンプレートはデフォルトの VPC に自動的にIPアドレスを割り振られて構築されます。
しかしこれだけで簡単に EC2 インスタンスを構築できます。
■EC2 インスタンスのテンプレート
AWSTemplateFormatVersion: “2010-09-09”
Description: “Template EC2 Create”
Resources:
MyEC2Instance: # Amazon Linux2 の構築
Type: AWS::EC2::Instance
Properties:
ImageId: “ami-09ebacdc178ae23b7” # Amazon Linux 2 AMI (HVM), SSD Volume Type
InstanceType: “t2.micro”
AvailabilityZone: ap-northeast-1a # アベイラビリティの指定
SubnetId:subnet-07bf3f32c417b33a3 # サブネットdevops-test-subnet-01のID
KeyName: “DevOps-test-EC2-key” # 既存のキーペアの指定
BlockDeviceMappings:
– DeviceName: “/dev/sdm”
Ebs:
VolumeType: “gp2” # 汎用SSD(gp2)
Iops: “100”
DeleteOnTermination: “false”
VolumeSize: “8” # ディスクサイズ8GB
– DeviceName: “/dev/sdk”
NoDevice: {}
Tags:
– Key: Name
Value: devops-test-ec01
ブロックデバイスマッピングの設定
ブロックデバイスマッピングの設定について調べました。
■ブロックデバイスマッピングの設定
AWSTemplateFormatVersion: “2010-09-09”
Description: “Template EC2 Create”
Resources:
MyEC2Instance: # Amazon Linux2 の構築
Type: AWS::EC2::Instance
Properties:
ImageId: “ami-09ebacdc178ae23b7” # Amazon Linux 2 AMI (HVM), SSD Volume Type
InstanceType: “t2.micro”
AvailabilityZone: ap-northeast-1a # アベイラビリティの指定
SubnetId:subnet-07bf3f32c417b33a3 # サブネットdevops-test-subnet-01のID
KeyName: “DevOps-test-EC2-key” # 既存のキーペアの指定
BlockDeviceMappings: ← ここからブロックデバイスマッピングの設定をしています。
– DeviceName: “/dev/sdm”
Ebs:
VolumeType: “gp2” # 汎用SSD(gp2)
Iops: “100”
DeleteOnTermination: “false”
VolumeSize: “8” # ディスクサイズ8GB
– DeviceName: “/dev/sdk”
NoDevice: {}
Tags:
– Key: Name
Value: devops-test-ec01
AWS 公式サイトのテンプレートを参考にテンプレートを作ってますが、その中にデバイスマッピングの設定があります。
上のテンプレートでは2つのデバイスマッピングの設定をしていて、1つは DeviceName が /dev/sdm です。
もう1つは NoDevice になっています。
以下、ブロックデバイスマッピングについての詳細な解説です。
ブロックデバイスマッピング
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html
上の公式サイトの説明を調べると NoDevice の意味は「デバイスのマッピングを省略する 」ということです。
ということは、下の設定の意味は /dev/sdk には何もデバイスをマッピングしませんということになります。
~ 省略 ~
– DeviceName: “/dev/sdk”
NoDevice: {}
~ 省略 ~
しかし、上の設定はある意味他のテンプレートを参考にしただけなので、この設定には意味がないというか不要ということになります。
今回は Amazon Linux2 の AMI を基に EC2 インスタンスを起動(構築)しましたが、これがもしカスタマイズした AMI で、且つ /dev/sdk デバイスに何かしらデータがあるが、今回構築する EC2 インスタンスには不要ということがはっきりしている場合には NoDevice の設定は意味があるかもしれませんが、今回に関しては何の意味もないことになります。
セキュリティグループを一緒に構築する EC2 インスタンスのテンプレート
EC2 インスタンス構築時に一緒にセキュリティグループも作成するテンプレートです。
■セキュリティグループを一緒に構築する EC2 インスタンスのテンプレート
AWSTemplateFormatVersion: “2010-09-09”
Description: “Template EC2 Create”
Resources:
DevOpsTestEC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: “allow connections from specified CIDR ranges”
GroupName: devops-test-sg # セキュリティグループ名
VpcId: vpc-0f592cxxxxxxxxxx # VPCを指定
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
MyEC2Instance: # Amazon Linux2 の構築
Type: AWS::EC2::Instance
Properties:
ImageId: “ami-09ebacdc178ae23b7” # Amazon Linux 2 AMI (HVM), SSD Volume Type
InstanceType: “t2.micro” # インスタンスタイプを指定
AvailabilityZone: ap-northeast-1a # アベイラビリティの指定
SubnetId: subnet-07bf3f32c417b33a3 # サブネットdevops-test-subnet-01のID
SecurityGroupIds:
– !Ref DevOpsTestEC2SecurityGroup # !Ref で DevOpsTestEC2SecurityGroup のセキュリティグループのIDを取得
KeyName: “DevOps-test-EC2-key” # 既存のキーペアの指定
BlockDeviceMappings:
– DeviceName: “/dev/sdm”
Ebs:
VolumeType: “gp2” # 汎用SSD(gp2)
DeleteOnTermination: “false”
VolumeSize: “8” # ディスクサイズ8GB
– DeviceName: “/dev/sdk”
NoDevice: {}
Tags:
– Key: Name
Value: devops-test-ec01 # Nameタグを設定
■複数のセキュリティグループを設定する場合
AWSTemplateFormatVersion: “2010-09-09”
Description: “Template EC2 Create”
Resources:
DevOpsTestEC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: “allow connections from specified CIDR ranges”
GroupName: devops-test-sg
VpcId: vpc-0f592c5fb1d9e5e15
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Description: “Port 80 for Internet”
– IpProtocol: tcp # 以下のように繰り返し記述して複数のルールを作成する
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Description: “Port 443 for Internet”
– IpProtocol: tcp # 以下のように繰り返し記述して複数のルールを作成する
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Description: “Port 22 for ssh login”
myENI:
Type: AWS::EC2::NetworkInterface
Properties:
Tags:
– Key: stack
Value: production
Description: A nice description.
SourceDestCheck: ‘false’
GroupSet:
– !Ref DevOpsTestEC2SecurityGroup # !Ref で DevOpsTestEC2SecurityGroup のセキュリティグループのIDを取得
SubnetId: subnet-07bf3f32c417b33a3 # サブネットdevops-test-subnet-01のID
PrivateIpAddress: 172.31.1.22 # プライベートIPアドレス
MyEC2Instance: # Amazon Linux2 の構築
Type: AWS::EC2::Instance
Properties:
ImageId: “ami-09ebacdc178ae23b7” # Amazon Linux 2 AMI (HVM), SSD Volume Type
InstanceType: “t2.micro”
AvailabilityZone: ap-northeast-1a # アベイラビリティの指定
NetworkInterfaces:
– NetworkInterfaceId:
!Ref myENI
DeviceIndex: ‘0’
KeyName: “DevOps-test-EC2-key” # 既存のキーペアの指定
BlockDeviceMappings:
– DeviceName: “/dev/sdm”
Ebs:
VolumeType: “gp2” # 汎用SSD(gp2)
DeleteOnTermination: “false”
VolumeSize: “8” # ディスクサイズ8GB
– DeviceName: “/dev/sdk”
NoDevice: {}
Tags:
– Key: Name
Value: devops-test-ec01
EC2 インスタンスのプライベートIPアドレスを指定する
プライベートIPを指定して EC2 インスタンスを構築する場合ですが、せっかく AWS というクラウド環境を利用しているので、プライベートIPアドレスを利用しないような構成を考える方がよいと思います。
■プライベートIPを指定して EC2 インスタンスを構築する場合
AWSTemplateFormatVersion: “2010-09-09”
Description: “Template EC2 Create”
Resources:
DevOpsTestEC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: “allow connections from specified CIDR ranges”
GroupName: devops-test-sg
VpcId: vpc-0f592c5fb1d9e5e15
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Description: “Port 80 for Internet”
– IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Description: “Port 443 for Internet”
– IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Description: “Port 22 for ssh login”
myENI:
Type: AWS::EC2::NetworkInterface
Properties:
Tags:
– Key: stack
Value: production
Description: A nice description.
SourceDestCheck: ‘false’
GroupSet:
– !Ref DevOpsTestEC2SecurityGroup # !Ref で DevOpsTestEC2SecurityGroup のセキュリティグループのIDを取得
SubnetId: subnet-07bf3f32c417b33a3 # サブネットdevops-test-subnet-01のID
PrivateIpAddress: 172.31.1.22 # プライベートIPアドレス
MyEC2Instance: # Amazon Linux2 の構築
Type: AWS::EC2::Instance
Properties:
ImageId: “ami-09ebacdc178ae23b7” # Amazon Linux 2 AMI (HVM), SSD Volume Type
InstanceType: “t2.micro”
AvailabilityZone: ap-northeast-1a # アベイラビリティの指定
NetworkInterfaces:
– NetworkInterfaceId:
!Ref myENI
DeviceIndex: ‘0’
KeyName: “DevOps-test-EC2-key” # 既存のキーペアの指定
BlockDeviceMappings:
– DeviceName: “/dev/sdm”
Ebs:
VolumeType: “gp2” # 汎用SSD(gp2)
DeleteOnTermination: “false”
VolumeSize: “8” # ディスクサイズ8GB
– DeviceName: “/dev/sdk”
NoDevice: {}
Tags:
– Key: Name
Value: devops-test-ec01
Address is in subnet’s reserved address rangeでエラー
IPアドレス指定に予約アドレスを指定すると以下のエラーが出力されます。
Address is in subnet’s reserved address range (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterValue; Request ID: ae0b3f86-0524-4a77-88f8-5aebd2e79149; Proxy: null)
■予約 IP アドレス
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Subnets.html
Network interfaces and an instance-level subnet ID may not be specified on the same request でエラー
サブネットIDとセキュリティグループの場所を間違えると以下のエラーが出力されます。
Network interfaces and an instance-level subnet ID may not be specified on the same request (Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterCombination; Request ID: 9089b9ff-14ea-4997-82de-75d8a4443a0e; Proxy: null)
■原因
セキュリティグループとサブネットIDの指定は「Type: AWS::EC2::NetworkInterface」 に記載します。
「Type: AWS::EC2::Instance」 の方にに記載すると上のエラーが出力されます。
■正しい位置に記載した例
AWSTemplateFormatVersion: “2010-09-09”
Description: “Template EC2 Create”
Resources:
~ 省略 ~
myENI:
Type: AWS::EC2::NetworkInterface
Properties:
Tags:
– Key: stack
Value: production
Description: A nice description.
SourceDestCheck: ‘false’
GroupSet:
– !Ref DevOpsTestEC2SecurityGroup # セキュリティグループとサブネットIDの指定は
SubnetId: subnet-07bf3f32c417b33a3 # 「Type: AWS::EC2::NetworkInterface」に記載します。
PrivateIpAddress: 172.31.1.22 # 「Type: AWS::EC2::Instance」に記載すると上のエラーが出力されます。
MyEC2Instance: # Amazon Linux2 の構築
Type: AWS::EC2::Instance
Properties:
ImageId: “ami-09ebacdc178ae23b7” # Amazon Linux 2 AMI (HVM), SSD Volume Type
InstanceType: “t2.micro”
AvailabilityZone: ap-northeast-1a # アベイラビリティの指定
NetworkInterfaces:
– NetworkInterfaceId:
!Ref myENI
DeviceIndex: ‘0’
KeyName: “DevOps-test-EC2-key” # 既存のキーペアの指定
BlockDeviceMappings:
– DeviceName: “/dev/sdm”
Ebs:
VolumeType: “gp2” # 汎用SSD(gp2)
DeleteOnTermination: “false”
VolumeSize: “8” # ディスクサイズ8GB
– DeviceName: “/dev/sdk”
NoDevice: {}
Tags:
– Key: Name
Value: devops-test-ec01
パブリックIPとプライベートIPアドレスを同時に設定するテンプレート
パブリックIPアドレス(Public IP Address)とプライベートIPアドレス(Private IP Address)を同時に設定するテンプレートです。
しかし今のところやりたいことができていません。
想定としては、1つのNICに対して指定したプライベートIPアドレスとパブリックIPアドレスが付与されることでしたが、想定通りにいかないので現在調査しています。
■パブリックIPとプライベートIPアドレスを同時に設定するテンプレートですがNICが2つできます
AWSTemplateFormatVersion: “2010-09-09”
Description: “Template EC2 Create”
Resources:
DevOpsTestEC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: “allow connections from specified CIDR ranges”
GroupName: devops-test-sg
VpcId: vpc-0f592c5fb1d9e5e15
SecurityGroupIngress:
– IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Description: “Port 80 for Internet”
– IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
Description: “Port 443 for Internet”
– IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Description: “Port 22 for ssh login”
PrivateIPAdressNic:
Type: AWS::EC2::NetworkInterface
Properties:
Description: “Private IP Address NIC”
#SourceDestCheck: ‘false’
#GroupSet:
#- !Ref DevOpsTestEC2SecurityGroup # !Ref で DevOpsTestEC2SecurityGroup のセキュリティグループのIDを取得
SubnetId: subnet-07bf3f32c417b33a3 # サブネットdevops-test-subnet-01のID
#PrivateIpAddress: 172.31.1.22 # プライベートIPアドレス
DependsOn: MyEC2Instance
NetworkInterfaceAttachment:
Type: AWS::EC2::NetworkInterfaceAttachment
Properties:
DeleteOnTermination: true
InstanceId:
Ref: MyEC2Instance
NetworkInterfaceId:
Ref: PrivateIPAdressNic
DeviceIndex: 1
MyEC2Instance: # Amazon Linux2 の構築
Type: AWS::EC2::Instance
Properties:
ImageId: “ami-09ebacdc178ae23b7” # Amazon Linux 2 AMI (HVM), SSD Volume Type
InstanceType: “t2.micro”
AvailabilityZone: ap-northeast-1a # アベイラビリティの指定
NetworkInterfaces:
– AssociatePublicIpAddress: true
DeleteOnTermination: true
Description: “Public IP Address”
SubnetId: subnet-07bf3f32c417b33a3
DeviceIndex: ‘0’
KeyName: “DevOps-test-EC2-key” # 既存のキーペアの指定
BlockDeviceMappings:
– DeviceName: “/dev/sdm”
Ebs:
VolumeType: “gp2” # 汎用SSD(gp2)
DeleteOnTermination: “false”
VolumeSize: “8” # ディスクサイズ8GB
– DeviceName: “/dev/sdk”
NoDevice: {}
Tags:
– Key: Name
Value: devops-test-ec01
上記のテンプレートを確認すると EC2 インスタンス(AWS::EC2::Instance)に対してネットワークインタフェース(AWS::EC2::NetworkInterface)を割り当てて、更にネットワークインタフェース(AWS::EC2::NetworkInterface)に対してネットワークインタフェースアタッチメント(AWS::EC2::NetworkInterfaceAttachment)の設定をしています。
以下のような構成になっています。
AWS::EC2::NetworkInterfaceAttachment
↓ 割り当てる
AWS::EC2::NetworkInterface
↓ 割り当てる
AWS::EC2::Instance
上記テンプレートを実行すると EC2 インスタンスは下図のようなになります。
コメント