AWS Cloud Formation !Sub 和 !Ref 函数在 AWS::Serverless::Function 策略中

And*_*age 8 yaml aws-cloudformation aws-lambda

我一直在我的 CloudFormation Yaml 模板中使用 !Sub 函数就好了。当将它用作对象属性值时,它对我有用

Object:
  Property1: !Sub some-value-with-a-${variable}-in-it
Run Code Online (Sandbox Code Playgroud)

变量的值按预期被替换。

但是,我不知道如何在字符串数组的元素中使用 !Sub 函数

Array:
  - !Sub some-value-with-a-${variable}-in-it
Run Code Online (Sandbox Code Playgroud)

该数组元素会被忽略。

我正在 SAM 模板创建 AWS::Serverless::Function 类型资源的上下文中尝试此操作。Policies 属性可以采用字符串数组:

lambda:
  Type: AWS::Serverless::Function
  Properties:
    CodeUri: api
    FunctionName: !Sub api-${MyStageName}
    Handler: Lambda:Api.Function::HandleAsync
    Runtime: dotnetcore1.0
    Policies: 
    - AWSLambdaBasicExecutionRole
    - !Sub arn:aws:iam::${AWS::AccountId}:policy/some-policy
    - arn:aws:iam::123456789:policy/another-policy
Run Code Online (Sandbox Code Playgroud)

!Sub 函数FunctionName在此示例中的属性中起作用。但是我最终只将 2 个策略附加到我生成的角色 -AWSLambdaBasicExecutionRolearn:aws:iam::123456789:policy/another-policy. 包括!Sub函数的那个被忽略。

我尝试过将函数放在新行中的选项:

Array:
  - 
    !Sub some value with a ${variable} in it
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮忙吗?

更新

@Tom Melo 指出这不是数组问题,所以我调整了我的问题。

进一步的调查显示,这不是 Cloud Formation 的问题,而是非常特定于AWS::Serverless::Function资源类型和Policiesin 中的属性。我怀疑这与该Policies属性在它可以接受的方面如此灵活这一事实有关。它可以接受引用策略名称或 Arns 的字符串,还可以接受描述新策略的策略文档。我怀疑这意味着它无法支持这些功能。

Tom*_*elo 5

显然,元素数组中的 !Sub 函数没有任何问题。

我尝试在 Cloudformation 上创建以下堆栈并且它起作用了:

AWSTemplateFormatVersion: '2010-09-09'
Description: 'IAM Roles Template'

Parameters:
  ArnBase:
    Type: String
    Default: arn:aws:iam::aws:policy/
  AWSLambdaFullAccess:
    Type: String
    Default: AWSLambdaFullAccess
  AmazonSESFullAccess:
    Type: String
    Default: AmazonSESFullAccess    

Resources:

  LambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
          Action: sts:AssumeRole          
      Policies:
        -
          PolicyName: CloudFormationFullAccess
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              -
                Effect: "Allow"
                Action: "cloudformation:*"
                Resource: "*"    
      ManagedPolicyArns:        
        - !Sub ${ArnBase}${AWSLambdaFullAccess}        
        - !Sub ${ArnBase}${AmazonSESFullAccess}
        - !Sub arn:aws:iam::${AWS::AccountId}:policy/CustomAmazonGlacierReadOnlyAccess
Run Code Online (Sandbox Code Playgroud)

这应该可以使用 SAM 工作...