使用 Amazon CloudFormation 配置 Amazon EC2 实例
以下代码段演示了如何使用 Amazon CloudFormation 配置 Amazon EC2 实例。
Amazon EC2 的常规配置
以下代码段演示了如何使用 Amazon CloudFormation 对 Amazon EC2 实例进行常规配置。
示例代码段
在指定的可用区中创建 Amazon EC2 实例
以下代码段使用 AWS::EC2::Instance 资源在指定的可用区中创建 Amazon EC2 实例。可用区的代码由其区域代码后跟一个字母标识符组成。您可以在单个可用区中启动实例。
JSON
"Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "AvailabilityZone": "
aa-example-1a
", "ImageId": "ami-1234567890abcdef0
" } }
YAML
Ec2Instance: Type: AWS::EC2::Instance Properties: AvailabilityZone:
aa-example-1a
ImageId:ami-1234567890abcdef0
使用 EBS 卷和用户数据配置标记的 Amazon EC2 实例
以下代码段使用标记、EBS 卷和用户数据创建了一个 Amazon EC2 实例。该实例使用 AWS::EC2::Instance 资源。必须在同一个模板中定义 AWS::EC2::SecurityGroup 资源、AWS::SNS::Topic 资源和 AWS::EC2::Volume 资源。必须在模板的 Parameters
部分中定义 KeyName
。
标签可帮助您按用途、拥有者或环境等首选项对 Amazon 资源进行分类。用户数据允许在启动期间向实例预置自定义脚本或数据。这些数据有助于实现任务自动化、软件配置、软件包安装以及初始化期间对实例执行的其他操作。
有关标记您资源的更多信息,请参阅标记 Amazon EC2 资源。
有关用户数据的信息,请参阅实例元数据和用户数据。
JSON
"Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "KeyName": { "Ref": "KeyName" }, "SecurityGroups": [ { "Ref": "Ec2SecurityGroup" } ], "UserData": { "Fn::Base64": { "Fn::Join": [ ":", [ "PORT=80", "TOPIC=", { "Ref": "MySNSTopic" } ] ] } }, "InstanceType": "
aa.size
", "AvailabilityZone": "aa-example-1a
", "ImageId": "ami-1234567890abcdef0
", "Volumes": [ { "VolumeId": { "Ref": "MyVolumeResource" }, "Device": "/dev/sdk" } ], "Tags": [ { "Key": "Name", "Value": "MyTag" } ] } }
YAML
Ec2Instance: Type: AWS::EC2::Instance Properties: KeyName: !Ref KeyName SecurityGroups: - !Ref Ec2SecurityGroup UserData: Fn::Base64: Fn::Join: - ":" - - "PORT=80" - "TOPIC=" - !Ref MySNSTopic InstanceType:
aa.size
AvailabilityZone:aa-example-1a
ImageId:ami-1234567890abcdef0
Volumes: - VolumeId: !Ref MyVolumeResource Device: "/dev/sdk" Tags: - Key: Name Value: MyTag
在用户数据中定义 DynamoDB 表名用于启动 Amazon EC2 实例
以下代码段创建了一个 Amazon EC2 实例,并在用户数据中定义了一个 DynamoDB 表名,以便在启动时传递给实例。该实例使用 AWS::EC2::Instance 资源。您可以在用户数据中定义参数或动态值,以便在启动时传递 EC2 实例。
有关用户数据的更多信息,请参阅实例元数据和用户数据。
JSON
"Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "UserData": { "Fn::Base64": { "Fn::Join": [ "", [ "TableName=", { "Ref": "DynamoDBTableName" } ] ] } }, "AvailabilityZone": "
aa-example-1a
", "ImageId": "ami-1234567890abcdef0
" } }
YAML
Ec2Instance: Type: AWS::EC2::Instance Properties: UserData: Fn::Base64: Fn::Join: - '' - - 'TableName=' - Ref: DynamoDBTableName AvailabilityZone:
aa-example-1a
ImageId:ami-1234567890abcdef0
使用 DeletionPolicy
创建 Amazon EBS 卷
以下代码段使用 Amazon EC2 AWS::EC2::Volume 资源创建 Amazon EBS 卷。您可以使用 Size
或 SnapshotID
属性来定义卷,但不能同时使用两者。DeletionPolicy
属性设置为在删除堆栈时创建卷的快照。
有关 DeletionPolicy
属性的更多信息,请参阅 DeletionPolicy
属性。
有关创建 Amazon EBS 卷的更多信息,请参阅创建 Amazon EBS 卷。
JSON
此代码段会创建具有指定大小的 Amazon EBS 卷。大小虽设置为 10,但可按需加以调整。AWS::EC2::Volume 资源允许指定大小或快照 ID,但不允许同时指定这两者。
"MyEBSVolume": { "Type": "AWS::EC2::Volume", "Properties": { "Size": "
10
", "AvailabilityZone": { "Ref": "AvailabilityZone" } }, "DeletionPolicy": "Snapshot" }
此代码段使用提供的快照 ID 创建一个 Amazon EBS 卷。AWS::EC2::Volume 资源允许指定大小或快照 ID,但不允许同时指定这两者。
"MyEBSVolume": { "Type": "AWS::EC2::Volume", "Properties": { "SnapshotId" : "
snap-1234567890abcdef0
", "AvailabilityZone": { "Ref": "AvailabilityZone" } }, "DeletionPolicy": "Snapshot" }
YAML
此代码段会创建具有指定大小的 Amazon EBS 卷。大小虽设置为 10,但可按需加以调整。AWS::EC2::Volume 资源允许指定大小或快照 ID,但不允许同时指定这两者。
MyEBSVolume: Type: AWS::EC2::Volume Properties: Size:
10
AvailabilityZone: Ref: AvailabilityZone DeletionPolicy: Snapshot
此代码段使用提供的快照 ID 创建一个 Amazon EBS 卷。AWS::EC2::Volume 资源允许指定大小或快照 ID,但不允许同时指定这两者。
MyEBSVolume: Type: AWS::EC2::Volume Properties: SnapshotId:
snap-1234567890abcdef0
AvailabilityZone: Ref: AvailabilityZone DeletionPolicy: Snapshot
指定实例的块设备映射
块设备映射定义了挂载到某个实例的块设备(包含实例存储卷和 EBS 卷)。您可以在创建 AMI 时指定块设备映射,以便让从该 AMI 启动的所有实例都可使用该映射。另外,您可以在启动实例时指定块设备映射,这样该映射会覆盖您从启动实例的 AMI 中指定的块设备映射。
您可以使用以下模板代码段中 AWS::EC2::Instance 资源的 BlockDeviceMappings
属性,为 EBS 或实例存储卷指定块设备映射。
有关数据块设备映射的更多信息,请参阅《Amazon EC2 用户指南》中的块设备映射。
为两个 EBS 卷指定块设备映射
JSON
"Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Fn::FindInMap": [ "
AWSRegionArch2AMI
", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch
", { "Ref": "InstanceType" }, "Arch" ] } ] }, "KeyName": { "Ref": "KeyName" }, "InstanceType": { "Ref": "InstanceType" }, "SecurityGroups": [{ "Ref": "Ec2SecurityGroup" }], "BlockDeviceMappings": [ { "DeviceName": "/dev/sda1
", "Ebs": { "VolumeSize": "50
" } }, { "DeviceName": "/dev/sdm
", "Ebs": { "VolumeSize": "100
" } } ] } } }
YAML
EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap [
AWSRegionArch2AMI
, !Ref 'AWS::Region', !FindInMap [AWSInstanceType2Arch
, !Ref InstanceType, Arch]] KeyName: !Ref KeyName InstanceType: !Ref InstanceType SecurityGroups: - !Ref Ec2SecurityGroup BlockDeviceMappings: - DeviceName:/dev/sda1
Ebs: VolumeSize:50
- DeviceName:/dev/sdm
Ebs: VolumeSize:100
为实例存储卷指定块设备映射
JSON
"Ec2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "
AWSRegionArch2AMI
", { "Ref" : "AWS::Region" }, "HVM64
" ]}, "KeyName" : { "Ref" : "KeyName" }, "InstanceType": { "Ref": "InstanceType" }, "SecurityGroups" : [{ "Ref" : "Ec2SecurityGroup" }], "BlockDeviceMappings" : [ { "DeviceName" : "/dev/sdc
", "VirtualName" : "ephemeral0
" } ] } }
YAML
EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap -
AWSRegionArch2AMI
- !Ref AWS::Region - HVM64 KeyName: !Ref KeyName InstanceType: !Ref InstanceType SecurityGroups: - !Ref Ec2SecurityGroup BlockDeviceMappings: - DeviceName:/dev/sdc
VirtualName:ephemeral0