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 key
Element auf einen Pfad zeigt, TODAYS DATE
der das aktuelle Datum darstellt und _SUCCCESS
eine 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 _SUCCESS
Datei an den Bucket ausgibt, erfolgreich abgeschlossen wurde.
Vorzugsweise möchte ich die Schlüsselprüfung für die _SUCCESS
Datei 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=XXXXXX
erstellt 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=XXXXXX
Verzeichnis 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.
- gehe zu S3
- Wählen Sie Ihren Eimer
- gehe zu
Properties tab
- auswählen
Events
PUT
Ereignis prüfen- unter
Send to
, wähleLambda Function
- 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 event
Objekt (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 stateMachineArn
ist der Amazon-Ressourcenname (ARN) der auszuführenden Zustandsmaschine, name
(optional) der Name der Ausführung und input
die Zeichenfolge, die die JSON-Eingabedaten für die Ausführung enthält.
Beantwortet von – Matus Dubrava
Antwort geprüft von – Gilberto Lyons (FixError Admin)