首页 > 解决方案 > 使用无服务器框架访问不同 AWS 账户中的 SQS 队列

问题描述

我无法找到与无服务器框架相关的问题的答案,并且无法部署 lambda,但如果我错过了,请告诉我。

我的场景是我的 lambda 在账户 0001 中,我需要从 AWS 账户 0002 中的 SQS 队列中读取消息。角色“interestingrole”是通过 Terraform 在账户 0001 中创建的,除非有原因,否则我更愿意保持这种状态通过无服务器来完成。账户 0002 中的 SQS 队列为账户 0001 中的角色“interestingrole”设置了信任关系。账户 0001 中的策略如下所示

{
“Version”: “2012-10-17”,
“Statement”: [
{
“Sid”: “AllowMyRequest”,
“Effect”: “Allow”,
“Action”: [
“sqs:ReceiveMessage”,
“sqs:GetQueueUrl”,
“sqs:GetQueueAttributes”,
“sqs:DeleteMessageBatch”,
“sqs:DeleteMessage”,
“sqs:ChangeMessageVisibilityBatch”,
“sqs:ChangeMessageVisibility”
],
“Resource”: “arn:aws:sqs:us-east-1:0002:interesting-queue”
},

在账户 0002 中,已与在账户 0001 中创建的角色建立了信任关系(与运行 lambda 的位置相同)。我不控制帐户 0002。

如果我在我的 serverless.yml 中创建一个同名的队列并将资源设置为 0001 而不是 0002 它将部署得很好并且也可以从该队列中读取消息但是如果我使用帐户 0002 我会收到部署错误“An发生错误:EventHandlerEventSourceMappingSQSCinterestingqueue - 提供的请求无效:提供的执行角色无权在 SQS 上调用 ReceiveMessage(服务:Lambda,状态代码:400)

我是否需要在我的 serverless.yml 中设置 AssumeRole 或以其他方式引用我创建的角色“interestingrole”?我找不到这种特殊情况的示例,其中我的角色在我控制并执行 lambda (0001) 的帐户中,但我要访问的资源在不同的帐户中。

我目前没有为队列配置 iAmRoleStatement。

无服务器.yml

functions:
eventHandler:
handler: src/lambda.handler
events:
- sqs: “arn:aws:sqs:us-east-1:0002:interesting-queue”

谢谢!

标签: amazon-web-servicesserverless-frameworkserverless

解决方案


对于遇到此问题的其他任何人,我通过指定我希望 lambda 在 serverless.yml 中使用的自定义 IAM 角色来解决它:

provider:
  name: aws
  role: arn:aws:iam:0002:role/interestingrole

这有缺点,因为 iamRoleStatements 不再适用,因此您必须将日志权限和 lambda 所需的其他权限添加到此自定义角色,但对于我非常狭窄的用例,这是可以接受的。

您可以在https://www.serverless.com/framework/docs/providers/aws/guide/iam/部分“自定义 IAM 角色”下查看更多信息。


推荐阅读