Как активировать правило событий AWS, только когда определенный файл (ключ) записывается в корзину S3 - PullRequest
2 голосов
/ 31 октября 2019

Я пытаюсь создать событие AWS (в CloudWatch или EventBridge), которое запускает пошаговую функцию AWS, когда определенный файл помещается в корзину S3. Мой шаблон событий для Правила показан ниже:

{
  "source": [
    "aws.s3"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "s3.amazonaws.com"
    ],
    "eventName": [
      "PutObject"
    ],
    "requestParameters": {
      "bucketName": [
        "bucketname"
      ],
      "key": [
        "date={{TODAYS DATE}}/_SUCCESS"
      ]
    }
  }
}

Оптимально, я бы хотел, чтобы элемент key указывал на путь, где TODAYS DATE представляет текущую дату, а _SUCCCESS - пустой файл. после успешного выполнения задания в каталог распечатывается в каталог (например, если сегодня было 31.10.2009, полный путь к корзине для проверки будет bucketname/date=20191031/_SUCCESS). Конечная цель состоит в том, чтобы Правило событий запускало пошаговую функцию, которая контролирует ряд других ежедневных заданий, которые могут выполняться только после успешного завершения первого задания, которое выводит файл _SUCCESS в корзину.

ПредпочтительноЯ хотел бы проверить ключ для файла _SUCCESS, используя текущую дату этого дня. Однако, если нет хорошего способа справиться с датами, я также смогу заставить что-то работать, если есть способ вызвать Правило один раз, когда новый каталог помещается в корзину (например, триггер, когда каталог date=XXXXXXсоздано). Я просто не могу активировать триггер каждый раз, когда в корзину помещается новый файл, так как первоначальное задание создаст несколько выходных файлов в каталоге date=XXXXXX, которые используются в качестве входных данных для следующих заданий.

Также было бы очень полезно иметь возможность создавать это правило с помощью AWS CloudFormation, поэтому, если CloudFormation имеет какой-либо способ справиться с этими проблемами, было бы замечательно.

Заранее спасибо за любую помощь, это очень важнооценили.

1 Ответ

1 голос
/ 31 октября 2019

Я не уверен, понимаю ли я, чего вы здесь добиваетесь, но почему бы вам просто не подписать лямбда-функцию на корзину, где хранятся ваши файлы (подписать ее, поставить событие), делать любые проверки, какие вы хотитечтобы выполнить программно внутри этой лямбда-функции и, если все условия выполнены, просто вызвать упомянутую пошаговую функцию из лямбда-функции.

И если какое-либо условие не выполняется, просто не запускайте функцию шага.

Вот как вы можете подписать лямбда-функцию на событие S3 put (через веб-консоль).

  1. перейти на S3
  2. выбрать ваше ведро
  3. перейти к Properties tab
  4. выбрать Events
  5. проверить PUT событие
  6. под Send to, выбрать Lambda Function
  7. выбрать существующийлямбда-функция (вам нужно создать эту лямбда-функцию)

Как получить доступ к таким свойствам, как имя сегмента, ключ объекта и метка времени события изнутри лямбда-функции. (с использованием Python)

def handler_name(event, context): 
    // get bucket name
    print(event['Records'][0]['s3']['bucket']['name'])

    // get object key
    print(event['Records'][0]['s3']['object']['key'])

    // get event timestamp
    print(event['Records'][0]['eventTime'])

    return 0

Вот полный event объект (объект события S3) для справки.

{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-2",
      "eventTime": "2019-09-03T19:37:27.192Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "AWS:AIDAINPONIXQXHT3IKHL2"
      },
      "requestParameters": {
        "sourceIPAddress": "205.255.255.255"
      },
      "responseElements": {
        "x-amz-request-id": "D82B88E5F771F645",
        "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
        "bucket": {
          "name": "lambda-artifacts-deafc19498e3f2df",
          "ownerIdentity": {
            "principalId": "A3I5XTEXAMAI3E"
          },
          "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df"
        },
        "object": {
          "key": "b21b84d653bb07b05b1e6b33684dc11b",
          "size": 1305107,
          "eTag": "b21b84d653bb07b05b1e6b33684dc11b",
          "sequencer": "0C0F6F405D6ED209E1"
        }
      }
    }

  ]
}

Как выполнить функцию шагаиз лямбда-функции (с использованием Python + Boto3)

import boto3

sfn_client = boto3.client('stepfunctions')

def handler_name(event, context): 

    response = sfn_client.start_execution(
        stateMachineArn='string',
        name='string',
        input='string'
    )

    return 0

где stateMachineArn - имя ресурса Amazon (ARN) конечного автомата для выполнения, name (необязательно) - имявыполнение и input - это строка, содержащая входные данные JSON для выполнения.

...