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

# AWS CloudWatch-metrics streamen met CloudFormation

Gebruik een AWS CloudFormation-template om het streamen van CloudWatch-metrics naar AppSignal in te stellen. Het template maakt alle vereiste resources aan in één deployment, in plaats van elke resource handmatig via de AWS Console te configureren.

Voor een overzicht van CloudWatch-metrics in AppSignal, inclusief magic dashboards en metric-naamgeving, zie [AWS CloudWatch-metrics](/metrics/cloudwatch-overview). Als u liever elke resource handmatig instelt, zie de [console-setup-handleiding](/metrics/cloudwatch).

## Voordat u begint

Houd de volgende informatie bij de hand:

* De App-level Push API-sleutel van uw app. Om deze te vinden, opent u de [API keys-instellingenpagina](https://appsignal.com/redirect-to/app?to=api_keys\&key_tab=app), of navigeert u naar uw organisatie-instellingen en selecteert u **Dev zone > API keys**.
* De AWS-regio waarin u de stack wilt deployen

## Wat het template aanmaakt

Het CloudFormation-template maakt de volgende resources aan:

1. Een **S3-bucket** om records die niet geleverd kunnen worden op te slaan, met een lifecycle-vervaltermijn van 30 dagen en een retain-on-delete-policy.
2. Een **IAM-rol** waarmee Amazon Data Firehose mislukte records naar de S3-bucket kan schrijven.
3. Een **Firehose delivery stream** die metrics via HTTPS naar het AppSignal-endpoint stuurt.
4. Een **IAM-rol** waarmee CloudWatch Metric Streams naar de Firehose delivery stream kan schrijven.
5. Een **CloudWatch metric stream** die metrics in OpenTelemetry 1.0-formaat exporteert.

## CloudFormation-template

Kopieer het volgende template en sla het op als `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
```

## De stack deployen

1. Open de [AWS CloudFormation-console](https://console.aws.amazon.com/cloudformation/).
2. Selecteer **Create stack** en kies **With new resources (standard)**.
3. Onder **Specify template** selecteert u **Upload a template file** en uploadt u `appsignal-cloudwatch-metrics.yaml`.
4. Selecteer **Next**.
5. Voer een stack-naam in, bijvoorbeeld `appsignal-cloudwatch-metrics`.
6. Voer voor **AppLevelPushApiKey** de App-level Push API-sleutel van uw app in.
7. Selecteer tweemaal **Next**, vink **I acknowledge that AWS CloudFormation might create IAM resources** aan en selecteer **Submit**.

Het aanmaken van de stack duurt enkele minuten. Zodra de status **CREATE\_COMPLETE** toont, begint CloudWatch met het streamen van metrics naar AppSignal.

## Specifieke AWS-diensten filteren

Standaard streamt het template metrics van alle AWS-diensten in het account. Om alleen specifieke diensten te streamen, voegt u `IncludeFilters` toe aan de `CloudWatchMetricStream`-resource:

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

Vervang de namespaces door de AWS-diensten die u wilt monitoren. Zie de [AWS-diensten die CloudWatch-metrics publiceren](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html) voor een volledige lijst met beschikbare namespaces.

## De deployment verifiëren

1. Zoek in de AWS Console naar "CloudFormation" en selecteer **Stacks**. Open uw stack en selecteer het tabblad **Resources** om te bevestigen dat alle resources **CREATE\_COMPLETE** tonen.
2. Zoek in de AWS Console naar "CloudWatch". Ga in de linker zijbalk naar **Metrics > Streams** en bevestig dat de status van de metric stream **Running** is.
3. Zoek in de AWS Console naar "Firehose". Open de delivery stream en gebruik de functie **Test with demo data** om de connectiviteit te verifiëren.
4. Open in AppSignal het [dashboard van uw app](https://appsignal.com/redirect-to/app?to=dashboard) en controleer of CloudWatch-metrics op uw [custom dashboard](/metrics/dashboards) verschijnen.

Als metrics na enkele minuten niet verschijnen, controleer dan de S3-bucket op mislukte delivery records. Als u hulp nodig heeft, [neem dan contact met ons op](mailto:support@appsignal.com).

## Multi-regio deployments

Het template deployt alle resources in één enkele AWS-regio. Als u workloads in meerdere regio's draait, deploy dan een aparte kopie van deze stack in elke regio. Dit houdt de gegevensoverdracht binnen elke regio en voorkomt cross-region transfer fees.

## Opruimen

Om alle resources die door dit template zijn aangemaakt te verwijderen, verwijdert u de stack in de CloudFormation-console. De S3-bucket voor mislukte deliveries heeft een `DeletionPolicy` van `Retain`, dus deze blijft behouden wanneer de stack wordt verwijderd om te voorkomen dat mislukte delivery records verloren gaan. Mislukte delivery records in de bucket worden na 30 dagen automatisch verwijderd door de lifecycle-regel. U kunt de bucket handmatig verwijderen zodra u deze niet meer nodig heeft.
