使用CloudFormation来创建EC2实例
Cloud Formation是什么?
可以通过命令启动。
-
- 在yml文件中编写配置(参考下面的instance.yml文件)
启动
aws cloudformation create-stack –template-body file://instance.yml –stack-name instance –parameters ParameterKey=InstanceType,ParameterValue=t2.micro
取消
aws cloudformation delete-stack –stack-name instance
YAML的使用方法。
只需要一个选项,将以下内容以中文本地化:
仅仅启动EC2的yaml文件。
---
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Template for Kafka Broker'
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
Type: AWS::EC2::KeyPair::KeyName
ConstraintDescription: must be the name of an existing EC2 KeyPair.
Default: test-key
InstanceType:
Description: WebServer EC2 instance type
Type: String
Default: t2.micro
AllowedValues:
- t1.micro
- t2.nano
- t2.micro
- t2.small
- t2.medium
- t2.large
ConstraintDescription: must be a valid EC2 instance type.
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType:
Ref: InstanceType
Outputs:
InstanceId:
Description: InstanceId of the newly created EC2 instance
Value:
Ref: EC2Instance
AZ:
Description: Availability Zone of the newly created EC2 instance
Value:
Fn::GetAtt:
- EC2Instance
- AvailabilityZone
PublicDNS:
Description: Public DNSName of the newly created EC2 instance
Value:
Fn::GetAtt:
- EC2Instance
- PublicDnsName
PublicIP:
Description: Public IP address of the newly created EC2 instance
Value:
Fn::GetAtt:
- EC2Instance
- PublicIp
最重要的是资源。
-
- 实例类型
- 键
创造一个能够以参数为输入的功能。(如果参数已经确定,也可以直接写入而不使用参数。)
在现有的子网中创建一个EC2实例。
将subnet_id写成SubnetId
Resources:
EC2Instance:
...
SubnetId: subnet-0000000000000
当未分配公共IP地址时
解决方法:将子网的自动分配IP设置启用。
请参考以下链接获取更多信息:https://dev.classmethod.jp/cloud/aws/auto-assign-public-ip-by-cfn/
调整音量
在Instance的BlockDeviceMappings中,写入DeviceName和Ebs的设置。根据以下配置,将附加一个gp2卷,容量为10GB。
Resources:
...
EC2Instance:
Type: AWS::EC2::Instance
Properties:
...
BlockDeviceMappings:
-
DeviceName: /dev/sdf
Ebs:
VolumeSize: 10
VolumeType: gp2
...
将弹性 IP 分配给 EC2。
如果创建弹性IP的话
只需使用AWS::EC2::EIP创建并使用AWS::EC2::EIPAssociation进行附加即可。
...
Resources:
ElasticIP:
Type: "AWS::EC2::EIP"
Properties:
Domain: vpc
EC2Instance:
...
IPAssoc:
Type: AWS::EC2::EIPAssociation
Properties:
InstanceId: !Ref EC2Instance
EIP: !Ref ElasticIP
...
如果要添加现有的弹性IP
...
Resources:
EC2Instance:
...
IPAssoc:
Type: AWS::EC2::EIPAssociation
Properties:
InstanceId: !Ref EC2Instance
EIP: <existing Elastic IP Address>
闲谈:我也想给弹性IP添加名称标签,但却无法实现。
CloudFormation的基本命令
我想看一下创建的Stack中的内容。
aws cloudformation describe-stacks --stack-name instance
获取通过CloudFormation创建的InstanceId
aws ec2 describe-instances \
--query "Reservations[*].Instances[*].InstanceId[]" \
--filters "Name=tag-key,Values=aws:cloudformation:stack-name" "Name=tag-value,Values=<stack_name>" \
--output=text