• JP

Configurando S3 Bucket event notification com SQS via Terraform



O S3 (Simple Storage Service) possibilita notificar através de eventos, quando alguma ação ocorre dentro de um Bucket ou em alguma pasta específica. Em outras palavras, funciona como um listener, ou seja, qualquer ação ocorrida em uma origem, ocorrerá um evento de notificação para um destino.


O que seriam estas ações?


Qualquer ação que acontece dentro de um Bucket como, a criação de um novo arquivo manual ou através de um upload, criação de uma pasta, remoção de arquivos, restauração de arquivos e etc.


Destinos


Para cada configuração de notificação de evento, deve existir um destino. Para este destino, será enviado informações sobre cada ação, por exemplo:


Um novo arquivo foi criado em uma pasta específica, assim, informações sobre o arquivo será enviada, como a data de criação, tamanho do arquivo, o tipo do evento, nome do arquivo e dentre outros. Lembrando que neste processo, não é enviado o conteúdo do arquivo, GG?


Existem 3 tipos de destinos disponíveis:

  1. Lambda

  2. SNS

  3. SQS


Entendendo o funcionamento na prática


Neste post vamos criar uma configuração de notificação de evento em um Bucket S3, simular uma ação e entender o comportamento final. Todo este conteúdo é baseado na documentação oferecida pela HashiCorp, empresa mantenedora do Terraform.


Poderíamos criar esta configuração via console mas por motivos de boas práticas, utilizaremos o Terraform como ferramenta IAC. Para quem não conhece muito sobre Terraform, segue este tutorial sobre Primeiros passos utilizando Terraform na AWS.


No próximo passo, criaremos um fluxo simulando a imagem abaixo. Criaremos uma configuração no Bucket S3, que para cada arquivo criado na pasta files/, um evento de notificação será enviado para um fila SQS.



Criando os arquivos Terraform


Crie no seu projeto, uma pasta chamada terraform/ e a partir de agora, todos os arquivos .tf serão criados dentro dela.


Agora, crie um arquivo chamado vars.tf onde armazenaremos as variáveis que serão utilizadas.

variable "region" {
  default = "us-east-1"
  type = string
}

variable "bucket" {
  type = string
}

Crie um arquivo chamado provider.tf , onde adicionaremos a configuração do provider, no qual será a AWS. Isso significa que, o Terraform utilizará a AWS como nuvem para criar os recursos e fará o download dos plugins necessários na inicialização. Copie o código abaixo para o arquivo.

provider "aws" {
  region  = "${var.region}"
}

Crie um arquivo chamado s3.tf , onde adicionaremos as configurações para a criação de um novo Bucket S3 que será usado para a prática

resource "aws_s3_bucket" "s3_bucket_notification" {
  bucket = "${var.bucket}"
}

Agora, crie um arquivo chamado sqs.tf , onde adicionaremos as configurações para a criação de uma fila SQS e algumas permissões conforme código abaixo:

resource "aws_sqs_queue" "s3-notifications-sqs" {

  name = "s3-notifications-sqs"
  policy = <<POLICY
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "sqs:SendMessage",
        "Resource": "arn:aws:sqs:*:*:s3-notifications-sqs",
        "Condition": {
          "ArnEquals": {
           "aws:SourceArn":     
              "${aws_s3_bucket.s3_bucket_notification.arn}" 
           }
        }
      }
    ]
  }
  POLICY
}

Entendendo o código acima


No código acima, estamos criando uma SQS e adicionando algumas configurações de policy, segue mais detalhes:


  1. O nome da SQS será s3-notifications-sqs, valor detalhado no campo name

  2. No campo policy, definimos uma política para que o S3 possa enviar mensagens de notificações para a SQS. Veja que estamos referenciando o Bucket S3 através de ARN no trecho ${aws_s3_bucket.s3_bucket_notification.arn}


Para o último arquivo, vamos criar a configuração que permitirá o envio de notificações de eventos do Bucket S3 para uma SQS. Crie o arquivo s3_notification.tf e adicione o código abaixo:

resource "aws_s3_bucket_notification" "s3_notification" {
  bucket = aws_s3_bucket.s3_bucket_notification.id

  queue {
    events    = ["s3:ObjectCreated:*"]
    queue_arn = aws_sqs_queue.s3-notifications-sqs.arn
    filter_prefix = "files/"
  }
}

Entendendo o código acima


  1. No código acima, estamos criando um recurso chamado aws_s3_bucket_notification no qual será responsável por habilitar as notificações de um Bucket S3.

  2. No campo bucket, estamos referenciando através do ID, o bucket que será criado. Neste caso, estamos utilizando aws_s3_bucket + alias + id para a referência, no qual, o alias é o s3_bucket_notification, definido no arquivo s3.tf e por último, o id que será o identificador do Bucket que será criado.

  3. O campo queue é um bloco contendo algumas configurações como:

  • events: É o tipo do evento da notificação. Neste caso, para eventos do tipo ObjectCreated, as notificações serão feitas apenas por objetos criados, ou seja, para objetos deletados, não haverá notificação. Isso ajuda para restringir alguns tipos de eventos.

  • queue_arn: Referência para a SQS definida no arquivo sqs.tf

  • filter_prefix: Este campo define a pasta em que desejamos que as notificações sejam disparadas. No código, definimos que a pasta files/ seja o gatilho. Resumindo, para todos arquivos criados dentro desta pasta, um notificação será enviada para a SQS definida no campo queue_arn.


Executando o Terraform


Inicie o Terraform

terraform init

Executando o Plan


O plan possibilita verificar quais recursos serão criados, neste caso é necessário passar o valor da variável bucket para a criação do mesmo no S3.

terraform plan -var bucket = 'digite o nome do bucket'

Executando o Apply


Neste passo, a criação dos recursos serão aplicados. Lembre-se de passar o nome do bucket em que deseja criar para a variável bucket e o nome bucket deve ser único.

terraform apply -var bucket = 'digite o nome do bucket'

Simulando um evento de notificação


Após a execução dos passos anteriores e criado os recursos, vamos fazer um upload manual de um arquivo na pasta files/ do bucket que foi criado.


Via console, acesse o Bucket criado no S3 e crie uma pasta chamada files. Dentro dela, carregue qualquer arquivo.



Carregando um arquivo


Após carregar o arquivo na pasta files, acesse o SQS criado. Você verá que existe mensagens disponíveis na SQS que foi criada nos passos anteriores. Acesse as mensagens e navegue pelas informações.




Pronto, temos uma notificação de evento criada. Para mais informações, acesse os links:


https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_notification

https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-event-notifications.html


Repositório do Github com o código: https://github.com/coffeeandtips/s3-bucket-notification-with-sqs-and-terraform


É isso, curtiu? Até mais!


Posts recentes

Ver tudo