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



我正在尝试部署一个 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: true,任何人都可以确认这是否是唯一的解决方案吗?除了使用在框架添加对existing: true配置的支持之前使用的旧无服务器插件之外,还有其他解决方法吗?

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

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

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

如果您阅读使用无服务器站点上的现有存储桶,则会显示

注意:使用现有配置将向堆栈添加额外的 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。

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

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

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

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

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

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

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

另外,arn:aws:iam::<account_id>:role/braze-lambdas-dev-IamRoleCustomResourcesLambdaExec-1M5QQI6P2ZYUH1M5QQI6P2ZYUH是什么?它是随机标识符吗?这是否意味着每次尝试部署函数时,无服务器都会尝试创建新角色?

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

最新更新