【问题标题】:Could not get the syntax of policy definition in SAM template resource(serverless function)无法在 SAM 模板资源中获取策略定义的语法(无服务器功能)
【发布时间】:2019-11-23 11:55:25
【问题描述】:

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-services aws-lambda amazon-iam aws-serverless aws-sam


    【解决方案1】:

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

     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/*'
    

    【讨论】:

      【解决方案2】:

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

      • 附加托管策略AWSLambdaExecute,然后
      • 为您的执行角色创建一个内联策略,授予 s3 权限 s3:GetObjects3: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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 那个 lambda 执行角色的名称是什么?是AWSLambdaBasicExecutionRole 吗?
        • 是的,正在向 CloudWatch 日志添加权限的人称为 AWSLambdaBasicExecutionRole,但如果您要问由 cloudformation 创建的新角色的名称是什么,那么该名称每次都是唯一的你创建了一个类似lambda-test-ThumbnailFunctionRole-LWUCKA5ULR2A 的新堆栈。
        • Matus ,我认为这里的问题是:SAM 是否为模板中指定的每个 lambda 函数创建一个新的(随机命名的)执行角色?你知道吗?
        • 是的,我意识到 :) 是的,CF 将创建新角色。
        • 如果你想找到你的角色的确切名称,你可以去 CloudFormation -> 选择新创建的堆栈 -> 选择资源 -> 查找角色(角色的逻辑 ID 将是NameOfTheFunctionRole,它将具有与之关联的物理ID)
        猜你喜欢
        • 2018-08-05
        • 2021-08-17
        • 2019-10-05
        • 2021-08-01
        • 1970-01-01
        • 2023-01-19
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多