【发布时间】:2021-10-05 14:01:42
【问题描述】:
对于从 lambda 跨账户访问 SQS,我是否需要允许附加到 lambda 的 IAM 角色拥有 SQS 权限,或者允许 IAM 角色拥有 SQS 的访问策略中的权限? (或者两者都做?)
更新:基本上,我按照以下一些答案中的建议设置了 SQS 访问策略。
我得到了一个
AWS.SimpleQueueService.NonExistentQueue
当尝试从 lambda 向队列 @987654322@boto3.resource('sqs').Queue(" some queue_url").send_message(**kwargs))` 发送内容时,我想知道是否需要权限被显式添加到 IAM 角色本身以允许发送到队列。
在 lambda(在 us-west-1 中)中发送到 SQS 的代码如下:
import boto3
from botocore.config import Config
def lambda_handler(event, context):
boto3.resource('sqs').Queue('https://sqs.us-east-1.amazonaws.com/sqs_accnt_num/name_of_sqs').send_message(MessageBody="SomeMessageJSONDUMP")
SQS 访问策略如下:
{
"Version": "2012-10-17"
"Id": "SomeID",
"Statement" : [
{
"Sid": "somesid",
"Effect": "Allow",
"Principal": "*",
"Action": "SQS:SendMessage",
"Resource":"arn:aws:sqs:us-east-1:sqs_accnt_num:name_of_sqs",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:iam::lambda_accnt_num:role/name:"
}
}
},
{
"Sid": "somesid2",
"Effect": "Deny",
"Principal": "*",
"Action": "sqs:*",
"Resource": "*",
"Condition": {
"Bool": {
"aws:secureTransport": "false"
}
}
}
]}
更新:问题已解决:
看来问题出在 SQS 访问策略中。出于某种原因,在我原来的政策中,当我进行 Condition 检查时:
"Sid": "somesid",
"Effect": "Allow",
"Principal": "*",
"Action": "SQS:SendMessage",
"Resource":"arn:aws:sqs:us-east-1:sqs_accnt_num:name_of_sqs",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "arn:aws:iam::lambda_accnt_num:role/name:"
}
}
然后,我在尝试从 lambda 发送消息时仍然收到“拒绝访问”错误。但正如 John Rotenstein 在他的回答中所建议的那样,我完全删除了 Condition 子句,并将 iam 角色 arn 直接放在 Principal 中,如下所示:
"Sid": "somesid2",
"Effect": "Allow",
"Principal": {
"AWS":"arn:aws:iam::lambda_accnt_num:role/name:"
},
"Action": "sqs:*",
"Resource": "arn:aws:sqs:us-east-1:sqs_accnt_num:name_of_sqs"
然后就成功了! 尽管问题已解决,但有谁知道为什么我的原始政策(带有 Condition 条款)不起作用?我认为政策本身没有任何问题。
John Rotenstein 的回答中的一个小警告;对于来自 lambda 的跨区域 sqs 访问,您必须添加 region_name 字段来表示 sqs 所在的区域,同时创建 sqs_resource,如下所示:
boto3.resource('sqs', region_name='us-east-1')
此外,如果您在 SQS 中启用了加密,请确保您的 lambda 具有 KMS 权限,并且允许 SQS 拥有的 KMS 密钥从 lambda 帐户访问。
【问题讨论】:
-
是的,它已解决,请参阅问题的更新
-
如果任何现有答案有帮助,接受它是一个很好的做法。
标签: amazon-web-services aws-lambda amazon-iam amazon-sqs