请帮忙,我被AWS打败了。。。
我有一个具有以下权限的lambda。
sqs基于资源的策略和服务角色都没有任何Deny
语句。lambda应该向另一个SQS队列发送一条消息,但它不能,相反,我只是得到了这个错误
{
"code": "AccessDenied",
"time": "2021-06-03T20:50:09.722Z",
"requestId": "62e15127-9f9b-527f-b1a8-0814dd5a5c9a",
"statusCode": 403,
"retryable": false,
"retryDelay": 47.17774745450638,
"level": "error",
"message": "Access to the resource https://sqs.eu-west-1.amazonaws.com/ is denied.",
"timestamp": "2021-06-03T20:50:09.723Z"
}
应执行此操作的lambda代码(此代码通常位于多个文件上)
import { SQSEvent } from 'aws-lambda';
import { isLeft } from 'fp-ts/lib/Either';
import { first } from 'lodash';
import reporter from 'io-ts-reporters';
import ExitWithSuccess from 'Entities/ExitWithSuccess';
import { error } from '@mvf/logger';
import { SQS } from 'aws-sdk';
import Event from './Event';
const sqsClient = new SQS({
region: 'eu-west-1',
});
const delayed = {
client: sqsClient,
url: 'https://sqs.eu-west-1.amazonaws.com/<account>/event_dispatcher_delayed_messages',
};
type ISqsClient = typeof delayed;
interface SqsOperations {
sendMessage(body: Record<string, unknown>): Promise<unknown>;
}
const sqs = {
instance: ({ client, url }: ISqsClient): SqsOperations => ({
sendMessage: (body: Record<string, unknown>) =>
client
.sendMessage({ QueueUrl: url, MessageBody: JSON.stringify(body) })
.promise(),
}),
delayed,
};
const lambda = async (event: SQSEvent): Promise<void> => {
const record = first(event.Records);
if (!record) {
throw new ExitWithSuccess(error, 'lambda was invoked without any records');
}
const maybeEvent = Event.decode(JSON.parse(record.body));
if (isLeft(maybeEvent)) {
throw new ExitWithSuccess(error, 'invalid record body', {
typeErrors: reporter.report(maybeEvent),
});
}
await sqs.instance(delayed).sendMessage(maybeEvent.right);
};
export default lambda;
我已经花了3天时间,有人遇到过类似的问题吗?怎么可能完全可以访问资源,但仍然无法与之交互?
任何关于这里发生的事情的提示、建议或想法都将不胜感激。
SQS队列是否有明确拒绝访问的基于资源的策略?
SQS队列是否在Lambda函数所在的同一个帐户中?否则,您也需要允许跨帐户访问。
https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-basic-examples-of-sqs-policies.html
我有一个连接到lambda的队列(fifo)。我想在lambda中向标准队列发送一条消息。但没有发送/接收任何消息。然而,如果我尝试从非SQS连接的lambda(通过AppSync)发送它,它会工作。 我查过: lambda有权发送SQS消息(您可以在那里看到) 由于我已成功地从另一个lambda(非SQS)向标准队列发送消息,因此正确配置了标准队列 SQS URL是否正确 控制台中不会显示任何错
我想发送消息到SQS队列上的另一个帐户(俄亥俄州)从lambda在北弗吉尼亚帐户。我该如何实现这一点? 到目前为止我尝试过的事情: > 从北Virigina的lambda发送消息,收到以下错误: “errorMessage”:“调用SendMessage操作时发生错误(AWS.SimpleQueueService.NonExistentQueue):
我在VPC中使用AWS Chalice托管了一个Lambda函数,因为我希望它访问一个无服务器的Aurora DB实例。现在,我还希望这个函数将send_message()转换为SQS。
对于从lambda跨帐户访问SQS,我需要允许附加到lambda的IAM角色具有SQS权限,还是允许IAM角色在SQS的访问策略中具有权限?(或者两者都做?) 更新:基本上,我已经按照下面一些答案中的建议设置了SQS访问策略。 我得到一份工作 尝试向队列boto3.resource('sqs')发送内容时。队列(“某个队列url”)。send_message(**kwargs))`从lambda,
SQS消息由lambda成功处理。下面是处理并执行回调的代码: 我看到cloudwatch打印“OK DONE”消息。然而,SQS将消息“飞行”(并且它将永远飞行)。我的理解是,一旦成功发送响应,该消息将自动删除。我的能见度计时器=10分钟