使用现有S3存储桶触发Lambda函数时如何避免授予`iam:CreateRole`权限?

Gau*_*ani 5 amazon-iam serverless-framework serverless-plugins aws-serverless

我正在尝试部署一个 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
Run Code Online (Sandbox Code Playgroud)

当我运行时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. 
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

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

我的工作场所最近通过使用权限边界加强了 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.
Run Code Online (Sandbox Code Playgroud)

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

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

就我而言,我需要进一步自定义无服务器创建的这个额外角色,以便还为其分配我的雇主定义的所有角色上都应存在的权限边界。这发生在该resources:部分。

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

resources:
  Resources:
    IamRoleCustomResourcesLambdaExecution:
      Type: AWS::IAM::Role
      Properties:
        PermissionsBoundary: arn:aws:iam::XXXXXXXXXXXX:policy/xxxxxxxxxxxx-global-boundary
Run Code Online (Sandbox Code Playgroud)

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

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

provider:
  rolePermissionsBoundary: arn:aws:iam::XXXXXXXXXXXX:policy/xxxxxxxxxxxx-global-boundary
Run Code Online (Sandbox Code Playgroud)

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


Sea*_*ine -1

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

如果您由于 InfoSec 团队等原因受到限制,那么我建议您让 InfoSec 团队查看“无服务器框架部署的 AWS IAM 权限要求”文档。这是一个讨论它的好链接: 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?它是一个随机标识符吗?这是否意味着每次我尝试部署该功能时,无服务器都会尝试创建一个新角色?

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