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

# Transmitir métricas do AWS CloudWatch com CloudFormation

Use um template do AWS CloudFormation para configurar o streaming de métricas do CloudWatch para o AppSignal. O template cria todos os recursos necessários em uma única implantação, em vez de configurar cada um manualmente através do Console AWS.

Para uma visão geral das métricas do CloudWatch no AppSignal, incluindo magic dashboards e nomenclatura de métricas, veja [Métricas do AWS CloudWatch](/metrics/cloudwatch-overview). Se você preferir configurar cada recurso manualmente, veja o [guia de configuração via console](/metrics/cloudwatch).

## Antes de começar

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

* A chave Push API de nível de App da sua aplicação. Para encontrá-la, abra a [página de configurações de chaves de API](https://appsignal.com/redirect-to/app?to=api_keys\&key_tab=app), ou navegue até as configurações da sua organização e selecione **Dev zone > API keys**.
* A região AWS onde você quer implantar a stack

## O que o template cria

O template do CloudFormation cria os seguintes recursos:

1. Um **bucket S3** para armazenar registros que falharem na entrega, com uma expiração de ciclo de vida de 30 dias e uma política de retenção em exclusão.
2. Um **papel IAM** que permite que o Amazon Data Firehose escreva registros falhos no bucket S3.
3. Um **stream de entrega Firehose** que envia métricas para o endpoint do AppSignal via HTTPS.
4. Um **papel IAM** que permite que o CloudWatch Metric Streams escreva no stream de entrega Firehose.
5. Um **CloudWatch metric stream** que exporta métricas no formato OpenTelemetry 1.0.

## Template CloudFormation

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

```yaml YAML theme={null}
AWSTemplateFormatVersion: "2010-09-09"
Description: >
  Stream CloudWatch metrics to AppSignal using Amazon Data Firehose.

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: AppSignal Configuration
        Parameters:
          - AppLevelPushApiKey
    ParameterLabels:
      AppLevelPushApiKey:
        default: "App-level Push API Key (find at https://appsignal.com/redirect-to/app?to=api_keys&key_tab=app)"

Parameters:
  AppLevelPushApiKey:
    Type: String
    NoEcho: true
    Description: >
      Your App-level Push API key from AppSignal.

Resources:
  # 1. S3 bucket for failed deliveries
  FailedDeliveryBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    Properties:
      BucketName: !Sub "appsignal-firehose-${AWS::StackName}-${AWS::AccountId}-${AWS::Region}"
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      LifecycleConfiguration:
        Rules:
          - Id: ExpireFailedDeliveries
            Status: Enabled
            ExpirationInDays: 30

  # 2. IAM role for Firehose to write to S3
  FirehoseS3Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: firehose.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        - PolicyName: FirehoseS3Access
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "s3:AbortMultipartUpload"
                  - "s3:GetBucketLocation"
                  - "s3:GetObject"
                  - "s3:ListBucket"
                  - "s3:ListBucketMultipartUploads"
                  - "s3:PutObject"
                Resource:
                  - !GetAtt FailedDeliveryBucket.Arn
                  - !Sub "${FailedDeliveryBucket.Arn}/*"

  # 3. Firehose delivery stream
  MetricsDeliveryStream:
    Type: AWS::KinesisFirehose::DeliveryStream
    Properties:
      DeliveryStreamType: DirectPut
      HttpEndpointDestinationConfiguration:
        EndpointConfiguration:
          Url: "https://appsignal-endpoint.net/metrics/aws-cloudwatch"
          AccessKey: !Ref AppLevelPushApiKey
          Name: AppSignal
        RequestConfiguration:
          ContentEncoding: GZIP
        BufferingHints:
          IntervalInSeconds: 60
          SizeInMBs: 1
        S3BackupMode: FailedDataOnly
        S3Configuration:
          BucketARN: !GetAtt FailedDeliveryBucket.Arn
          RoleARN: !GetAtt FirehoseS3Role.Arn
        RoleARN: !GetAtt FirehoseS3Role.Arn

  # 4. IAM role for CloudWatch Metric Streams to write to Firehose
  MetricStreamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: streams.metrics.cloudwatch.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        - PolicyName: MetricStreamFirehoseAccess
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "firehose:PutRecord"
                  - "firehose:PutRecordBatch"
                Resource: !GetAtt MetricsDeliveryStream.Arn

  # 5. CloudWatch metric stream
  CloudWatchMetricStream:
    Type: AWS::CloudWatch::MetricStream
    Properties:
      FirehoseArn: !GetAtt MetricsDeliveryStream.Arn
      RoleArn: !GetAtt MetricStreamRole.Arn
      OutputFormat: "opentelemetry1.0"

Outputs:
  DeliveryStreamName:
    Description: Name of the Firehose delivery stream.
    Value: !Ref MetricsDeliveryStream

  MetricStreamName:
    Description: Name of the CloudWatch metric stream.
    Value: !Ref CloudWatchMetricStream

  FailedDeliveryBucketName:
    Description: S3 bucket for failed delivery records.
    Value: !Ref FailedDeliveryBucket
```

## Implantar 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 upload de `appsignal-cloudwatch-metrics.yaml`.
4. Selecione **Next**.
5. Insira um nome para a stack, por exemplo `appsignal-cloudwatch-metrics`.
6. Para **AppLevelPushApiKey**, insira a chave Push API de nível de App da sua aplicação.
7. 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. Uma vez que o status mostre **CREATE\_COMPLETE**, o CloudWatch começa a transmitir métricas para o AppSignal.

## Filtrar serviços AWS específicos

Por padrão, o template transmite métricas de todos os serviços AWS na conta. Para transmitir apenas serviços específicos, adicione `IncludeFilters` ao recurso `CloudWatchMetricStream`:

```yaml YAML theme={null}
CloudWatchMetricStream:
  Type: AWS::CloudWatch::MetricStream
  Properties:
    FirehoseArn: !GetAtt MetricsDeliveryStream.Arn
    RoleArn: !GetAtt MetricStreamRole.Arn
    OutputFormat: "opentelemetry1.0"
    IncludeFilters:
      - Namespace: AWS/EC2
      - Namespace: AWS/RDS
      - Namespace: AWS/ELB
```

Substitua os namespaces pelos serviços AWS que você quer monitorar. Veja [serviços AWS que publicam métricas do CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html) para uma lista completa de namespaces disponíveis.

## Verificar a implantação

1. No Console AWS, pesquise "CloudFormation" e selecione **Stacks**. Abra sua stack e selecione a aba **Resources** para confirmar que todos os recursos mostram **CREATE\_COMPLETE**.
2. No Console AWS, pesquise "CloudWatch". Na barra lateral esquerda, vá para **Metrics > Streams** e confirme que o status do metric stream é **Running**.
3. No Console AWS, pesquise "Firehose". Abra o stream de entrega e use a função **Test with demo data** para verificar a conectividade.
4. No AppSignal, abra o [dashboard da sua aplicação](https://appsignal.com/redirect-to/app?to=dashboard) e verifique se as métricas do CloudWatch aparecem em seu [dashboard personalizado](/metrics/dashboards).

Se as métricas não aparecerem após alguns minutos, verifique o bucket S3 para registros de entrega falha. Se precisar de ajuda, [entre em contato](mailto:support@appsignal.com).

## Implantações multi-região

O template implanta todos os recursos em uma única região AWS. Se você executa workloads em várias regiões, implante uma cópia separada desta stack em cada região. Isso mantém a transferência de dados dentro de cada região e evita taxas de transferência entre regiões.

## Limpeza

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