[FIXED] So lösen Sie eine AWS-Ereignisregel nur aus, wenn eine bestimmte Datei (Schlüssel) in einen S3-Bucket geschrieben wird

Ausgabe

Ich versuche, ein AWS-Ereignis (in CloudWatch oder EventBridge) zu erstellen, das die Ausführung einer AWS Step Function auslöst, wenn eine bestimmte Datei in einen S3-Bucket gestellt wird.

Mein Ereignismuster für die Regel ist unten dargestellt:

{
  "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"
      ]
    }
  }
}

Optimalerweise möchte ich, dass das keyElement auf einen Pfad zeigt, TODAYS DATEder das aktuelle Datum darstellt und _SUCCCESSeine leere Datei ist, die von meinem Job nach erfolgreichem Abschluss in das Verzeichnis gedruckt wird (z. B. wenn heute der 31.10.2019 der vollständige Bucket-Pfad war). Scheck wäre bucketname/date=20191031/_SUCCESS). Das Endziel besteht darin, dass die Ereignisregel eine Schrittfunktion auslöst, die eine Reihe anderer täglicher Jobs steuert, die erst ausgeführt werden können, wenn der erste Job, der die _SUCCESSDatei an den Bucket ausgibt, erfolgreich abgeschlossen wurde.

Vorzugsweise möchte ich die Schlüsselprüfung für die _SUCCESSDatei mit dem aktuellen Datum dieses Tages haben. Wenn es jedoch keine gute Möglichkeit gibt, mit den Daten umzugehen, sollte ich auch in der Lage sein, etwas zum Laufen zu bringen, wenn es eine Möglichkeit gibt, die Regel einmal auszulösen, wenn ein neues Verzeichnis in den Eimer gelegt wird (z. B. auslösen, wenn ein Verzeichnis date=XXXXXXerstellt wird). Ich kann den Trigger einfach nicht jedes Mal aktivieren, wenn eine neue Datei in den Bucket gestellt wird, da der anfängliche Job eine Reihe von Ausgabedateien im date=XXXXXXVerzeichnis erstellt, die als Eingabe für die folgenden Jobs verwendet werden.

Es wäre auch sehr hilfreich, diese Regel über AWS CloudFormation erstellen zu können. Wenn CloudFormation also eine Möglichkeit hätte, mit diesen Problemen umzugehen, wäre das großartig.

Vielen Dank im Voraus für jede Hilfe, es wird sehr geschätzt.

Lösung

Ich bin mir nicht sicher, ob ich verstehe, was Sie hier erreichen wollen, aber warum abonnieren Sie nicht einfach die Lambda-Funktion für den Bucket, in dem Ihre Dateien gespeichert werden (abonnieren Sie das Put-Ereignis), führen Sie alle Arten von Überprüfungen durch, die Sie programmgesteuert durchführen möchten innerhalb dieser Lambda-Funktion und wenn alle Bedingungen erfüllt sind, rufen Sie einfach die erwähnte Schrittfunktion innerhalb der Lambda-Funktion auf.

Und wenn eine der Bedingungen nicht erfüllt ist, starten Sie die Schrittfunktion einfach nicht.

So können Sie die Lambda-Funktion für das S3-Put-Ereignis (über die Webkonsole) abonnieren.

  1. gehe zu S3
  2. Wählen Sie Ihren Eimer
  3. gehe zuProperties tab
  4. auswählenEvents
  5. PUTEreignis prüfen
  6. unter Send to, wähleLambda Function
  7. Wählen Sie eine vorhandene Lambda-Funktion (Sie müssen diese Lambda-Funktion erstellen)

Zugriff auf Eigenschaften wie Bucket-Name, Objektschlüssel und Zeitstempel des Ereignisses innerhalb der Lambda-Funktion. (mit 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

Hier ist ein vollständiges eventObjekt (dh ein S3-Ereignisobjekt) als Referenz.

{
  "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"
        }
      }
    }

  ]
}

So führen Sie die Step-Funktion aus der Lambda-Funktion heraus aus (mit 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

Dabei stateMachineArnist der Amazon-Ressourcenname (ARN) der auszuführenden Zustandsmaschine, name(optional) der Name der Ausführung und inputdie Zeichenfolge, die die JSON-Eingabedaten für die Ausführung enthält.


Beantwortet von –
Matus Dubrava


Antwort geprüft von –
Gilberto Lyons (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like