Skip to main content
🔐 Stuur geen Persoonlijk Identificeerbare Informatie (PII) naar AppSignal. Filter PII (bijv. namen, e-mailadressen) uit logs en gebruik in plaats daarvan een ID, hash of gepseudonimiseerde identificator.

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

Voordat u begint

Houd de volgende informatie bij de hand:
  • De API-sleutel van uw logbron. Als u nog geen logbron heeft, maak dan eerst een nieuwe logbron aan.
  • 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:
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
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 voor meer details.

De stack implementeren

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

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.