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

# Diffuser les logs CloudWatch avec CloudFormation

<Warning>
  🔐 N'envoyez pas d'<strong>informations personnelles identifiables (PII)</strong> à AppSignal. Filtrez les PII (par exemple, noms, e-mails) des journaux et utilisez un identifiant, un hash ou un identifiant pseudonymisé à la place. <br /> <br /> 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](/support/business-add-ons).
</Warning>

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

## Avant de commencer

Préparez les informations suivantes :

* La [clé API](https://appsignal.com/redirect-to/app?to=logs/sources) de votre source de log. Si vous n'avez pas encore de source de log, [créez d'abord une nouvelle source de log](/logging/configuration#creating-a-log-source).
* 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` :

<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>
  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](https://docs.aws.amazon.com/firehose/latest/dev/controlling-access.html) pour plus de détails.
</Note>

## Déployer la stack

1. Ouvrez la [console AWS CloudFormation](https://console.aws.amazon.com/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](/logging/log-management) 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](mailto:support@appsignal.com).

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