Skip to main content
🔐 N’envoyez pas d’informations personnelles identifiables (PII) à AppSignal. Filtrez les PII (par exemple, noms, e-mails) des journaux et utilisez un identifiant, un hash ou un identifiant pseudonymisé à la place.

Pour les entités couvertes par la HIPAA, plus d’informations sur la signature d’un Business Associate Agreement (BAA) sont disponibles dans notre documentation Business Add-Ons.
Vous pouvez automatiser la configuration de la diffusion des logs CloudWatch vers AppSignal à l’aide d’un modèle AWS CloudFormation. Cela crée toutes les ressources requises en un seul déploiement, au lieu de configurer chacune d’elles manuellement via la console AWS. Si vous préférez configurer chaque ressource manuellement, consultez le guide de configuration des logs CloudWatch.

Avant de commencer

Préparez les informations suivantes :
  • La clé API de votre source de log. Si vous n’avez pas encore de source de log, créez d’abord une nouvelle source de log.
  • Le nom du log group CloudWatch existant que vous souhaitez diffuser vers AppSignal.
  • La région AWS où se trouve le log group. Déployez la stack dans la même région et le même compte que le log group.

Ce que crée le modèle

Le modèle CloudFormation crée les ressources suivantes :
  1. Un bucket S3 pour stocker les enregistrements dont la livraison échoue, avec un chiffrement côté serveur, l’accès public bloqué, une expiration de cycle de vie de 30 jours et une politique de conservation à la suppression.
  2. Un rôle IAM qui permet à Amazon Data Firehose d’écrire les enregistrements échoués dans le bucket S3 et d’écrire ses propres logs d’erreurs de livraison dans CloudWatch.
  3. Un flux de livraison Firehose qui envoie les logs vers le point de terminaison AppSignal via HTTPS.
  4. Un rôle IAM qui permet à CloudWatch Logs d’écrire dans le flux de livraison Firehose.
  5. Un filtre d’abonnement de log CloudWatch sur votre log group existant qui transfère les événements de log vers le flux de livraison Firehose.

Modèle CloudFormation

Copiez le modèle suivant et enregistrez-le sous 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
L’instruction logs:PutLogEvents permet à Firehose d’écrire ses propres logs d’erreurs de livraison dans CloudWatch. Elle cible le log group d’erreurs de Firehose (/aws/kinesisfirehose/<STREAM_NAME>), qui est distinct du log group que vous voulez diffuser vers AppSignal. Consultez Controlling access with Amazon Data Firehose pour plus de détails.

Déployer la stack

  1. Ouvrez la console AWS CloudFormation.
  2. Sélectionnez Create stack et choisissez With new resources (standard).
  3. Sous Specify template, sélectionnez Upload a template file et téléchargez appsignal-cloudwatch-logs.yaml.
  4. Sélectionnez Next.
  5. Entrez un nom de stack, par exemple appsignal-cloudwatch-logs.
  6. Pour LogSourceApiKey, entrez la clé API de votre source de log.
  7. Pour CloudWatchLogGroupName, entrez le nom exact du log group que vous souhaitez diffuser.
  8. Sélectionnez Next deux fois, puis cochez I acknowledge that AWS CloudFormation might create IAM resources et sélectionnez Submit.
La création de la stack prend quelques minutes. Une fois que le statut affiche CREATE_COMPLETE, CloudWatch commence à diffuser les logs vers AppSignal.

Vérifier le déploiement

  1. Dans la console AWS, recherchez « CloudFormation » et sélectionnez Stacks. Ouvrez votre stack et sélectionnez l’onglet Resources pour confirmer que toutes les ressources affichent CREATE_COMPLETE.
  2. Dans la console AWS, recherchez « CloudWatch ». Dans la barre latérale gauche, ouvrez votre log group et sélectionnez l’onglet Subscription filters pour confirmer que le filtre AppSignal est listé.
  3. Dans la console AWS, recherchez « Firehose ». Ouvrez le flux de livraison et utilisez la fonction Test with demo data pour vérifier la connectivité.
  4. Dans AppSignal, ouvrez l’écran de gestion des logs et confirmez que les entrées de log de votre log group y apparaissent.
Si les logs n’apparaissent pas après quelques minutes, vérifiez dans le bucket S3 les enregistrements de livraison échoués. Si vous avez besoin d’aide, contactez-nous.

Déploiements multi-régions

Le modèle doit être déployé dans la même région et le même compte que le log group CloudWatch. Si vous avez des log groups dans plusieurs régions, déployez une copie distincte de cette stack dans chaque région.

Nettoyage

Pour supprimer toutes les ressources créées par ce modèle, supprimez la stack dans la console CloudFormation. Le bucket S3 destiné aux livraisons échouées a une DeletionPolicy à Retain, il est donc conservé lorsque la stack est supprimée afin d’éviter de perdre des enregistrements de livraison échoués. Les enregistrements de livraison échoués dans le bucket sont automatiquement supprimés après 30 jours par la règle de cycle de vie. Vous pouvez supprimer le bucket manuellement lorsque vous n’en avez plus besoin.