> ## 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 streamen met CloudFormation

<Warning>
  🔐 Stuur geen <strong>Persoonlijk Identificeerbare Informatie (PII)</strong> naar AppSignal. Filter PII (bijv. namen, e-mailadressen) uit logs en gebruik in plaats daarvan een ID, hash of gepseudonimiseerde identificator. <br /> <br /> Voor **onder HIPAA vallende entiteiten** vindt u meer informatie over het ondertekenen van een Business Associate Agreement (BAA) in onze [documentatie over Business Add-Ons](/support/business-add-ons).
</Warning>

U kunt het instellen van het streamen van CloudWatch-logs naar AppSignal automatiseren met een AWS CloudFormation-template. Hiermee worden alle benodigde resources in één deployment aangemaakt in plaats van ze elk handmatig via de AWS Console te configureren.

Als u liever elke resource handmatig instelt, raadpleeg dan de [installatiehandleiding voor CloudWatch-logs](/logging/platforms/cloudwatch).

## Voordat u begint

Houd de volgende informatie bij de hand:

* De [API-sleutel](https://appsignal.com/redirect-to/app?to=logs/sources) van uw logbron. Als u nog geen logbron heeft, [maak dan eerst een nieuwe logbron aan](/logging/configuration#creating-a-log-source).
* De naam van de bestaande CloudWatch-loggroep die u naar AppSignal wilt streamen.
* De AWS-regio waarin de loggroep zich bevindt. Implementeer de stack in dezelfde regio en hetzelfde account als de loggroep.

## Wat de template aanmaakt

De CloudFormation-template maakt de volgende resources aan:

1. Een **S3-bucket** om records op te slaan die niet worden afgeleverd, met server-side encryptie, geblokkeerde publieke toegang, een levensduur 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 en zijn eigen aflevering-foutlogs naar CloudWatch kan schrijven.
3. Een **Firehose delivery stream** die logs via HTTPS naar het AppSignal-endpoint stuurt.
4. Een **IAM-rol** waarmee CloudWatch Logs naar de Firehose delivery stream kan schrijven.
5. Een **CloudWatch log subscription filter** op uw bestaande loggroep die log-events doorstuurt naar de Firehose delivery stream.

## CloudFormation-template

Kopieer de volgende template en sla deze op 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>
  De `logs:PutLogEvents`-statement staat Firehose toe om zijn eigen aflevering-foutlogs naar CloudWatch te schrijven. Het richt zich op de Firehose-foutloggroep (`/aws/kinesisfirehose/<STREAM_NAME>`), die los staat van de loggroep die u naar AppSignal wilt streamen. Zie [Controlling access with Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html) voor meer details.
</Note>

## De stack implementeren

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-logs.yaml`.
4. Selecteer **Next**.
5. Voer een stacknaam in, bijvoorbeeld `appsignal-cloudwatch-logs`.
6. Voer bij **LogSourceApiKey** de API-sleutel van uw logbron in.
7. Voer bij **CloudWatchLogGroupName** de exacte naam in van de loggroep die u wilt streamen.
8. Selecteer twee keer **Next**, vink vervolgens **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 logs naar AppSignal.

## 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". Open in de linker zijbalk uw loggroep en selecteer het tabblad **Subscription filters** om te bevestigen dat het `AppSignal`-filter wordt vermeld.
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 [logbeheerscherm](/logging/log-management) en bevestig dat logvermeldingen uit uw loggroep daar verschijnen.

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

## Implementaties in meerdere regio's

De template moet worden geïmplementeerd in dezelfde regio en hetzelfde account als de CloudWatch-loggroep. Als u loggroepen in meerdere regio's heeft, implementeert u een aparte kopie van deze stack in elke regio.

## Opruimen

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