2017-08-16 98 views
1

我一直在使用我的CloudFormation Yaml模板中的!Sub函數。並且當它用作對象屬性值時,它對我很有用AWS Cloud Formation!AWS內部的Sub&!Ref函數:: Serverless :: Function Policies

Object: 
    Property1: !Sub some-value-with-a-${variable}-in-it 

變量的值被替換爲預期值。

但是,我無法弄清楚如何使用!子功能在一個字符串數組

Array: 
    - !Sub some-value-with-a-${variable}-in-it 

該數組元素只是被忽略的一個元素。

我在創建AWS :: Serverless :: Function類型資源的SAM模板的上下文中嘗試此操作。該政策屬性可以接受字符串數組:

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 

的子功能在FunctionName物業工作在這個例子。但我最終只有2個政策附加到我生成的角色 - AWSLambdaBasicExecutionRolearn:aws:iam::123456789:policy/another-policy。包含!Sub函數的函數被忽略。

我試圖像把功能上的一個新的行選項:

Array: 
    - 
    !Sub some value with a ${variable} in it 

誰能幫助?

更新

@湯姆梅洛指出,這是不是一個數組的問題,所以我已經調整了我的問題。

進一步調查發現這不是一個雲的形成問題究竟,但非常具體的AWS::Serverless::Function資源類型,並在內部Policies財產。我懷疑它做的事實Policies特性如此靈活在什麼可以接受。它可以接受指向策略名稱或Arns的字符串,也可以接受描述新策略的策略文檔。我懷疑這意味着它無法支持這些功能。

+0

在數組項目或映射值中使用'!Sub'應該沒有區別。這似乎是一個錯誤,應該這樣報告。我試圖在'!Sub'之後引用標量。也許這是一個解析器錯誤,如果是這樣,那可能是一個解決方法。 – flyx

+0

感謝您的回覆。行情沒有工作,所以我會嘗試記錄一個錯誤 –

+0

問題創建:https://forums.aws.amazon.com/thread.jspa?threadID=261756 –

回答

1

顯然,在元素數組中的子函數沒有什麼不對!

我試圖創建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 

這應該工作使用SAM要麼...

+0

這很有趣。感謝您排除這一點。看起來我的問題需要更具體。也許它是SAM,或者它可能是無服務器功能類型上的policies屬性。我會進一步調查。 –

0

解決方法

AWS::Serverless::Function資源類型支持幾種方法配置訪問權限。

  1. 直接通過Policies屬性參考政策,並讓框架創建具有這些策略的角色。
  2. Role屬性可以引用已包含策略的角色。

我在使用選項1,但選項2被證明是解決!Sub函數問題的一種方法。

使用AWS::IAM::Role顯式地使用我們想要的策略創建角色意味着我們可以使用ManagedPolicyArns屬性中的!Sub函數。例如

role: 
    Type: AWS::IAM::Role 
    Properties: 
    ... 
    ManagedPolicyArns: 
     - !Sub arn:aws:iam::${AWS::AccountId}:policy/some-policy 
    ... 
lambda: 
    Type: AWS::Serverless::Function 
    Properties: 
    ... 
    Role: !GetAtt role.Arn 
    ...