当前位置: 首页 > 知识库问答 >
问题:

我有一个具有完全访问SQS的角色的lambda,但我仍然不能向SQS发送消息

宋志学
2023-03-14

请帮忙,我被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天时间,有人遇到过类似的问题吗?怎么可能完全可以访问资源,但仍然无法与之交互?

任何关于这里发生的事情的提示、建议或想法都将不胜感激。

共有1个答案

墨承泽
2023-03-14

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分钟