> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Stream de logs do CloudWatch com CloudFormation

<Warning>
  🔐 Não envie <strong>Informações Pessoais Identificáveis (PII)</strong> para a AppSignal. Filtre PII (por exemplo, nomes, e-mails) dos logs e use um ID, hash ou identificador pseudonimizado no lugar. <br /> <br /> Para **entidades cobertas pela HIPAA**, mais informações sobre como assinar um Business Associate Agreement (BAA) podem ser encontradas em nossa [documentação de Business Add-Ons](/support/business-add-ons).
</Warning>

Você pode automatizar a configuração do streaming de logs do CloudWatch para o AppSignal usando um template AWS CloudFormation. Isso cria todos os recursos necessários em uma única implantação, em vez de configurar cada um manualmente pelo AWS Console.

Se preferir configurar cada recurso manualmente, consulte o [guia de configuração de logs do CloudWatch](/logging/platforms/cloudwatch).

## Antes de começar

Tenha as seguintes informações em mãos:

* A [chave de API](https://appsignal.com/redirect-to/app?to=logs/sources) da sua fonte de log. Se você ainda não tem uma fonte de log, [crie uma nova fonte de log](/logging/configuration#creating-a-log-source) primeiro.
* O nome do log group existente do CloudWatch que você quer transmitir para o AppSignal.
* A região AWS onde o log group está. Implante a stack na mesma região e conta do log group.

## O que o template cria

O template do CloudFormation cria os seguintes recursos:

1. Um **bucket S3** para armazenar registros que falharem ao serem entregues, com criptografia do lado do servidor, acesso público bloqueado, expiração de ciclo de vida de 30 dias e política de retenção ao deletar.
2. Uma **função IAM** que permite ao Amazon Data Firehose gravar registros que falharam no bucket S3 e gravar seus próprios logs de erro de entrega no CloudWatch.
3. Um **delivery stream do Firehose** que envia logs para o endpoint do AppSignal via HTTPS.
4. Uma **função IAM** que permite ao CloudWatch Logs gravar no delivery stream do Firehose.
5. Um **filtro de assinatura de log do CloudWatch** no seu log group existente que encaminha os eventos de log para o delivery stream do Firehose.

## Template do CloudFormation

Copie o seguinte template e salve-o como `appsignal-cloudwatch-logs.yaml`:

<CodeGroup>
  ```yaml YAML theme={null}
  AWSTemplateFormatVersion: 2010-09-09
  Description: >-
    Configures a CloudWatch log subscription and Amazon Data Firehose
    delivery stream to send logs to AppSignal from an existing CloudWatch log group.

    It must be deployed in the same region and same account as the CloudWatch log group.

    Implements all the steps from AppSignal documentation all at once:
    https://docs.appsignal.com/logging/platforms/cloudwatch.html

  Metadata:
    AWS::CloudFormation::Interface:
      ParameterGroups:
        - Label:
            default: AppSignal Configuration
          Parameters:
            - LogSourceApiKey
        - Label:
            default: CloudWatch Configuration
          Parameters:
            - CloudWatchLogGroupName
      ParameterLabels:
        LogSourceApiKey:
          default: "Log Source API Key (find at https://appsignal.com/redirect-to/app?to=logs/sources)"
        CloudWatchLogGroupName:
          default: "CloudWatch Log Group Name"

  Parameters:
    LogSourceApiKey:
      Type: String
      Description: Your AppSignal log source API key (39-character hexadecimal string).
      NoEcho: true
      MinLength: 39
      MaxLength: 39
    CloudWatchLogGroupName:
      Type: String
      Description: >-
        Name (not the ARN) of the CloudWatch log group to send to AppSignal.
        Group logs list: https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups
      MinLength: 1

  Resources:
    S3FirehoseEventsBucket:
      Type: AWS::S3::Bucket
      DeletionPolicy: Retain
      Properties:
        BucketName: !Join
          - "-"
          - - "appsignal-firehose"
            - !Ref AWS::StackName
            - !Ref AWS::AccountId
            - !Ref AWS::Region
        PublicAccessBlockConfiguration:
          BlockPublicAcls: true
          BlockPublicPolicy: true
          IgnorePublicAcls: true
          RestrictPublicBuckets: true
        BucketEncryption:
          ServerSideEncryptionConfiguration:
            - ServerSideEncryptionByDefault:
                SSEAlgorithm: AES256
        LifecycleConfiguration:
          Rules:
            - Id: ExpireFailedDeliveries
              Status: Enabled
              ExpirationInDays: 30

    FirehoseRole:
      Type: AWS::IAM::Role
      Properties:
        Description: >-
          Role to allow firehose stream to put events into S3 backup bucket
        RoleName: !Join
          - "-"
          - - "appsignal-firehose"
            - !Ref AWS::StackName
        AssumeRolePolicyDocument:
          Version: 2012-10-17
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - firehose.amazonaws.com
              Action:
                - "sts:AssumeRole"
        Policies:
          - PolicyName: !Join
              - "-"
              - - "appsignal-firehose"
                - !Ref AWS::StackName
            PolicyDocument:
              Version: 2012-10-17
              Statement:
                - Effect: Allow
                  Action:
                    - "s3:AbortMultipartUpload"
                    - "s3:GetBucketLocation"
                    - "s3:GetObject"
                    - "s3:ListBucket"
                    - "s3:ListBucketMultipartUploads"
                    - "s3:PutObject"
                  Resource:
                    - !GetAtt S3FirehoseEventsBucket.Arn
                    - !Join ["", [!GetAtt S3FirehoseEventsBucket.Arn, "/*"]]
                - Effect: Allow
                  Action:
                    - "logs:PutLogEvents"
                  Resource:
                    - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/kinesisfirehose/appsignal-firehose-${AWS::StackName}:*"
    FirehoseDeliveryStream:
      Type: AWS::KinesisFirehose::DeliveryStream
      Properties:
        DeliveryStreamName: !Join
          - "-"
          - - "appsignal-firehose"
            - !Ref AWS::StackName
        DeliveryStreamType: DirectPut
        HttpEndpointDestinationConfiguration:
          RequestConfiguration:
            ContentEncoding: GZIP
          EndpointConfiguration:
            Name: AppSignal
            Url: "https://appsignal-endpoint.net/logs/aws-kinesis"
            AccessKey: !Ref LogSourceApiKey
          BufferingHints:
            IntervalInSeconds: 60
            SizeInMBs: 1
          RetryOptions:
            DurationInSeconds: 60
          S3Configuration:
            CompressionFormat: GZIP
            BucketARN: !GetAtt S3FirehoseEventsBucket.Arn
            RoleARN: !GetAtt FirehoseRole.Arn
          RoleARN: !GetAtt FirehoseRole.Arn

    LogsStreamRole:
      Type: AWS::IAM::Role
      Properties:
        Description: Role to allow stream put into a firehose
        RoleName: !Join
          - "-"
          - - "appsignal-cloudwatch"
            - !Ref AWS::StackName
        AssumeRolePolicyDocument:
          Version: 2012-10-17
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - !Sub "logs.${AWS::Region}.amazonaws.com"
              Action:
                - "sts:AssumeRole"
        Policies:
          - PolicyName: !Join
              - "-"
              - - "appsignal-firehose"
                - !Ref AWS::StackName
            PolicyDocument:
              Version: 2012-10-17
              Statement:
                - Effect: Allow
                  Action:
                    - "firehose:*"
                  Resource:
                    - !GetAtt FirehoseDeliveryStream.Arn

    SubscriptionFilter:
      Type: AWS::Logs::SubscriptionFilter
      Properties:
        LogGroupName: !Ref CloudWatchLogGroupName
        FilterName: "AppSignal"
        FilterPattern: ""
        DestinationArn: !GetAtt FirehoseDeliveryStream.Arn
        RoleArn: !GetAtt LogsStreamRole.Arn
  ```
</CodeGroup>

<Note>
  A declaração `logs:PutLogEvents` permite que o Firehose grave seus próprios logs de erro de entrega no CloudWatch. Ela tem como alvo o log group de erros do Firehose (`/aws/kinesisfirehose/<STREAM_NAME>`), que é separado do log group que você quer transmitir para o AppSignal. Consulte [Controlling access with Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html) para mais detalhes.
</Note>

## Implante a stack

1. Abra o [console do AWS CloudFormation](https://console.aws.amazon.com/cloudformation/).
2. Selecione **Create stack** e escolha **With new resources (standard)**.
3. Em **Specify template**, selecione **Upload a template file** e faça o upload de `appsignal-cloudwatch-logs.yaml`.
4. Selecione **Next**.
5. Digite um nome para a stack, por exemplo `appsignal-cloudwatch-logs`.
6. Em **LogSourceApiKey**, insira a chave de API da sua fonte de log.
7. Em **CloudWatchLogGroupName**, insira o nome exato do log group que você quer transmitir.
8. Selecione **Next** duas vezes, depois marque **I acknowledge that AWS CloudFormation might create IAM resources** e selecione **Submit**.

A stack leva alguns minutos para ser criada. Quando o status mostrar **CREATE\_COMPLETE**, o CloudWatch começa a transmitir logs para o AppSignal.

## Verifique a implantação

1. No AWS Console, pesquise por "CloudFormation" e selecione **Stacks**. Abra sua stack e selecione a aba **Resources** para confirmar que todos os recursos mostram **CREATE\_COMPLETE**.
2. No AWS Console, pesquise por "CloudWatch". Na barra lateral esquerda, abra seu log group e selecione a aba **Subscription filters** para confirmar que o filtro `AppSignal` está listado.
3. No AWS Console, pesquise por "Firehose". Abra o delivery stream e use a função **Test with demo data** para verificar a conectividade.
4. No AppSignal, abra a [tela de gerenciamento de logs](/logging/log-management) e confirme que as entradas de log do seu log group aparecem lá.

Se os logs não aparecerem após alguns minutos, verifique o bucket S3 em busca de registros de entrega falhados. Se precisar de ajuda, [entre em contato conosco](mailto:support@appsignal.com).

## Implantações multi-região

O template deve ser implantado na mesma região e conta do log group do CloudWatch. Se você tiver log groups em várias regiões, implante uma cópia separada desta stack em cada região.

## Limpeza

Para remover todos os recursos criados por este template, exclua a stack no console do CloudFormation. O bucket S3 para entregas falhadas tem uma `DeletionPolicy` de `Retain`, então ele é mantido quando a stack é excluída para evitar a perda de registros de entrega falhados. Os registros de entrega falhados no bucket são automaticamente excluídos após 30 dias pela regra de ciclo de vida. Você pode excluir o bucket manualmente quando não precisar mais dele.
