

# Enviar logs de função do Lambda para o Amazon S3
<a name="logging-with-s3"></a>

Você pode configurar a função do Lambda para enviar logs diretamente para o Amazon S3 usando o console do Lambda. Esse atributo fornece uma solução econômica para armazenamento de logs de longo prazo e habilita opções de análise avançadas usando serviços como o Athena.

**nota**  
Você pode configurar os logs de função do Lambda para serem enviados ao Amazon S3 usando o console do Lambda, a AWS CLI, o AWS CloudFormation e todos os SDKs da AWS.

## Preços
<a name="logging-s3-pricing"></a>

Para obter detalhes sobre os preços, consulte [Definição de preço do Amazon CloudWatch](https://aws.amazon.com/cloudwatch/pricing/#Vended_Logs).

## Permissões exigidas para o destino de log do Amazon S3
<a name="logging-s3-permissions"></a>

Ao usar o console do Lambda para configurar o Amazon S3 como o destino de log da função, você precisa:

1. Das [permissões do IAM exigidas](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-prereqs) para usar o CloudWatch Logs com o Lambda.

1. Para [Configurar um filtro de assinaturas do CloudWatch Logs para enviar os logs de função do Lambda para o Amazon S3](#using-cwl-subscription-filter-lambda-s3). Esse filtro define quais eventos de log são entregues ao bucket to Amazon S3.

## Configurar um filtro de assinaturas do CloudWatch Logs para enviar os logs de função do Lambda para o Amazon S3
<a name="using-cwl-subscription-filter-lambda-s3"></a>

Para enviar logs do CloudWatch Logs para o Amazon S3, você precisa criar um filtro de assinatura. Esse filtro define quais eventos de log são entregues ao bucket to Amazon S3. O bucket to Amazon S3 deve ser usado na mesma região do grupo de logs.

### Para criar um filtro de assinatura para o Amazon S3
<a name="create-subscription-filter-s3"></a>

1. Crie um bucket do Amazon Simple Storage Service (Amazon S3). Recomendamos utilizar um bucket criado especificamente para o CloudWatch Logs. No entanto, se você desejar usar um bucket existente, vá para a etapa 2.

   Execute o comando a seguir, substituindo o espaço reservado Region (Região) pela região que você deseja usar:

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket2 --create-bucket-configuration LocationConstraint=region
   ```
**nota**  
`amzn-s3-demo-bucket2` é um exemplo de nome de bucket do Amazon S3. Ele é *reservado*. Para esse procedimento funcionar, é necessário substituí-lo pelo nome exclusivo do bucket do Amazon S3.

   A seguir está um exemplo de saída:

   ```
   {
       "Location": "/amzn-s3-demo-bucket2"
   }
   ```

1. Crie o perfil do IAM que concede ao CloudWatch Logs permissão para colocar dados no bucket do Amazon S3. Essa política inclui uma chave de contexto de condição global aws:SourceArn para ajudar a evitar o problema de segurança "confused deputy". Para obter mais informações sobre a [prevenção de confused-deputy](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions-confused-deputy.html).

   1. Use um editor de texto para criar uma política de confiança em um arquivo `~/TrustPolicyForCWL.json`, da seguinte maneira:

      ```
      {
          "Statement": {
              "Effect": "Allow",
              "Principal": { "Service": "logs.amazonaws.com" },
              "Condition": { 
                  "StringLike": {
                      "aws:SourceArn": "arn:aws:logs:region:123456789012:*"
                  } 
               },
              "Action": "sts:AssumeRole"
          } 
      }
      ```

   1. Use o comando create-role para criar a função do IAM especificando o arquivo de política de confiança. Observe o valor de Role.Arn retornado, pois você precisará dele em uma etapa posterior:

      ```
      aws iam create-role \
       --role-name CWLtoS3Role \
       --assume-role-policy-document file://~/TrustPolicyForCWL.json
      {
          "Role": {
              "AssumeRolePolicyDocument": {
                  "Statement": {
                      "Action": "sts:AssumeRole",
                      "Effect": "Allow",
                      "Principal": {
                          "Service": "logs.amazonaws.com"
                      },
                      "Condition": { 
                          "StringLike": {
                              "aws:SourceArn": "arn:aws:logs:region:123456789012:*"
                          } 
                      }
                  }
              },
              "RoleId": "AAOIIAH450GAB4HC5F431",
              "CreateDate": "2015-05-29T13:46:29.431Z",
              "RoleName": "CWLtoS3Role",
              "Path": "/",
              "Arn": "arn:aws:iam::123456789012:role/CWLtoS3Role"
          }
      }
      ```

1. Crie uma política de permissões para definir quais ações o CloudWatch Logs poderá executar em sua conta. Primeiro, use um editor de texto para criar uma política de permissões em um arquivo `~/PermissionsForCWL.json`:

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Action": ["s3:PutObject"],
         "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket2/*"]
       }
     ]
   }
   ```

   Associe a política de permissões ao perfil usando o comando `put-role-policy`:

   ```
   aws iam put-role-policy --role-name CWLtoS3Role --policy-name Permissions-Policy-For-S3 --policy-document file://~/PermissionsForCWL.json
   ```

1. Crie um novo grupo de logs `Delivery` ou use um grupo de logs `Delivery` existente.

   ```
   aws logs create-log-group --log-group-name my-logs --log-group-class DELIVERY --region REGION_NAME
   ```

1. `PutSubscriptionFilter` para configurar destino

   ```
   aws logs put-subscription-filter
   --log-group-name my-logs
   --filter-name my-lambda-delivery
   --filter-pattern ""
   --destination-arn arn:aws:s3:::amzn-s3-demo-bucket2
   --role-arn arn:aws:iam::123456789012:role/CWLtoS3Role
   --region REGION_NAME
   ```

## Enviar logs de função do Lambda para o Amazon S3
<a name="logging-s3-setup"></a>

No console do Lambda, você pode enviar os logs de função diretamente para o Amazon S3 após criar uma nova função. Para fazer isso, conclua estas etapas:

1. Faça login no AWS Management Console e abra o console do Lambda.

1. Escolha o nome da função.

1. Escolha a guia **Configuração**.

1. Escolha a guia **Ferramentas de monitoramento e operações**.

1. Na seção "Configuração de registro em log", escolha **Editar**.

1. Na seção "Conteúdo de logs", selecione um formato de log.

1. Na seção "Destino de logs", conclua as seguintes etapas:

   1. Selecione um serviço de destino.

   1. Escolha **Criar um novo grupo de logs** ou use um **Grupo de logs existente**.
**nota**  
Se for escolher um grupo de logs existente para um destino do Amazon S3, confirme se o grupo de logs escolhido é do tipo `Delivery`.

   1. Escolha um bucket do Amazon S3 para ser o destino dos logs de função.

   1. O grupo de logs `Delivery` do CloudWatch será exibido.

1. Escolha **Salvar**.

**nota**  
Se o perfil do IAM fornecido no console não tiver as permissões exigidas, a configuração de destino falhará. Para corrigir isso, consulte [Permissões exigidas para o destino de log do Amazon S3](#logging-s3-permissions).

## Registro em log entre contas
<a name="cross-account-logging-s3"></a>

Você pode configurar o Lambda para enviar logs para um bucket do Amazon S3 em outra conta da AWS. Isso requer a configuração de um destino e de permissões apropriadas em ambas as contas.

Para obter instruções detalhadas sobre a configuração do registro em log entre contas, incluindo os perfis do IAM e as políticas necessárias, consulte [Setting up a new cross-account subscription](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CrossAccountSubscriptions.html) na documentação do CloudWatch Logs.