Cloudwatch Custom Events SQS не работает

Я использую terraform для создания очередей, а также создаю правила событий Cloudwatch и устанавливаю одну из очередей в качестве цели для правил.

Таким образом, у меня есть одна очередь, которая является целью для 3 отдельных событий cloudwatch. Проблема в том, что хотя правила событий cloudwatch идентичны, только одно из них работает при создании через terraform, остальные заканчиваются неудачными вызовами в консоли без журнала или какой-либо отладочной информации. Если пользовательские события создаются из консоли aws, все работает хорошо.

Создание очереди в terraform

resource "aws_sqs_queue" "queue_cron" {
  name                       = "cron"
  visibility_timeout_seconds = 300 # 5 minutes
  delay_seconds              = 0
  message_retention_seconds  = 1800 # 30 minutes
  receive_wait_time_seconds  = 20
}

Единственный рабочий блок

resource "aws_cloudwatch_event_rule" "eve_vendors_bot_sync" {
  name                = "vendors-bot-sync"
  schedule_expression = "rate(1 minute)"
  description         = "Notify cron queue for vendors bot sync"
  is_enabled          = true
}

resource "aws_cloudwatch_event_target" "sqs_cron_vendors_bot_sync" {
  rule      = aws_cloudwatch_event_rule.eve_vendors_bot_sync.name
  arn       = var.queue_cron_arn
  target_id = "sqsCronVendorBotSync"

  input_transformer {
    input_template = <<EOF
{
   "messageType":"cron",
   "cronType":"vendors-bot-sync"
}
EOF
  }
}

Не работает, хотя по структуре он идентичен приведенному выше.

resource "aws_cloudwatch_event_rule" "eve_restos_sync" {
  name                = "restos-sync"
  schedule_expression = "rate(1 minute)"
  description         = "Notify cron queue for restos sync"
  is_enabled          = true
}

resource "aws_cloudwatch_event_target" "sqs_cron_restos_sync" {
  rule      = aws_cloudwatch_event_rule.eve_restos_sync.name
  arn       = var.queue_cron_arn
  target_id = "sqsCronRestosSync"

  input_transformer {
    input_template = <<EOF
{
   "messageType":"cron",
   "cronType":"restaurant-hours-open-close-management"
}
EOF
  }
}

Аналогично предыдущему, не работает

resource "aws_cloudwatch_event_rule" "eve_vendors_orders_sync" {
  name                = "vendors-orders-sync"
  schedule_expression = "rate(1 minute)"
  description         = "Notify cron queue for vendors orders sync"
  is_enabled          = true
}
resource "aws_cloudwatch_event_target" "target_cron_vendors_sync" {
  rule      = aws_cloudwatch_event_rule.eve_vendors_orders_sync.name
  arn       = var.queue_cron_arn
  target_id = "sqsCronVendorsOrderSync"

  input_transformer {
    input_template = <<EOF
{
   "messageType":"cron",
   "cronType":"vendors-orders-sync"
}
EOF
  }
}

Отвечать

Недостающая часть головоломки, как справедливо указал @Marchin, действительно была политикой, которая не позволяла cloudwatch отправлять сообщение в SQS. Вот обновленный конфиг, который заставил его работать.

  1. Создать очередь
  2. Создайте политику, которая позволит облачным службам отправлять сообщения в очередь.
  3. Прикрепить политику к очереди
resource "aws_sqs_queue" "queue_cron" {
  name                       = "cron"
  visibility_timeout_seconds = 300 # 5 minutes
  delay_seconds              = 0
  message_retention_seconds  = 1800 # 30 minutes
  receive_wait_time_seconds  = 20
}

data "aws_iam_policy_document" "policy_sqs" {
  statement {

    sid    = "AWSEvents_"
    effect = "Allow"
    actions = [
      "sqs:SendMessage",
    ]

    principals {
      type        = "Service"
      identifiers = ["events.amazonaws.com"]
    }

    resources = [aws_sqs_queue.queue_cron.arn]

  }
}

resource "aws_sqs_queue_policy" "cron_sqs_policy" {

  queue_url = aws_sqs_queue.queue_cron.id
  policy    = data.aws_iam_policy_document.policy_sqs.json

}

Настроили ли вы политику SQS для предоставления разрешений на публикацию событий CW в sqs?

Marcin 21.12.2020 00:14
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
1
541
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что ваши разрешения на очередь SQS отсутствуют или неверны. Предполагая, что вы создаете свой queue_cron в terraform (не показан в вопросе), очередь и ее политика, разрешающая CW Events отправлять в нее сообщения, будут:

data "aws_caller_identity" "current" {}

data "aws_region" "current" {}

resource "aws_sqs_queue" "queue_cron" {
  name   = "queue_cron"
}

resource "aws_sqs_queue_policy" "test" {

  queue_url = aws_sqs_queue.queue_cron.id

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Id": "sqspolicy",
  "Statement": [
    {
      "Sid": "First",
      "Effect": "Allow",
      "Principal": {
        "AWS": "${data.aws_caller_identity.current.account_id}"
      },
      "Action": "sqs:*",
      "Resource": "${aws_sqs_queue.queue_cron.arn}"
    },
    {
      "Sid": "AWSEvents_",
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sqs:SendMessage",
      "Resource": "${aws_sqs_queue.queue_cron.arn}",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:events:${data.aws_region.current.name}:${data.aws_caller_identity.current.account_id}:rule/*"
        }
      }
    }  
  ]
}
POLICY
}

@Marchin Я обновил вопрос, включив в него создание очереди, и я действительно не привязывал к нему никаких конкретных политик. Я попробую приведенный выше код, но непонятно, почему одно из событий будет работать, а другие нет, если политика была неправильной, ни одно из них не должно было работать.

Jude Fernandes 21.12.2020 07:10

@JudeFernandes Это правильно. Но поскольку вы не показали создание очереди или ее политику, возможный сценарий заключался в том, что она была создана в консоли AWS и настроена с помощью политики только для одной очереди.

Marcin 21.12.2020 08:49

@Marchin, это действительно была политика, большое спасибо. Вся инфраструктура была построена исключительно с использованием terraform до того момента, когда события не сработали, когда я попробовал это через консоль. Странно, что один работал, а другой нет, но они все работают теперь, когда политика прилагается.

Jude Fernandes 21.12.2020 09:29

Другие вопросы по теме

Похожие вопросы

Почему я не могу получить доступ через SSH к экземпляру EC2 через другой экземпляр EC2 без предоставления .pem?
Как получить имя столбца данных из базы данных RDS в качестве ответа в JSON в лямбда-функции AWS с использованием Nodejs
PySpark читает json в формате DynamoDB
Есть ли способ управлять (добавлять/удалять) несколькими пользователями в нескольких экземплярах Linux AWS EC2?
Freenom.com и AWS Amplify: Amazon просит меня «настроить корневой домен» (@ ANAME abc-whatever-xyz.cloudfront.net) -> Freenom: подстановочные знаки не допускаются
Как я могу разместить в облаке веб-сайт, который будут использовать только 3 или около того человек, или как защитить его от DDoS-атак?
Не удается связаться с другим контейнером внутри той же задачи на ECS Fargate, используя тип сети awsvpc.
Поведение операции удаления AWS SQS
Как экспортировать сертификат домена из диспетчера сертификатов AWS для импорта в хранилище ключей Java?
Запрос глобального вторичного индекса таблицы DynamoDB без использования ключа раздела