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

# CloudWatch-Logs mit CloudFormation streamen

<Warning>
  🔐 Senden Sie keine <strong>personenbezogenen Daten (Personal Identifiable Information, PII)</strong> 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. <br /> <br /> Für **HIPAA-pflichtige Stellen** finden Sie weitere Informationen zum Abschluss eines Business Associate Agreement (BAA) in unserer [Business Add-Ons-Dokumentation](/support/business-add-ons).
</Warning>

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](/logging/platforms/cloudwatch).

## Bevor Sie beginnen

Halten Sie die folgenden Informationen bereit:

* Den [API-Schlüssel](https://appsignal.com/redirect-to/app?to=logs/sources) Ihrer Log-Quelle. Wenn Sie noch keine Log-Quelle haben, [erstellen Sie zuerst eine neue Log-Quelle](/logging/configuration#creating-a-log-source).
* 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`:

<CodeGroup>
  ```yaml YAML theme={null}
  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
  ```
</CodeGroup>

<Note>
  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](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html) für weitere Details.
</Note>

## Den Stack deployen

1. Öffnen Sie die [AWS-CloudFormation-Konsole](https://console.aws.amazon.com/cloudformation/).
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](/logging/log-management) 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](mailto:support@appsignal.com).

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