无法获取SAM模板资源中策略定义的语法(无服务器功能)

时间:2019-07-14 15:04:25

标签: amazon-web-services aws-lambda amazon-iam aws-serverless aws-sam

AWS托管策略(AWSLambdaExecute)的策略定义为:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [ "logs:*" ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [ "s3:GetObject", "s3:PutObject" ],
      "Resource": "arn:aws:s3:::*"
    }
  ]
}

但是AWS_documentation使用相同的策略名称AWSLambdaExecute提供了一个示例无服务器功能,如下所示:

Type: AWS::Serverless::Function
  Properties:
    Handler: index.js
    Runtime: nodejs8.10
    CodeUri: 's3://my-code-bucket/my-function.zip'
    Description: Creates thumbnails of uploaded images
    MemorySize: 1024
    Timeout: 15
    Policies:
     - AWSLambdaExecute # Managed Policy
     - Version: '2012-10-17' # Policy Document
       Statement:
         - Effect: Allow
           Action:
             - s3:GetObject
             - s3:GetObjectACL
           Resource: 'arn:aws:s3:::my-bucket/*'

与以上定义不符。

编辑:

下面是示例函数的执行角色...我没有看到AWS操纵的执行角色名称(例如AWSLambdaBasicExecutionRole)。因为我的理解是,AWSLambdaBasicExecutionRole角色应默认分配给Lambda

enter image description here


在此示例中,我们是否覆盖AWSLambdaExecute的策略定义?

3 个答案:

答案 0 :(得分:2)

指定策略时,基本上是在构建lambda函数的执行角色。

Policies是策略列表,因为角色可以在其中包含多个策略。

此行

- AWSLambdaExecute # Managed Policy

声明您正在创建的lambda函数应包含此AWS托管策略

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [ "logs:*" ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [ "s3:GetObject", "s3:PutObject" ],
      "Resource": "arn:aws:s3:::*"
    }
  ]
} 

以下几行:

- Version: '2012-10-17' # Policy Document
       Statement:
         - Effect: Allow
           Action:
             - s3:GetObject
             - s3:GetObjectACL
           Resource: 'arn:aws:s3:::my-bucket/*'

正在指定要包含在lambda执行角色中的下一个策略。

在此示例中,我们是否覆盖AWSLambdaExecute的策略定义?

否,我们正在向lambda执行角色添加多个策略,其中之一是AWS托管策略,另一个是我们自己的自定义策略。因此,lambda函数将在两个函数中都定义权限。或更准确地说,将对这些策略进行合并,并且lambda函数将具有由该联合定义的权限,这意味着,如果其中一个策略允许lambda函数执行某项操作,而另一个策略拒绝同一件事,则结果将是该操作将被拒绝。

答案 1 :(得分:1)

我认为您的 Policies 属性的作用是:

  • 附加托管策略 AWSLambdaExecute ,然后
  • 为您的执行角色创建一个内联策略,该策略向s3授予 s3:GetObject s3:PutObject 权限。还有一条SO帖子表明SAM现在支持定义内联策略。 [1]

定义内联策略不会覆盖任何内容。 您可以将多个不同类型的策略附加到单个身份(例如IAM用户或角色)。 [2]

参考文献

[1] https://stackoverflow.com/a/52719165/10473469
[2] https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html

答案 2 :(得分:0)

这是我的首选方法(为清楚起见省略其他字段):

 MyLambdaFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Policies:
        - CloudWatchLambdaInsightsExecutionRolePolicy # AWS Managed Policy
        - AWSXrayWriteOnlyAccess # AWS Managed Policy
        - AWSLambdaExecute # AWS Managed Policy
        - Version: '2012-10-17' # Policy Document to allow S3 access
          Statement:
            - Effect: Allow
             Action:
               - s3:GetObject
               - s3:GetObjectACL
             Resource: 'arn:aws:s3:::my-bucket/*'