Wie kann ich einen CloudFormation-Ressourcenimport verwenden, um eine Amazon S3-Benachrichtigungskonfiguration für Lambda auf einem vorhandenen S3-Bucket zu erstellen?
Ich möchte eine Amazon Simple Storage Service (Amazon S3)-Benachrichtigungskonfiguration für AWS Lambda auf einem vorhandenen S3-Bucket erstellen. Ich möchte dies tun, indem ich AWS CloudFormation verwende, um eine Ressource zu importieren.
Kurzbeschreibung
Gehen Sie wie folgt vor, um eine Amazon S3-Benachrichtigung zu konfigurieren, ohne eine benutzerdefinierte Ressource zu verwenden:
- Erstellen Sie eine Vorlage mit der Lambda-Funktion S3NotificationLambdaFunction. Diese Funktion fügt die vorhandene Bucket-NotificationS3Bucket-Benachrichtigungskonfiguration hinzu.
- Verwenden Sie einen Ressourcenimport, um den vorhandenen NotificationS3Bucket-S3-Bucket, der in der Vorlage festgelegt ist, in die CloudFormation-Verwaltung zu übernehmen.
- Aktualisieren Sie den CloudFormation-Stack, sodass er die Eigenschaften enthält, die Sie in Ihrem S3-Bucket aktivieren möchten.
Informationen zur Verwendung einer benutzerdefinierten Ressource finden Sie unter Wie kann ich CloudFormation verwenden, um eine Amazon S3-Benachrichtigungskonfiguration für Lambda auf einem vorhandenen S3-Bucket zu erstellen?
Lösung
Wichtig: Die folgenden Schritte überschreiben alle vorhandenen oder manuell erstellten Benachrichtigungskonfigurationen in einem S3-Bucket. Gehen Sie wie folgt vor, um einem importierten S3-Bucket eine neue Benachrichtigungskonfiguration hinzuzufügen.
Eine CloudFormation-Vorlage mit einer Lambda-Funktion erstellen
Die folgende Beispielvorlage erstellt eine Lambda-Funktion mit einer laufenden Rolle und Berechtigungen zum Aufrufen der Funktion. Um eine vorhandene Lambda-Funktion zu verwenden, verwenden Sie den Amazon-Ressourcennamen (ARN) der Funktion in Ihrer CloudFormation-Vorlage für die Eigenschaft LambdaConfiguration im S3-Bucket.
AWSTemplateFormatVersion: 2010-09-09 Description: >- Sample template that shows you how to import an existing S3 bucket as an event source for a Lambda function Parameters: NotificationBucket: Type: String Description: S3 bucket that's used for Lambda event notification Resources: S3NotificationLambdaFunction: Type: 'AWS::Lambda::Function' Properties: Code: ZipFile: !Join - |+ - - import json - 'def lambda_handler(event,context):' - ' return ''Welcome... This is a test Lambda Function''' Handler: index.lambda_handler Role: !GetAtt LambdaIAMRole.Arn Runtime: python3.6 Timeout: 5 LambdaInvokePermission: Type: 'AWS::Lambda::Permission' Properties: FunctionName: !GetAtt S3NotificationLambdaFunction.Arn Action: 'lambda:InvokeFunction' Principal: s3.amazonaws.com SourceAccount: !Ref 'AWS::AccountId' SourceArn: !Sub 'arn:aws:s3:::${NotificationBucket}' LambdaIAMRole: Type: 'AWS::IAM::Role' Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - 'sts:AssumeRole' Path: / Policies: - PolicyName: root PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: - 's3:GetBucketNotification' - 's3:PutBucketNotification' Resource: !Sub 'arn:aws:s3:::${NotificationBucket}' - Effect: Allow Action: - 'logs:CreateLogGroup' - 'logs:CreateLogStream' - 'logs:PutLogEvents' Resource: 'arn:aws:logs:*:*:*'
Einen vorhandenen S3-Bucket in Ihren CloudFormation-Stack importieren
1.Öffnen Sie die AWS CloudFormation-Konsole.
2.Wählen Sie im Navigationsbereich Stack und dann den Stack aus, den Sie erstellt haben.
3.Wählen Sie Stack-Aktionen und dann Ressourcen in Stack importieren aus.
4.Überprüfen Sie die Import-Übersichtsseite und wählen Sie dann Weiter aus.
Wichtig: In Ihrer CloudFormation-Vorlage muss jede Ressource, die Sie importieren, über ein DeletionPolicy-Attribut verfügen und alle anderen Ressourcen müssen unverändert bleiben. Zum Beispiel:
AWSTemplateFormatVersion: 2010-09-09 Description: >- Sample template that shows you how to import an existing S3 bucket as an event source for a Lambda function Parameters: NotificationBucket: Type: String Description: S3 bucket that's used for Lambda event notification Resources: S3NotificationLambdaFunction: Type: 'AWS::Lambda::Function' Properties: . . LambdaInvokePermission: Type: 'AWS::Lambda::Permission' Properties: . . LambdaIAMRole: Type: 'AWS::IAM::Role' Properties: . . <The preceding resources were already created. Now, add the DeletionPolicy to the preceding stack to import the S3 bucket.> NotificationS3Bucket: Type: 'AWS::S3::Bucket' DeletionPolicy: Retain Properties: BucketName: myenv-bucket #Bucket name to import
5.Wählen Sie im Abschnitt Vorlage festlegen Ihren Anforderungen entsprechend Amazon S3-URL oder Vorlagendatei hochladen und anschließend Weiter aus.
6.Führen Sie die restlichen Schritte des Assistenten aus, um Ihre vorhandenen Ressourcen zu importieren. Weitere Informationen finden Sie unter Importieren einer vorhandenen Ressource in einen Stack mithilfe der AWS CloudFormation-Konsole.
7.Warten Sie, bis der Stack den Status IMPORT_COMPLETE erreicht hat.
Ihre CloudFormation-Vorlage aktualisieren
1.Aktualisieren Sie den Stack mit der CloudFormation-Vorlage, die Sie geändert haben.
2.Warten Sie, bis der Stack den Status UPDATE_COMPLETE erreicht hat, und überprüfen Sie dann die NotificationConfiguration im S3-Bucket.
3.Schalten Sie Amazon S3-Ereignisbenachrichtigungen in Ihrem S3-Bucket ein. In der folgenden Beispielvorlage lautet der Bucket-Name myenv-bucket:
AWSTemplateFormatVersion: 2010-09-09 Description: >- Sample template that shows you how to import an existing S3 bucket as an event source for a Lambda function Parameters: NotificationBucket: Type: String Description: S3 bucket that's used for Lambda event notification Resources: S3NotificationLambdaFunction: Type: 'AWS::Lambda::Function' Properties: . . LambdaInvokePermission: Type: 'AWS::Lambda::Permission' Properties: . . LambdaIAMRole: Type: 'AWS::IAM::Role' Properties: . . <The preceding resources were already created. Now, add the DeletionPolicy to the preceding stack to import the S3 bucket.> NotificationS3Bucket: Type: 'AWS::S3::Bucket' DeletionPolicy: Retain Properties: BucketName: myenv-bucket NotificationConfiguration: #Update stack with NotificationConfiguration LambdaConfigurations: - Event: 's3:ObjectCreated:Put' Function: !GetAtt S3NotificationLambdaFunction.Arn - Event: 's3:ObjectRemoved:*' Function: !GetAtt S3NotificationLambdaFunction.Arn
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor 5 Monaten