首页 > 解决方案 > 无法在 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

在此处输入图像描述


我们是否覆盖了AWSLambdaExecute本示例中的策略定义?

标签: amazon-web-servicesaws-lambdaamazon-iamaws-serverlessaws-sam

解决方案


当您指定策略时,您基本上是在为您的 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 函数做某事而另一个拒绝相同的事情,结果将是该操作将被拒绝。


推荐阅读