首页 > 解决方案 > AWS CloudFormation GetAtt 在 Fn::Sub 下不起作用

问题描述

我有以下 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} ${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?或者获得正确价值的最佳方法是什么???

标签: amazon-cloudformation

解决方案


您也可以像这样使用 GetAtt 内联:

!Sub "... ${rDatabaseCluster.Endpoint.Address}"

看这里:如何在 CloudFormation 模板中同时使用 Sub 和 GetAtt 函数?


推荐阅读