【发布时间】:2021-02-01 17:45:58
【问题描述】:
我无法找到与无服务器框架相关的问题的答案,并且无法部署 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 我得到部署错误“发生错误:EventHandlerEventSourceMappingSQSCinterestingqueue - 提供的请求无效:提供的执行角色无权调用 SQS 上的 ReceiveMessage(服务:Lambda,状态代码:400”
我是否需要在我的 serverless.yml 中设置 AssumeRole 或以其他方式引用我创建的角色“interestingrole”?对于这种特殊情况,我找不到示例,我的角色在我控制并执行 lambda (0001) 的帐户中,但我要访问的资源在不同的帐户中。
我目前没有为队列配置 iAmRoleStatement。
serverless.yml
functions:
eventHandler:
handler: src/lambda.handler
events:
- sqs: “arn:aws:sqs:us-east-1:0002:interesting-queue”
谢谢!
【问题讨论】:
-
什么是 SQS 资源策略?它应该允许从第一个帐户访问 lambda 执行角色。您发布的政策是否适用于 SQS 队列政策?如果有,它没有
Principle? -
@Marcin 不,它没有原则。组织中的另一个团队已指定他们希望如何设置角色。
-
如果我理解您的场景,无服务器框架确实不是其中的任何部分。您在账户 0001 中的 Lambda 函数应具有本地资源所需的任何权限(至少是 AWSLambdaBasicExecutionRole)加上 sts:AssumeRole 对interestingrole 的 ARN 的权限。 Lambda 函数在执行时应承担为它提供 STS 凭证的有趣角色。使用这些 STS 凭据创建新的 SDK 服务对象(例如 boto3 客户端),以针对帐户 0002 的 SQS 队列进行 SQS API 调用。
标签: amazon-web-services serverless-framework serverless