¿Cómo puedo utilizar una importación de recursos de CloudFormation para crear una configuración de notificaciones de Amazon S3 para Lambda en un bucket de S3 existente?

5 minutos de lectura
0

Quiero crear una configuración de notificaciones de Amazon Simple Storage Service (Amazon S3) para AWS Lambda en un bucket de S3 existente. Quiero hacerlo usando AWS CloudFormation para importar un recurso.

Descripción corta

Para configurar una notificación de Amazon S3 sin utilizar un recurso personalizado, haga lo siguiente:

  1. Cree una plantilla con la función de Lambda S3NotificationLambdaFunction. Esta función agrega la configuración de notificaciones del bucket existente NotificationS3Bucket.
  2. Utilice una importación de recursos para incorporar el bucket de S3 existente NotificationS3Bucket que se especifica en la plantilla a la administración de CloudFormation.
  3. Actualice la pila de CloudFormation para incluir las propiedades que desea activar en su bucket de S3.

Para usar un recurso personalizado, consulte ¿Cómo puedo utilizar Cloudformation para crear una configuración de notificaciones de Amazon S3 para Lambda en un bucket de S3 existente?

Resolución

**Importante:**Los siguientes pasos anulan cualquier configuración de notificaciones existente o creada manualmente en un bucket de S3. Siga estos pasos para agregar una nueva configuración de notificaciones a un bucket de S3 importado.

Cree una plantilla de CloudFormation con una función de Lambda

La siguiente plantilla de ejemplo crea una función de Lambda con un rol de ejecución y permisos para invocar la función. Para usar una función de Lambda existente, utilice el nombre de recurso de Amazon (ARN) de la función en su plantilla de CloudFormation para la propiedad LambdaConfiguration del bucket de S3.

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:*:*:*'

Importación de un bucket de S3 existente a su pila de CloudFormation

1.    Abra la consola de AWS CloudFormation.

2.    En el panel de navegación, elija Pila, y, a continuación, seleccione la pila que ha creado.

3.    Elija Acciones de pila, y, a continuación, elija Importar recursos a la pila.

4.    Revise la página de información general sobre la importación, y, a continuación, seleccione Siguiente.

Importante: En su plantilla de CloudFormation, cada recurso que importe debe tener un atributo DeletionPolicy y todos los demás recursos deben permanecer sin modificar. Por ejemplo:

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.    En la sección Especificar plantilla, elija la opción URL de Amazon S3 o Cargar un archivo de plantilla según sea necesario y, a continuación, seleccione Siguiente.

6.    Siga el resto de los pasos del asistente para importar los recursos existentes. Para obtener más información, consulte Importar un recurso existente a una pila mediante la consola de AWS CloudFormation.

7.    Espere a que la pila alcance el estado IMPORT_COMPLETE.

Actualización de su plantilla de CloudFormation

1.    Actualice la pila con la plantilla de CloudFormation que ha modificado.

2.    Espere a que la pila alcance el estado UPDATE_COMPLETE y, a continuación, verifique la propiedad NotificationConfiguration en el bucket de S3.

3.    Active las notificaciones de eventos de Amazon S3 en su bucket de S3. En la siguiente plantilla de ejemplo, el nombre del bucket es 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

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año