Amazon cloudformation AWS CloudFormation GetAtt不在Fn::Sub下工作
我有以下EC2用户数据:Amazon cloudformation AWS CloudFormation GetAtt不在Fn::Sub下工作,amazon-cloudformation,Amazon Cloudformation,我有以下EC2用户数据: 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}
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
Fun::Sub:
- 'some string ${ValueToReplace}'
- ValueToReplace: !GetAtt SomeResource.Attribute
!Sub "... ${rDatabaseCluster.Endpoint.Address}"
正如您所看到的,Fn::GetAtt的代码按原样进入了用户数据,而没有解析为实际值
#PROVISIONER_PEER_ADDRESS=
Fn::GetAtt:
- rDatabaseCluster
- Endpoint.Address
如何使Fn::GetAtt在Fn::Sub下工作?或者,获取正确值的最佳方法是什么?问题是,您的GetAtt位于字符串中。要执行您想要执行的操作,您需要使用更详细的Fn::Sub版本。一个简单的示例如下所示:
#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
Fun::Sub:
- 'some string ${ValueToReplace}'
- ValueToReplace: !GetAtt SomeResource.Attribute
!Sub "... ${rDatabaseCluster.Endpoint.Address}"
问题是您的GetAtt在字符串中。要执行您想要执行的操作,您需要使用更详细的Fn::Sub版本。一个简单的示例如下所示:
#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
Fun::Sub:
- 'some string ${ValueToReplace}'
- ValueToReplace: !GetAtt SomeResource.Attribute
!Sub "... ${rDatabaseCluster.Endpoint.Address}"
您还可以像下面这样使用GetAtt inline:
#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
Fun::Sub:
- 'some string ${ValueToReplace}'
- ValueToReplace: !GetAtt SomeResource.Attribute
!Sub "... ${rDatabaseCluster.Endpoint.Address}"
请参见此处:您也可以像这样使用GetAtt inline:
#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
Fun::Sub:
- 'some string ${ValueToReplace}'
- ValueToReplace: !GetAtt SomeResource.Attribute
!Sub "... ${rDatabaseCluster.Endpoint.Address}"
请看这里:非常感谢。我会尝试一下,然后告诉你结果。非常感谢。我会试试看,然后告诉你结果。我忘了这个。我更多的时候是把它和你的生活结合起来!重要的价值,但我知道我没有在我能做到的时候做到这一点。我忘记了这一点。我更多的时候是把它和你的生活结合起来!重要的价值,但我知道我还没有做到这一点时,我可以。