Amazon Simple Storage Storage (S3) ist ein Dienst, der Objekte mit Hilfe eines Schlüssels und eines Wertes speichert. Auf die mit einem Schlüssel verbundenen Daten kann über eine Webservice-API einfach zugegriffen werden. S3 ist ein Kerndienst von AWS und eignet sich hervorragend für die Speicherung von Daten aller Art. S3 unterstützt eine Funktion namens 'Ereignisbenachrichtigungen', mit der Sie ereignisgesteuerte Systeme erstellen können. Wenn bestimmte Ereignisse in Ihrem Bucket eintreten, wie z.B. die Erstellung oder Löschung eines Objekts, kann ein Ereignis an SNS oder eine Lambda-Funktion gesendet werden. In diesem Blog sehen wir uns an, wie Sie einen Lambda als Event-Handler einrichten.
CloudFormation Konfiguration
Die CloudFormation-Konfiguration ist einfach. Wir müssen einen Namen für den Bucket mit Hilfe eines benutzerdefinierten Anbieters angeben, der eine zufällige Zeichenfolge generiert. Als nächstes müssen wir eine Berechtigung angeben, damit der Bucket den Lambda aufrufen kann.
InputBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref '${RandomName}'
NotificationConfiguration:
LambdaConfigurations:
- Function: !GetAtt NotificationLambda.Arn
Event: s3:ObjectCreated:*
LambdaInvokePermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !GetAtt NotificationLambda.Arn
Action: lambda:InvokeFunction
Principal: s3.amazonaws.com
SourceAccount: !Ref AWS::AccountId
SourceArn: !Sub 'arn:aws:s3:::${RandomName}'
Benutzerdefinierter Anbieter
Um einen zufälligen Namen zu generieren, erstellen wir einen benutzerdefinierten Anbieter.
RandomName:
Type: Custom::RandomNameGenerator
Properties:
ServiceToken: !GetAtt 'RandomNameGenerator.Arn'
RandomNameGenerator:
Type: AWS::Lambda::Function
Properties:
Handler: index.lambda_handler
Timeout: 30
Role: !GetAtt 'LambdaBasicExecutionRole.Arn'
Runtime: python3.6
Code:
ZipFile: |
import string
import random
import cfnresponse
def lambda_handler(event, context):
if event['RequestType'] == 'Create':
event['PhysicalResourceId'] = ''.join(random.choice(string.ascii_lowercase) for _ in range(16))
cfnresponse.send(event, context, cfnresponse.SUCCESS, {}, event['PhysicalResourceId'])
Der Eimersammler
Der Event-Handler für den Bucket ist eine Lambda-Funktion, die das empfangene Ereignis in die CloudWatch-Protokolle ausgibt.
def handler(event, ctx):
print(event)
ObjectCreated Ereignis
Wenn wir eine Datei in den Bucket hochladen, wird das folgende Ereignis von der Lambda empfangen. Das Feld Records enthält nur einen einzigen Eintrag und die Details für das ObjectCreated-Ereignis wie den Bucket- und Schlüsselnamen sowie Ort und Zeitpunkt des Ereignisses.
{
"Records": [
{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "eu-west-1",
"eventTime": "2018-11-18T12:42:15.922Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "AWS:AIDAJSZKO5A3SBJFMYXTE"
},
"requestParameters": {
"sourceIPAddress": "217.19.26.243"
},
"responseElements": {
"x-amz-request-id": "B9CC7E95824DAC64",
"x-amz-id-2": "qufqqLvaJ4w7e9UwHdBply4jPEJhwJXbL5qYr0fbhAtZPn0+lfixoN26JC/80uBGpHPxbvDL9XM="
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "8450cff2-771d-4a5f-9599-255bc97cbd47",
"bucket": {
"name": "qmuixbpinyhhlwpd",
"ownerIdentity": {
"principalId": "A97CX0CDO58US"
},
"arn": "arn:aws:s3:::qmuixbpinyhhlwpd"
},
"object": {
"key": "README.md",
"size": 215,
"eTag": "2e59fd3b13286947aa9d4dcaa03bf568",
"sequencer": "005BF15E27DB726B35"
}
}
}
]
}
Fazit
Es ist einfach, S3 Event Notifications einzurichten. Der s3-Bucket muss die Erlaubnis haben, das Lambda aufzurufen. Das Lambda kann eine beliebige Logik enthalten, die ausgeführt wird, wenn etwas mit dem Bucket passiert. Nächstes Mal sehen wir uns an, wie man empfangene CloudFront-Protokolldateien von einem S3-Bucket an den AWS Elasticsearch-Service sendet.
Verfasst von
Dennis Vriend
Contact
