Skip to main content
🔐 Senden Sie keine personenbezogenen Daten (Personal Identifiable Information, PII) an AppSignal. Filtern Sie PII (z. B. Namen, E-Mail-Adressen) aus Logs und verwenden Sie stattdessen eine ID, einen Hash oder einen pseudonymisierten Bezeichner.

Für HIPAA-pflichtige Stellen finden Sie weitere Informationen zum Abschluss eines Business Associate Agreement (BAA) in unserer Business Add-Ons-Dokumentation.
Sie können die Einrichtung des Streamings von CloudWatch-Logs an AppSignal mit einer AWS-CloudFormation-Vorlage automatisieren. Dabei werden alle erforderlichen Ressourcen in einem einzigen Deployment erstellt, statt jede einzelne manuell über die AWS-Konsole zu konfigurieren. Wenn Sie es vorziehen, jede Ressource manuell einzurichten, lesen Sie die Anleitung zur CloudWatch-Logs-Einrichtung.

Bevor Sie beginnen

Halten Sie die folgenden Informationen bereit:
  • Den API-Schlüssel Ihrer Log-Quelle. Wenn Sie noch keine Log-Quelle haben, erstellen Sie zuerst eine neue Log-Quelle.
  • Den Namen der bestehenden CloudWatch-Log-Gruppe, die Sie an AppSignal streamen möchten.
  • Die AWS-Region, in der die Log-Gruppe liegt. Deployen Sie den Stack in derselben Region und demselben Konto wie die Log-Gruppe.

Was die Vorlage erstellt

Die CloudFormation-Vorlage erstellt die folgenden Ressourcen:
  1. Einen S3-Bucket zur Speicherung von Datensätzen, deren Zustellung fehlschlägt, mit serverseitiger Verschlüsselung, blockiertem öffentlichem Zugriff, einer Lebenszyklus-Verfallsfrist von 30 Tagen und einer Retain-on-Delete-Richtlinie.
  2. Eine IAM-Rolle, die es Amazon Data Firehose erlaubt, fehlgeschlagene Datensätze in den S3-Bucket zu schreiben und eigene Zustellfehler-Logs in CloudWatch zu schreiben.
  3. Einen Firehose-Delivery-Stream, der Logs über HTTPS an den AppSignal-Endpunkt sendet.
  4. Eine IAM-Rolle, die es CloudWatch Logs erlaubt, in den Firehose-Delivery-Stream zu schreiben.
  5. Einen CloudWatch-Log-Abonnementfilter für Ihre bestehende Log-Gruppe, der Log-Ereignisse an den Firehose-Delivery-Stream weiterleitet.

CloudFormation-Vorlage

Kopieren Sie die folgende Vorlage und speichern Sie sie als 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
Die Anweisung logs:PutLogEvents erlaubt es Firehose, eigene Zustellfehler-Logs in CloudWatch zu schreiben. Sie zielt auf die Firehose-Fehler-Log-Gruppe (/aws/kinesisfirehose/<STREAM_NAME>), die getrennt von der Log-Gruppe ist, die Sie an AppSignal streamen möchten. Siehe Controlling access with Amazon Data Firehose für weitere Details.

Den Stack deployen

  1. Öffnen Sie die AWS-CloudFormation-Konsole.
  2. Wählen Sie Create stack und dann With new resources (standard).
  3. Wählen Sie unter Specify template die Option Upload a template file und laden Sie appsignal-cloudwatch-logs.yaml hoch.
  4. Wählen Sie Next.
  5. Geben Sie einen Stack-Namen ein, zum Beispiel appsignal-cloudwatch-logs.
  6. Geben Sie bei LogSourceApiKey den API-Schlüssel Ihrer Log-Quelle ein.
  7. Geben Sie bei CloudWatchLogGroupName den exakten Namen der Log-Gruppe ein, die Sie streamen möchten.
  8. Wählen Sie zweimal Next, aktivieren Sie dann I acknowledge that AWS CloudFormation might create IAM resources und wählen Sie Submit.
Die Erstellung des Stacks dauert einige Minuten. Sobald der Status CREATE_COMPLETE anzeigt, beginnt CloudWatch mit dem Streamen der Logs an AppSignal.

Das Deployment überprüfen

  1. Suchen Sie in der AWS-Konsole nach „CloudFormation” und wählen Sie Stacks. Öffnen Sie Ihren Stack und wählen Sie den Tab Resources, um zu bestätigen, dass alle Ressourcen CREATE_COMPLETE anzeigen.
  2. Suchen Sie in der AWS-Konsole nach „CloudWatch”. Öffnen Sie in der linken Seitenleiste Ihre Log-Gruppe und wählen Sie den Tab Subscription filters, um zu bestätigen, dass der Filter AppSignal aufgeführt ist.
  3. Suchen Sie in der AWS-Konsole nach „Firehose”. Öffnen Sie den Delivery-Stream und nutzen Sie die Funktion Test with demo data, um die Konnektivität zu überprüfen.
  4. Öffnen Sie in AppSignal den Log-Management-Bildschirm und bestätigen Sie, dass dort Log-Einträge aus Ihrer Log-Gruppe erscheinen.
Wenn nach einigen Minuten keine Logs erscheinen, prüfen Sie den S3-Bucket auf fehlgeschlagene Zustellungs-Datensätze. Wenn Sie Hilfe benötigen, kontaktieren Sie uns.

Multi-Region-Deployments

Die Vorlage muss in derselben Region und demselben Konto wie die CloudWatch-Log-Gruppe deployt werden. Wenn Sie Log-Gruppen in mehreren Regionen haben, deployen Sie eine separate Kopie dieses Stacks in jeder Region.

Aufräumen

Um alle von dieser Vorlage erstellten Ressourcen zu entfernen, löschen Sie den Stack in der CloudFormation-Konsole. Der S3-Bucket für fehlgeschlagene Zustellungen hat eine DeletionPolicy von Retain, sodass er beim Löschen des Stacks erhalten bleibt, um keine fehlgeschlagenen Zustell-Datensätze zu verlieren. Fehlgeschlagene Zustell-Datensätze im Bucket werden durch die Lebenszyklus-Regel automatisch nach 30 Tagen gelöscht. Sie können den Bucket manuell löschen, sobald Sie ihn nicht mehr benötigen.