【问题标题】:I have a lambda with a role that has full access to SQS but I still can't send messages to SQS我有一个角色可以完全访问 SQS,但我仍然无法向 SQS 发送消息
【发布时间】:2021-08-22 00:02:03
【问题描述】:

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

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

【问题讨论】:

  • 能否提供正在运行的代码?
  • @JasonWadsworth 我已经用 lambda 代码更新了我的问题

标签: amazon-web-services aws-lambda amazon-sqs roles policies


【解决方案1】:

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

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

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

【讨论】:

  • 队列确实有策略但是里面没有Deny语句,只允许语句
  • SQS 队列是否在部署 Lambda 函数的同一账户中?
  • 实际上,帐户是问题...此堆栈最初部署到不同的帐户,我已将其重新部署到新帐户,并且没有考虑到队列 URL 是硬编码的事实,所以我没有将消息发送到当前帐户中的队列,而是尝试将消息发送到前一个帐户中的队列,显然我的 lambda 没有权限这样做。我知道这很愚蠢:D
猜你喜欢
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2019-10-09
相关资源
最近更新 更多