【问题标题】:How to avoid giving `iam:CreateRole` permission when using existing S3 bucket to trigger Lambda function?使用现有 S3 存储桶触发 Lambda 函数时如何避免授予 `iam:CreateRole` 权限?
【发布时间】:2020-02-05 07:51:58
【问题描述】:

我正在尝试部署一个在将 AVRO 文件写入现有 S3 存储桶时触发的 AWS Lambda 函数。

我的serverless.yml配置如下:

service: braze-lambdas

provider:
  name: aws
  runtime: python3.7
  region: us-west-1
  role: arn:aws:iam::<account_id>:role/<role_name>
  stage: dev
  deploymentBucket:
    name: serverless-framework-dev-us-west-1
    serverSideEncryption: AES256

functions:
  hello:
    handler: handler.hello
    events:
      - s3:
          bucket: <company>-dev-ec2-us-west-2
          existing: true
          events: s3:ObjectCreated:*
          rules:
            - prefix: gaurav/lambdas/123/
            - suffix: .avro

当我运行serverless deploy 时,我收到以下错误:

ServerlessError: An error occurred: IamRoleCustomResourcesLambdaExecution - API: iam:CreateRole User: arn:aws:sts::<account_id>:assumed-role/serverless-framework-dev/jenkins_braze_lambdas_deploy is not authorized to perform: iam:CreateRole on resource: arn:aws:iam::<account_id>:role/braze-lambdas-dev-IamRoleCustomResourcesLambdaExec-1M5QQI6P2ZYUH. 

我看到有人提到无服务器需要 iam:CreateRole,因为 CloudFormation 是如何工作的,但是如果我想使用 existing: true,任何人都可以确认这是否是唯一的解决方案?除了使用在框架添加对existing: true 配置的支持之前使用的旧无服务器插件之外,还有其他方法吗?

另外,arn:aws:iam::&lt;account_id&gt;:role/braze-lambdas-dev-IamRoleCustomResourcesLambdaExec-1M5QQI6P2ZYUH 中的 1M5QQI6P2ZYUH 是什么?它是一个随机标识符吗?这是否意味着每次我尝试部署 Lambda 函数时,Serverless 都会尝试创建新的 IAM 角色?

【问题讨论】:

    标签: amazon-iam serverless-framework aws-serverless serverless-plugins


    【解决方案1】:

    我刚遇到这个,克服它。

    我还有一个 lambda,我想为它附加一个 s3 事件到一个已经存在的存储桶。

    我的工作地点最近通过使用Permission Boundaries 加强了 AWS 账户安全。

    所以我在部署过程中遇到了非常相似的错误

      Serverless Error ---------------------------------------
    
      An error occurred: IamRoleCustomResourcesLambdaExecution - API: iam:CreateRole User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/xx-crossaccount-xx/aws-sdk-js-1600789080576 is not authorized to perform: iam:CreateRole on resource: arn:aws:iam::XXXXXXXXXXXX:role/my-existing-bucket-IamRoleCustomResourcesLambdaExec-LS075CH394GN.
    

    如果您在无服务器站点上阅读 Using existing buckets,它会说

    注意:使用现有配置将向您的堆栈添加额外的 Lambda 函数和 IAM 角色。 Lambda 函数备份用于支持现有 S3 存储桶的自定义 S3 资源。

    在我的情况下,我需要进一步自定义无服务器创建的这个额外角色,以便它也被分配了我的雇主定义的权限边界应该存在于所有角色上。这发生在resources: 部分。

    如果您的雇主使用权限边界,您显然需要知道要使用的正确 ARN

    resources:
      Resources:
        IamRoleCustomResourcesLambdaExecution:
          Type: AWS::IAM::Role
          Properties:
            PermissionsBoundary: arn:aws:iam::XXXXXXXXXXXX:policy/xxxxxxxxxxxx-global-boundary
    

    关于无服务器 Resources 配置的一些信息

    看看你自己的serverless.yaml,你可能已经在provider 部分定义了权限边界。如果是这样,您会在 rolePermissionsBoundary 下找到它,我认为这是在无服务器版本 1.64 中添加的

    provider:
      rolePermissionsBoundary: arn:aws:iam::XXXXXXXXXXXX:policy/xxxxxxxxxxxx-global-boundary
    

    如果是这样,您应该能够在我在此处发布的 resources: 示例中使用该 ARN。

    【讨论】:

      【解决方案2】:

      出于测试目的,我们可以使用:

      provider:
        name: aws
        runtime: python3.8
        region: us-east-1
        iamRoleStatements:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      

      【讨论】:

      • 检查您的 AWS 密钥是否公开。这也会在部署时产生问题。
      【解决方案3】:

      为了运行sls deploy,我建议您使用具有管理员权限的角色/用户/策略。

      如果您因信息安全团队等原因受到限制,那么我建议您让信息安全团队查看“无服务器框架部署的 AWS IAM 权限要求”文档。这是一个讨论它的好链接:https://github.com/serverless/serverless/issues/1439。至少,他们应该添加iam:CreateRole,这可以让你今天畅通无阻。

      现在我将解决您的个人问题:

      如果我想使用existing: true,任何人都可以确认这是否是唯一的解决方案

      苹果和橙子。您的 S3 配置与您的错误消息无关。 iam:CreateRole 必须添加到任何/谁在做 sls deploy 的政策中。

      另外,arn:aws:iam::&lt;account_id&gt;:role/braze-lambdas-dev-IamRoleCustomResourcesLambdaExec-1M5QQI6P2ZYUH 中的1M5QQI6P2ZYUH 是什么?它是一个随机标识符吗?这是否意味着每次我尝试部署该功能时,Serverless 都会尝试创建一个新角色?

      1. 是的,它是一个随机标识符
      2. 不,sls 不会每次都创建新角色。此唯一 ID 被缓存并重新用于更新现有堆栈。
      3. 如果堆栈被销毁/重新创建,它将分配一个生成新的唯一 ID。

      【讨论】:

      • 第一个答案是错误的,我已经部署了很多Serverless项目没有给iam:createRole,是可以做到的。然后,当我尝试将 S3 添加到 Lambda 事件时,就像在我的项目中完成的一样,我得到与 OP 相同的错误。出于明显的安全原因,我也在寻找一种不必创建我无法处理的角色的方法。我猜 Serverless 暂时无法做到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 2019-11-09
      • 2016-09-05
      • 1970-01-01
      • 2017-06-08
      相关资源
      最近更新 更多