Como posso usar uma importação de recursos do CloudFormation para criar uma configuração de notificação do Amazon S3 para o Lambda em um bucket do S3 existente?

5 minuto de leitura
0

Quero criar uma configuração de notificação do Amazon Simple Storage Service (Amazon S3) para o AWS Lambda em um bucket do S3 existente. Quero fazer isso usando o AWS CloudFormation para importar um recurso.

Breve descrição

Para configurar uma notificação do Amazon S3 sem usar um recurso personalizado, faça o seguinte:

  1. Crie um modelo com a função do Lambda S3NotificationLambdaFunction. Essa função adiciona a configuração de notificação existente do bucket NotificationS3Bucket.
  2. Use uma importação de recursos para colocar o bucket do S3 NotificationS3Bucket existente, especificado no modelo, para o gerenciamento do CloudFormation.
  3. Atualize a pilha do CloudFormation para incluir as propriedades que você deseja ativar em seu bucket do S3.

Para usar um recurso personalizado, consulte Como posso usar o CloudFormation para criar uma configuração de notificação do Amazon S3 para o Lambda em um bucket S3 existente?

Resolução

**Importante:**as etapas a seguir substituem todas as configurações de notificação existentes ou criadas manualmente em um bucket do S3. Siga estas etapas para adicionar uma nova configuração de notificação a um bucket importado do S3.

Crie um modelo do CloudFormation com uma função Lambda

O modelo de exemplo a seguir cria uma função Lambda com uma função em execução e permissões para invocar a função. Para usar uma função Lambda existente, use o Amazon Resource Name (ARN) da função em seu modelo do CloudFormation para a propriedade LambdaConfiguration no bucket do 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:*:*:*'

Importe um bucket do S3 existente para sua pilha do CloudFormation

1.Abra o console do AWS CloudFormation.

2.No painel de navegação, escolha Pilha e selecione a pilha que você criou.

3.Escolha Ações de pilha e, em seguida, escolha Importar recursos para a pilha.

4.Examine a página Visão geral da importação e escolha Avançar.

**Importante:**No seu modelo do CloudFormation, cada recurso que você importa deve ter um atributo DeletionPolicy, e todos os outros recursos devem permanecer os mesmos. Por exemplo:

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.Na seção Especificar modelo, escolha o URL do Amazon S3 ou Carregar um arquivo de modelo com base em seus requisitos e, em seguida, escolha ** Avançar**.

6.Conclua o restante das etapas do assistente para importar seus recursos existentes. Para obter mais informações, consulte Importar um recurso existente em uma pilha usando o console do AWS CloudFormation.

7.Aguarde até que a pilha atinja o estado IMPORT_COMPLETE.

Atualize seu modelo do CloudFormation

1.Atualize a pilha com o modelo do CloudFormation que você modificou.

2.Aguarde até que a pilha atinja o estado UPDATE_COMPLETE e, em seguida, verifique a NotificationConfiguration no bucket do S3.

3.Ative as notificações de eventos do Amazon S3 em seu bucket do S3. No modelo de exemplo a seguir, o nome do bucket é 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 OFICIAL
AWS OFICIALAtualizada há um ano