使用 AWS CloudFormation 配置 Amazon EC2 实例 - AWS CloudFormation

使用 AWS CloudFormation 配置 Amazon EC2 实例

以下代码段演示了如何使用 AWS CloudFormation 配置 Amazon EC2 实例。

Amazon EC2 的常规配置

以下代码段演示了如何使用 AWS 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

标签可帮助您按用途、拥有者或环境等首选项对 AWS 资源进行分类。用户数据允许在启动期间向实例预置自定义脚本或数据。这些数据有助于实现任务自动化、软件配置、软件包安装以及初始化期间对实例执行的其他操作。

有关标记您资源的更多信息,请参阅标记 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 卷。您可以使用 SizeSnapshotID 属性来定义卷,但不能同时使用两者。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