我正在使用AWS SQS服务,而且我很难在我的SQS队列上定义权限。在我的设置中,我使用AWS Lambda服务,该服务在将对象推送到S3存储桶时触发。
然而,为了简单地回答我的问题,这就是我想要实现的目标:
答案 0 :(得分:9)
我认为SourceArn
字段不会被Lambda填充。我知道SourceArn适用于SNS,但Lambda实际上运行的是任意代码,而不是像SNS这样的AWS功能。
作为替代方案,您可以将策略附加到Lambda函数运行的IAM角色。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1440529349000",
"Effect": "Allow",
"Action": [
"sqs:SendMessage"
],
"Resource": [
"arn:aws:sqs:us-west-2:123456789012:test-queue"
]
}
]
}
此方法不需要直接附加到队列的策略。
答案 1 :(得分:0)
您还可以指定 SQS 访问策略,拒绝发送除 lambda 之外的消息
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "Only API Gateway is allowed to send messages",
"Effect": "Deny",
"Principal": "*",
"Action": "SQS:SendMessage",
"Resource": "arn:aws:sqs:eu-west-1:XXX:my_sqs_queue",
"Condition": {
"StringNotLike": {
"aws:userid": [
"AROA4XB7NRHNVE2XY7ABC:*"
]
}
}
}
]
}
通过为角色 ID 提供通配符 Principal * 和条件键 aws:userid。需要在条件子句中指定以下内容
<USER ID of the Role being used by the Lambda:*>
可以使用以下 CLI 命令检索角色 AROA4XB7NRHNVE2XY7ABC 的用户 ID
aws iam get-role --role-name my_lambda_role
{
"Role": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
},
"RoleId": "AROA4XB7NRHNWU35SVABC",
"CreateDate": "2020-01-21T11:40:55Z",
"RoleName": "my_lambda_role",
"Path": "/",
"Arn": "arn:aws:iam::XXX:role/my_lambda_role"
}
}
有关此案例的更多信息可以在here