Amazon web services 无法在SAM模板资源(无服务器函数)中获取策略定义的语法

Amazon web services 无法在SAM模板资源(无服务器函数)中获取策略定义的语法,amazon-web-services,aws-lambda,amazon-iam,aws-serverless,aws-sam,Amazon Web Services,Aws Lambda,Amazon Iam,Aws Serverless,Aws Sam,AWS托管策略(AWSLambdaExecute)的策略定义为: 但是提供了一个使用相同策略名称的示例无服务器函数,如下所示: Type: AWS::Serverless::Function Properties: Handler: index.js Runtime: nodejs8.10 CodeUri: 's3://my-code-bucket/my-function.zip' Description: Creates thumbnails of upl

AWS托管策略(
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
的策略定义?

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

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

这条线

- 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函数执行某些操作,而另一个策略拒绝执行相同的操作,则结果将是该操作将被拒绝

我认为您的策略属性的作用是:

  • 附加托管策略AWSLambdaExecute,然后
  • 为执行角色创建一个内联策略,该策略授予s3权限s3:GetObject和s3:PutObject。还有一篇SO帖子指出SAM现在支持定义内联策略。[1]
定义内联策略不会覆盖任何内容。 您可以将多种不同类型的策略附加到单个标识(例如IAM用户或角色)。[2]

工具书类 [1]

[2] 以下是我的首选方法(为了清晰起见,省略其他字段):

mylambda功能:
类型:“AWS::Serverless::Function”
特性:
政策:
-CloudWatchLambdaintSightsExecutionRolePolicy#AWS管理的策略
-AWSXRayWriteOnly访问#AWS管理策略
-AWSLambdaExecute#AWS管理策略
-版本:“2012-10-17”#允许S3访问的政策文件
声明:
-效果:允许
行动:
-s3:GetObject
-s3:GetObjectACL
资源:“arn:aws:s3:::我的bucket/*”

lambda执行角色的名称是什么?是不是
AWSLambdaBasicExecutionRole
?是的,向CloudWatch日志添加权限的角色称为
AWSLambdaBasicExecutionRole
,但是如果你问cloudformation创建的新角色的名称是什么,那么每次你创建一个新堆栈时,这个名称都是唯一的,比如
lambda-test-ThumbnailFunctionRole-LWUCKA5ULR2A
。Matus,我想这里的问题是:SAM是否创建了一个新的(随机命名的)堆栈模板中指定的每个lambda函数的执行角色?你知道吗?是的,我意识到:)是的,CF将创建新角色。如果你想找到你角色的确切名称,你可以去CloudFormation->选择新创建的堆栈->选择资源->查找角色(角色的逻辑ID将是
NameofFunctionRole
,它将有与其相关的物理ID)
- Version: '2012-10-17' # Policy Document
       Statement:
         - Effect: Allow
           Action:
             - s3:GetObject
             - s3:GetObjectACL
           Resource: 'arn:aws:s3:::my-bucket/*'