Skip to main content
🔐 Não envie Informações Pessoais Identificáveis (PII) para a AppSignal. Filtre PII (por exemplo, nomes, e-mails) dos logs e use um ID, hash ou identificador pseudonimizado no lugar.

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.
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.

Antes de começar

Tenha as seguintes informações em mãos:
  • A chave de API da sua fonte de log. Se você ainda não tem uma fonte de log, crie uma nova fonte de log 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:
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
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 para mais detalhes.

Implante a stack

  1. Abra o console do AWS 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 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.

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.