Wie kann ich einen CloudFormation-Ressourcenimport verwenden, um eine Amazon S3-Benachrichtigungskonfiguration für Lambda auf einem vorhandenen S3-Bucket zu erstellen?

Lesedauer: 4 Minute
0

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:

  1. Erstellen Sie eine Vorlage mit der Lambda-Funktion S3NotificationLambdaFunction. Diese Funktion fügt die vorhandene Bucket-NotificationS3Bucket-Benachrichtigungskonfiguration hinzu.
  2. Verwenden Sie einen Ressourcenimport, um den vorhandenen NotificationS3Bucket-S3-Bucket, der in der Vorlage festgelegt ist, in die CloudFormation-Verwaltung zu übernehmen.
  3. 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

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr