这些示例演示了如何使用 CloudFormation 模板 Resources 语法 部分中的 Fn::ForEach
内置函数。
主题
复制 Amazon SNS 资源
此示例片段返回包含四个 Amazon SNS 主题的列表,其逻辑 ID 对应于集合中的项目(Success
、Failure
、Timeout
、Unknown
),相匹配的 TopicName
和 FifoTopic
设置为 true
。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::LanguageExtensions",
"Parameters": {
"pRepoARNs": {
"Description": "ARN of SSO instance",
"Type": "CommaDelimitedList"
}
},
"Resources": {
"Fn::ForEach::Topics": [
"TopicName",
{
"Ref": "pRepoARNs"
},
{
"SnsTopic${TopicName}": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": {
"Fn::Join": [
".",
[
{
"Ref": "TopicName"
},
"fifo"
]
]
},
"FifoTopic": true
}
}
}
]
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Parameters:
pRepoARNs:
Description: ARN of SSO instance
Type: CommaDelimitedList
Resources:
'Fn::ForEach::Topics':
- TopicName
- !Ref pRepoARNs
- 'SnsTopic${TopicName}':
Type: 'AWS::SNS::Topic'
Properties:
TopicName:
'Fn::Join':
- '.'
- - !Ref TopicName
- fifo
FifoTopic: true
转换后的模板将等同于以下模板:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"SnsTopicSuccess": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "Success.fifo",
"FifoTopic": true
}
},
"SnsTopicFailure": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "Failure.fifo",
"FifoTopic": true
}
},
"SnsTopicTimeout": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "Timeout.fifo",
"FifoTopic": true
}
},
"SnsTopicUnknown": {
"Type": "AWS::SNS::Topic",
"Properties": {
"TopicName": "Unknown.fifo",
"FifoTopic": true
}
}
}
}
复制 Amazon DynamoDB 资源
此示例片段创建了四个 AWS::DynamoDB::Table
资源,其名称为 Points
、Score
等。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::LanguageExtensions",
"Resources": {
"Fn::ForEach::Tables": [
"TableName",
["Points", "Score", "Name", "Leaderboard"],
{
"DynamoDB${TableName}": {
"Type": "AWS::DynamoDB::Table",
"Properties": {
"TableName": {
"Ref": "TableName"
},
"AttributeDefinitions": [
{
"AttributeName": "id",
"AttributeType": "S"
}
],
"KeySchema": [
{
"AttributeName": "id",
"KeyType": "HASH"
}
],
"ProvisionedThroughput": {
"ReadCapacityUnits": "5",
"WriteCapacityUnits": "5"
}
}
}
}
]
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Resources:
'Fn::ForEach::Tables':
- TableName
- [Points, Score, Name, Leaderboard]
- 'DynamoDB${TableName}':
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: !Ref TableName
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '5'
WriteCapacityUnits: '5'
转换后的模板将等同于以下模板:
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Resources:
DynamoDBPoints:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: Points
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '5'
WriteCapacityUnits: '5'
DynamoDBScore:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: Score
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '5'
WriteCapacityUnits: '5'
DynamoDBName:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: Name
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '5'
WriteCapacityUnits: '5'
DynamoDBLeaderboard:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: Leaderboard
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: '5'
WriteCapacityUnits: '5'
复制多个资源
此示例使用“{ResourceType}${Identifier}”的命名约定创建 AWS::EC2::NatGateway
和 AWS::EC2::EIP
的多个实例。您可以在单个 Fn::ForEach
循环中声明多个资源类型,以利用单个标识符。
注意
以下示例假设 TwoNatGateways
和 ThreeNatGateways
条件存在,并且已定义 PublicSubnetA
、PublicSubnetB
和 PublicSubnetC
资源。
注意
集合中每个元素的唯一值在“映射”部分中定义,其中使用 Fn::FindInMap 内置函数来引用相应的值。如果 Fn::FindInMap
找不到相应的标识符,则不会设置 Condition 属性并解析为 !Ref
‘AWS:::NoValue
。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::LanguageExtensions",
"Mappings": {
"NatGateway": {
"Condition": {
"B": "TwoNatGateways",
"C": "ThreeNatGateways"
}
}
},
"Resources": {
"Fn::ForEach::NatGatewayAndEIP": [
"Identifier",
[ "A", "B", "C" ],
{
"NatGateway${Identifier}": {
"Type": "AWS::EC2::NatGateway",
"Properties": {
"AllocationId": {
"Fn::GetAtt": [
{
"Fn::Sub": "NatGatewayAttachment${Identifier}"
},
"AllocationId"
]
},
"SubnetId": {
"Ref": {
"Fn::Sub": "PublicSubnet${Identifier}"
}
}
},
"Condition": {
"Fn::FindInMap": [
"NatGateway",
"Condition",
{
"Ref": "Identifier"
},
{
"DefaultValue": {
"Ref": "AWS::NoValue"
}
}
]
}
},
"NatGatewayAttachment${Identifier}": {
"Type": "AWS::EC2::EIP",
"Properties": {
"Domain": "vpc"
},
"Condition": {
"Fn::FindInMap": [
"NatGateway",
"Condition",
{
"Ref": "Identifier"
},
{
"DefaultValue": {
"Ref": "AWS::NoValue"
}
}
]
}
}
}
]
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Mappings:
NatGateway:
Condition:
B: TwoNatGateways
C: ThreeNatGateways
Resources:
Fn::ForEach::NatGatewayAndEIP:
- Identifier
- - A
- B
- C
- NatGateway${Identifier}:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt
- !Sub NatGatewayAttachment${Identifier}
- AllocationId
SubnetId: !Ref
Fn::Sub: PublicSubnet${Identifier}
Condition: !FindInMap
- NatGateway
- Condition
- !Ref Identifier
- DefaultValue: !Ref AWS::NoValue
NatGatewayAttachment${Identifier}:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
Condition: !FindInMap
- NatGateway
- Condition
- !Ref Identifier
- DefaultValue: !Ref AWS::NoValue
转换后的模板将等同于以下模板:
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Resources:
NatGatewayA:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt
- NatGatewayAttachmentA
- AllocationId
SubnetId: !Ref PublicSubnetA
NatGatewayB:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt
- NatGatewayAttachmentB
- AllocationId
SubnetId: !Ref PublicSubnetB
Condition: TwoNatGateways
NatGatewayC:
Type: AWS::EC2::NatGateway
Properties:
AllocationId: !GetAtt
- NatGatewayAttachmentC
- AllocationId
SubnetId: !Ref PublicSubnetC
Condition: ThreeNatGateways
NatGatewayAttachmentA:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
NatGatewayAttachmentB:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
Condition: TwoNatGateways
NatGatewayAttachmentC:
Type: AWS::EC2::EIP
Properties:
Domain: vpc
Condition: ThreeNatGateways
使用嵌套 Fn::ForEach
循环复制多个资源
此示例使用嵌套 Fn::ForEach
循环将三个资源(AWS::EC2::NetworkAcl
、AWS::EC2::Subnet
和 AWS::EC2::SubnetNetworkAclAssociation
)相互映射。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::LanguageExtensions",
"Resources": {
"VPC": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": "10.0.0.0/16",
"EnableDnsSupport": "true",
"EnableDnsHostnames": "true"
}
},
"Fn::ForEach::SubnetResources": [
"Prefix",
[
"Transit",
"Public"
],
{
"Nacl${Prefix}Subnet": {
"Type": "AWS::EC2::NetworkAcl",
"Properties": {
"VpcId": {
"Ref": "VPC"
}
}
},
"Fn::ForEach::LoopInner": [
"Suffix",
[
"A",
"B",
"C"
],
{
"${Prefix}Subnet${Suffix}": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
}
}
},
"Nacl${Prefix}Subnet${Suffix}Association": {
"Type": "AWS::EC2::SubnetNetworkAclAssociation",
"Properties": {
"SubnetId": {
"Ref": {
"Fn::Sub": "${Prefix}Subnet${Suffix}"
}
},
"NetworkAclId": {
"Ref": {
"Fn::Sub": "Nacl${Prefix}Subnet"
}
}
}
}
}
]
}
]
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Resources:
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
'Fn::ForEach::SubnetResources':
- Prefix
- [Transit, Public]
- 'Nacl${Prefix}Subnet':
Type: 'AWS::EC2::NetworkAcl'
Properties:
VpcId: !Ref 'VPC'
'Fn::ForEach::LoopInner':
- Suffix
- [A, B, C]
- '${Prefix}Subnet${Suffix}':
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref 'VPC'
'Nacl${Prefix}Subnet${Suffix}Association':
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref
'Fn::Sub': '${Prefix}Subnet${Suffix}'
NetworkAclId: !Ref
'Fn::Sub': 'Nacl${Prefix}Subnet'
转换后的模板将等同于以下模板:
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Resources:
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
NaclTransitSubnet:
Type: 'AWS::EC2::NetworkAcl'
Properties:
VpcId: !Ref VPC
TransitSubnetA:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
NaclTransitSubnetAAssociation:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref TransitSubnetA
NetworkAclId: !Ref NaclTransitSubnet
TransitSubnetB:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
NaclTransitSubnetBAssociation:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref TransitSubnetB
NetworkAclId: !Ref NaclTransitSubnet
TransitSubnetC:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
NaclTransitSubnetCAssociation:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref TransitSubnetC
NetworkAclId: !Ref NaclTransitSubnet
NaclPublicSubnet:
Type: 'AWS::EC2::NetworkAcl'
Properties:
VpcId: !Ref VPC
PublicSubnetA:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
NaclPublicSubnetAAssociation:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref PublicSubnetA
NetworkAclId: !Ref NaclPublicSubnet
PublicSubnetB:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
NaclPublicSubnetBAssociation:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref PublicSubnetB
NetworkAclId: !Ref NaclPublicSubnet
PublicSubnetC:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
NaclPublicSubnetCAssociation:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId: !Ref PublicSubnetC
NetworkAclId: !Ref NaclPublicSubnet
引用 Amazon EC2 资源的复制属性
此示例使用 Fn::ForEach
内置函数来引用复制的 AWS::EC2::Instance
资源。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::LanguageExtensions",
"Mappings": {
"Instances": {
"InstanceType": {
"B": "m5.4xlarge",
"C": "c5.2xlarge"
},
"ImageId": {"A": "ami-id1"}
}
},
"Resources": {
"Fn::ForEach::Instances": [
"Identifier",
[
"A",
"B",
"C"
],
{
"Instance${Identifier}": {
"Type": "AWS::EC2::Instance",
"Properties": {
"InstanceType": {
"Fn::FindInMap": [
"Instances",
"InstanceType",
{"Ref": "Identifier"},
{"DefaultValue": "m5.xlarge"}
]
},
"ImageId": {
"Fn::FindInMap": [
"Instances",
"ImageId",
{"Ref": "Identifier"},
{"DefaultValue": "ami-id-default"}
]
}
}
}
}
]
},
"Outputs": {
"SecondInstanceId": {
"Description": "Instance Id for InstanceB",
"Value": {"Ref": "InstanceB"}
},
"SecondPrivateIp": {
"Description": "Private IP for InstanceB",
"Value": {
"Fn::GetAtt": [
"InstanceB",
"PrivateIp"
]
}
}
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Mappings:
Instances:
InstanceType:
B: m5.4xlarge
C: c5.2xlarge
ImageId:
A: ami-id1
Resources:
'Fn::ForEach::Instances':
- Identifier
- [A, B, C]
- 'Instance${Identifier}':
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: !FindInMap [Instances, InstanceType, !Ref 'Identifier', {DefaultValue: m5.xlarge}]
ImageId: !FindInMap [Instances, ImageId, !Ref 'Identifier', {DefaultValue: ami-id-default}]
Outputs:
SecondInstanceId:
Description: Instance Id for InstanceB
Value: !Ref 'InstanceB'
SecondPrivateIp:
Description: Private IP for InstanceB
Value: !GetAtt [InstanceB, PrivateIp]
转换后的模板将等同于以下模板:
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Resources:
InstanceA:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: m5.xlarge
ImageId: ami-id1
InstanceB:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: m5.4xlarge
ImageId: ami-id-default
InstanceC:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: c5.2xlarge
ImageId: ami-id-default
Outputs:
SecondInstanceId:
Description: Instance Id for InstanceB
Value: !Ref InstanceB
SecondPrivateIp:
Description: Private IP for InstanceB
Value: !GetAtt [InstanceB, PrivateIp]
复制 Amazon EC2 资源的属性
此示例使用 Fn::ForEach
内置函数将某些属性(例如ImageId
、InstanceType
和 AvailabilityZone
)重复到 AWS::EC2::Instance
资源。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::LanguageExtensions",
"Mappings": {
"InstanceA": {
"Properties": {
"ImageId": "ami-id1",
"InstanceType": "m5.xlarge"
}
},
"InstanceB": {
"Properties": {
"ImageId": "ami-id2"
}
},
"InstanceC": {
"Properties": {
"ImageId": "ami-id3",
"InstanceType": "m5.2xlarge",
"AvailabilityZone": "us-east-1a"
}
}
},
"Resources": {
"Fn::ForEach::Instances": [
"InstanceLogicalId",
[ "InstanceA", "InstanceB", "InstanceC" ],
{
"${InstanceLogicalId}": {
"Type": "AWS::EC2::Instance",
"Properties": {
"DisableApiTermination": true,
"UserData": {
"Fn::Base64": {
"Fn::Join": [
"",
[
"#!/bin/bash\n",
"yum update -y\n",
"yum install -y httpd.x86_64\n",
"systemctl start httpd.service\n",
"systemctl enable httpd.service\n",
"echo \"Hello World from $(hostname -f)\" > /var/www/html/index.html\n"
]
]
}
},
"Fn::ForEach::Properties": [
"PropertyName",
[ "ImageId", "InstanceType", "AvailabilityZone" ],
{
"${PropertyName}": {
"Fn::FindInMap": [
{ "Ref": "InstanceLogicalId" },
"Properties",
{ "Ref": "PropertyName"},
{
"DefaultValue": { "Ref": "AWS::NoValue" }
}
]
}
}
]
}
}
}
]
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Mappings:
InstanceA:
Properties:
ImageId: ami-id1
InstanceType: m5.xlarge
InstanceB:
Properties:
ImageId: ami-id2
InstanceC:
Properties:
ImageId: ami-id3
InstanceType: m5.2xlarge
AvailabilityZone: us-east-1a
Resources:
'Fn::ForEach::Instances':
- InstanceLogicalId
- [InstanceA, InstanceB, InstanceC]
- '${InstanceLogicalId}':
Type: 'AWS::EC2::Instance'
Properties:
DisableApiTermination: true
UserData:
Fn::Base64: !Sub |
#!/bin/bash
yum update -y
yum install -y httpd.x86_64
systemctl start httpd.service
systemctl enable httpd.service
echo "Hello World from $(hostname -f)" > /var/www/html/index.html
'Fn::ForEach::Properties':
- PropertyName
- [ImageId, InstanceType, AvailabilityZone]
- '${PropertyName}':
'Fn::FindInMap':
- Ref: 'InstanceLogicalId'
- Properties
- Ref: 'PropertyName'
- {DefaultValue: !Ref 'AWS::NoValue'}
转换后的模板将等同于以下模板:
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Resources:
InstanceA:
Type: 'AWS::EC2::Instance'
Properties:
DisableApiTermination: true
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
yum update -y
yum install -y httpd.x86_64
systemctl start httpd.service
systemctl enable httpd.service
echo "Hello World from $(hostname -f)" > /var/www/html/index.html
ImageId: ami-id1
InstanceType: m5.xlarge
InstanceB:
Type: 'AWS::EC2::Instance'
Properties:
DisableApiTermination: true
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
yum update -y
yum install -y httpd.x86_64
systemctl start httpd.service
systemctl enable httpd.service
echo "Hello World from $(hostname -f)" > /var/www/html/index.html
ImageId: ami-id2
InstanceC:
Type: 'AWS::EC2::Instance'
Properties:
DisableApiTermination: true
UserData:
Fn::Base64:
!Sub |
#!/bin/bash
yum update -y
yum install -y httpd.x86_64
systemctl start httpd.service
systemctl enable httpd.service
echo "Hello World from $(hostname -f)" > /var/www/html/index.html
ImageId: ami-id3
InstanceType: m5.2xlarge
AvailabilityZone: us-east-1a
在 Fn::ForEach
的 Collection
中传递非字母数字字符
此示例使用 &{}
语法,该语法允许在 Collection
中传递 IP 地址中的非字母数字字符(.
和 /
)。
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Transform": "AWS::LanguageExtensions",
"Parameters": {
"IpAddresses": {
"Type": "CommaDelimitedList",
"Default": "10.0.2.0/24,10.0.3.0/24,10.0.4.0/24"
}
},
"Resources": {
"VPC": {
"Type": "AWS::EC2::VPC",
"Properties": {
"CidrBlock": "10.0.0.0/16",
"EnableDnsSupport": "true",
"EnableDnsHostnames": "true"
}
},
"Fn::ForEach::Subnets": [
"CIDR",
{
"Ref": "IpAddresses"
},
{
"Subnet&{CIDR}": {
"Type": "AWS::EC2::Subnet",
"Properties": {
"VpcId": {
"Ref": "VPC"
},
"CidrBlock": {
"Ref": "CIDR"
}
}
}
}
]
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Parameters:
IpAddresses:
Type: CommaDelimitedList
Default: '10.0.2.0/24,10.0.3.0/24,10.0.4.0/24'
Resources:
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
'Fn::ForEach::Subnets':
- CIDR
- !Ref IpAddresses
- 'Subnet&{CIDR}':
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: !Ref CIDR
转换后的模板将等同于以下模板:
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Parameters:
IpAddresses:
Type: CommaDelimitedList
Default: '10.0.2.0/24,10.0.3.0/24,10.0.4.0/24'
Resources:
VPC:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: 'true'
EnableDnsHostnames: 'true'
Subnet1002024:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.2.0/24
Subnet1003024:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.3.0/24
Subnet1004024:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.4.0/24