Naar hoofdinhoud gaan
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. Als u liever elke resource handmatig instelt, zie de console-setup-handleiding.

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, 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
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.
  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
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 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 en controleer of CloudWatch-metrics op uw custom dashboard 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.

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.