问题描述
我有一个 CloudFormation 模板来创建 VPC 并向其添加子网和安全组。我需要在 AWS Parameter Store 中存储新安全组的 ID 和子网的 ID。
这适用于在 中使用 Value: !GetAtt [securityGroup,GroupId]
的安全组,但我不知道如何以适用于 Parameter Store 的方式引用子网的 ID。
以下是 CloudFormation 的相关部分:
Resources:
### subnet resource ###
subnet1:
Type: AWS::EC2::subnet
Properties:
AvailabilityZone: !Ref subnetAvailabilityZone1
CidrBlock: 10.2.0.0/16
VpcId: !Ref requesterVpc
### Parameter Store resource ###
subnet1Id:
Type: AWS::SecretsManager::Secret
Properties:
Description: Lambda subnet ID
Name: /lambda-vpc/subnet/1
Value: !GetAtt [subnet1,id] # <---------- this doesn't work (Error A below)
Value: !Ref subnet1 # <---------- this doesn't work either (Error B below)
错误 A
资源子网 1 不支持 Fn::GetAtt 中的属性类型 id。
我也尝试过“subnetId”但无济于事。查看 subnet's CF documentation 显示没有可使用 Fn::GetAtt
返回的子网 ID 的属性。
错误 B
尝试使用 Fn::Ref
获取子网 ID 也不起作用。即使文档说“Ref
返回子网的 ID”,尝试更新 CF 堆栈在尝试创建/更新“subnet1Id”参数时也会出现此错误:
解决方法
问题在于我用于参数的 AWS 资源类型。
我使用的是 AWS::SecretsManager::Secret
,但我需要 AWS::SSM::Parameter
。切换到那个并将 Type: String
添加到 Properties 后,!Ref subnet1
起作用了。