我有以下EC2 UserData:
UserData: !Base64
Fn::Sub: |
#PROVISIONER_PEER_PASSWORD_INPUT=${AWS::AccountId} ${AWS::StackId} ${AWS::Region}
#PROVISIONER_PEER_PASSWORD=${pDatabasePassword}
#PROVISIONER_SHARED_UNIQUE_ID_INPUT=${AWS::AccountId} ${AWS::StackId} ${AWS::Region}
#PROVISIONER_CFN_RESOURCE=Machine
#PROVISIONER_CFN_STACK=${AWS::StackName}
#PROVISIONER_CFN_REGION=${AWS::Region}
#PROVISIONER_DATA_DISK=/dev/xvdc
#PROVISIONER_TIER=frontend
#PROVISIONER_PEER_ADDRESS=
Fn::GetAtt:
- rDatabaseCluster
- Endpoint.Address
#PROVISIONER_APP_PASSWORD=${pApplicationPassword}
此处是用户数据代码中断的地方。
#PROVISIONER_PEER_ADDRESS=
Fn::GetAtt:
- rDatabaseCluster
- Endpoint.Address
Fn :: GetAtt没有得到执行/解决。成功创建堆栈后,用户数据代码的结果如下:
#PROVISIONER_PEER_PASSWORD_INPUT=11111333393 arn:aws:cloudformation:us-east-1:171602812093:stack/daxz/16085e70-5b2b-11ea-91e9-122e54527a47 us-east-1
#PROVISIONER_PEER_PASSWORD=Jane85
#PROVISIONER_SHARED_UNIQUE_ID_INPUT=11111333393 arn:aws:cloudformation:us-east-1:171602812093:stack/daxz/16085e70-5b2b-11ea-91e9-122e54527a47 us-east-1
#PROVISIONER_CFN_RESOURCE=Machine
#PROVISIONER_CFN_STACK=daxz
#PROVISIONER_CFN_REGION=us-east-1
#PROVISIONER_DATA_DISK=/dev/xvdc
#PROVISIONER_TIER=frontend
#PROVISIONER_PEER_ADDRESS=
Fn::GetAtt:
- rDatabaseCluster
- Endpoint.Address
#PROVISIONER_APP_PASSWORD=Jane85
您会看到Fn::GetAtt
的代码按原样输入用户数据,而没有解析为实际值。
#PROVISIONER_PEER_ADDRESS=
Fn::GetAtt:
- rDatabaseCluster
- Endpoint.Address
如何使Fn::GetAtt
在Fn::Sub
下工作?还是获得正确价值的最佳方法是什么?
答案 0 :(得分:2)
您还可以像这样使用内联GetAtt:
!Sub "... ${rDatabaseCluster.Endpoint.Address}"
参见此处:How to use Sub and GetAtt functions at the same time in CloudFormation template?
答案 1 :(得分:0)
问题是您的字符串中有GetAtt。要执行您想做的事情,您需要使用更详细的Fn::Sub
版本。一个简单的示例如下所示:
Fun::Sub:
- 'some string ${ValueToReplace}'
- ValueToReplace: !GetAtt SomeResource.Attribute