Как получить содержимое события в ECS, когда оно вызывается событием cloudwatch / eventbridge? - PullRequest
2 голосов
/ 09 июля 2020

Мы можем настроить правила событий для запуска задачи ECS, но я не вижу, передается ли инициирующее событие выполняющейся задаче ECS и в задаче, как получить содержимое этого события. Если срабатывает лямбда, мы можем получить ее из переменной event, например, в Python:

def lambda_handler(event, context):
...

Но в ECS я не понимаю, как я могу делать то же самое. Переход к ведру журнала Cloudtrail не кажется хорошим способом, потому что он имеет задержку около 5 минут для появления нового журнала / события, что требует ожидания ECS и дополнительных logi c, чтобы поговорить с S3 и найти и прочтите журнал. А когда запускающие события происходят часто, с этим трудно справиться.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

После дальнейшего исследования я, наконец, разработал другое решение, которое заключается в использовании S3 для вызова Lambda, а затем в этой Lambda я использую ECS SDK (boto3, я использую Python) для запуска моей задачи ECS. Таким образом, я могу легко передать содержимое события в ECS, и это происходит почти в реальном времени.

Но я все же отдаю должное @Adiii, потому что его решение также работает.

0 голосов
/ 09 июля 2020

Один из способов справиться с этим - установить две цели в правиле наблюдения за облаком.

  • Одна цель запустит задачу ECS
  • Одна цель будет pu sh одно и то же событие to SQS

Таким образом, SQS будет содержать такую ​​информацию, как

{
  "version": "0",
  "id": "89d1a02d-5ec7-412e-82f5-13505f849b41",
  "detail-type": "Scheduled Event",
  "source": "aws.events",
  "account": "123456789012",
  "time": "2016-12-30T18:44:49Z",
  "region": "us-east-1",
  "resources": [
    "arn:aws:events:us-east-1:123456789012:rule/SampleRule"
  ],
  "detail": {}
}

Итак, когда ECS TASK будет запущен, он сможет читать событие из SQS. введите описание изображения здесь

Например, в Docker точка входа

#!/bin/sh
echo "Starting container"
echo "Process SQS event"
node process_schdule_event.sj


#or if you need process at run time
schdule_event=$(aws sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/123456789/demo --attribute-names All --message-attribute-names All --max-number-of-messages 1)
echo "Schdule Event: ${schdule_event}"


# one process done, start the main process of the container
exec "$@"
...