在 aws cloudformation 中,当我尝试一起使用 !sub 和 !join 函数时出错

问题描述

嗨,我正在 cfn 模板中尝试以下操作:

ManagedPolicyArns:
        - !Ref kinesiss3logpolicy
      PermissionsBoundary: !Sub 
          - !Join [ '',[ 'arn:aws:iam::${AWS::AccountId}:policy/',!Ref AdminPolicy ] ]

其中 AdminPolicy 是一个参数。

我收到以下错误

*[error]ValidationError: Template error: One or more Fn::Sub intrinsic functions don't specify expected arguments. Specify a string as first argument,and an optional second argument to specify a mapping of values to replace in the string*

有人可以帮我解决这个问题吗?

解决方法

根据 docs 有多种使用 Sub 的方法。

您必须提供到 Sub 的值映射,除非您仅使用可直接替换的参数。

您已将 !Sub 的参数定义为列表,因为您使用的是 -

PermissionsBoundary: !Sub 
    - !Join [ '',[ 'arn:aws:iam::${AWS::AccountId}:policy/',!Ref AdminPolicy ] ]

这不起作用。如果您使用 Sub 的列表,则必须提供值映射。

那么您应该在一行中使用 !Sub,因为您只使用伪参数和您自己的参数。

那你就得这样用了,但是这个有语法错误。但想法是一样的。

PermissionsBoundary: !Sub !Join [ '',!Ref AdminPolicy ] ]

然后您可以使用 Fn 表示法,而不是速记表示法。

PermissionsBoundary: { Fn::Sub: {Fn::Join: [ '',!Ref AdminPolicy ] ] } }

正如评论中提到的,您可以删除 !Join 并仅使用 !Sub

PermissionsBoundary: !Sub "arn:aws:iam::${AWS::AccountId}:policy/${AdminPolicy}"