首页 > 解决方案 > 我有一个角色可以完全访问 SQS,但我仍然无法向 SQS 发送消息

问题描述

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

非常感谢任何关于这里发生的事情的提示、建议或想法。

标签: amazon-web-servicesaws-lambdaamazon-sqsrolespolicies

解决方案


SQS 队列是否有明确拒绝访问的基于资源的策略?

SQS 队列是否在 Lambda 函数所在的同一账户中?否则,您还需要允许跨账户访问。

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-basic-examples-of-sqs-policies.html


推荐阅读