AWS CloudFormation GetAtt在Fn :: Sub下不起作用

时间:2020-02-29 20:18:34

标签: amazon-cloudformation

我有以下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::GetAttFn::Sub下工作?还是获得正确价值的最佳方法是什么?

2 个答案:

答案 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