3

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

我的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. 

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

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

4

3 回答 3

5

我刚刚遇到这个,并克服它。

我还有一个 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.

如果您阅读在无服务器站点上使用现有存储桶,它会说

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

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

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

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

有关无服务器资源配置的一些信息

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

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

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

于 2020-09-22T17:17:33.407 回答
0

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

provider:
  name: aws
  runtime: python3.8
  region: us-east-1
  iamRoleStatements:
  - Effect: Allow
    Action: "*"
    Resource: "*"
于 2020-11-30T17:58:26.780 回答
-1

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

如果您由于您的 InfoSec 团队等而受到限制,那么我建议您让您的 InfoSec 团队查看“AWS IAM Permission Requirements for Serverless Framework Deploy”的文档。这是一个讨论它的好链接:https ://github.com/serverless/serverless/issues/1439 。至少,他们应该添加iam:CreateRole,这可以让你今天畅通无阻。

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

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

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

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

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