¿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?
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:
- Cree una plantilla con la función de Lambda S3NotificationLambdaFunction. Esta función agrega la configuración de notificaciones del bucket existente NotificationS3Bucket.
- 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.
- 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
Contenido relevante
- OFICIAL DE AWSActualizada hace un año
- OFICIAL DE AWSActualizada hace 10 meses
- OFICIAL DE AWSActualizada hace un año