Envoyer des logs de services AWS avec la fonction Lambda Datadog

Les logs de service AWS peuvent être recueillis via la fonction Lambda du Forwarder Datadog. Ce Lambda, qui se déclenche sur les compartiments S3, les groupes de logs CloudWatch et les événements EventBridge, transmet les logs à Datadog.

Pour commencer à recueillir des logs à partir de vos services AWS :

  1. Configurez la fonction Lambda du Forwarder Datadog dans votre compte AWS.
  2. Activez la journalisation pour votre service AWS (la plupart des services AWS peuvent se connecter à un compartiment S3 ou à un groupe de logs CloudWatch).
  3. Configurez les déclencheurs qui entraînent l’exécution de la fonction Lambda du Forwarder lorsqu’il y a de nouveaux logs à transférer. Les déclencheurs peuvent être configurés de deux façons différentes.

Remarque : si vous appartenez à la région us-east-1 d’AWS, utilisez l’intégration Datadog/AWS PrivateLink.

Remarque : CloudFormation crée une stratégie IAM qui inclut l’autorisation KMS:Decrypt pour toutes les ressources, ce qui n’est pas conforme aux bonnes pratiques d’AWS Security Hub. Cette autorisation sert à déchiffrer les objets des compartiments S3 chiffrés par KMS dans le but de configurer la fonction Lambda, et il est impossible de prévoir la clé KMS qui sera utilisée pour chiffrer les compartiments S3. Vous pouvez supprimer cette autorisation en toute sécurité une fois l’installation terminée.

Activer la journalisation pour votre service AWS

Tous les services AWS qui génèrent des logs dans un compartiment S3 ou un groupe de logs CloudWatch sont pris en charge. Consultez les instructions de configuration des services les plus utilisés dans le tableau ci-dessous :

Service AWSActivation de la journalisation pour le service AWSEnvoi des logs AWS à Datadog
API GatewayActiver les logs AWS API GatewayCollecte des logs manuelle et automatique
CloudfrontActiver les logs AWS CloudfrontCollecte des logs manuelle et automatique
CloudtrailActiver les logs AWS CloudtrailCollecte de logs manuelle. Consultez la section Guide de configuration d’AWS pour Cloud SIEM si vous configurez AWS CloudTrail pour Cloud SIEM.
DynamoDBActiver les logs AWS DynamoDBCollecte de logs manuelle.
EC2-Utiliser l’Agent Datadog pour envoyer vos logs à Datadog
ECS-Utiliser l’Agent Docker pour rassembler vos logs.
Elastic Load Balancing (ELB)Activer les logs AWS ELBCollecte des logs manuelle et automatique
Lambda-Collecte des logs manuelle et automatique
RDSActiver les logs AWS RDSCollecte de logs manuelle.
Route 53Activer les logs AWS Route 53Collecte de logs manuelle.
S3Activer les logs AWS S3Collecte des logs manuelle et automatique
SNSSNS ne fournit pas de logs, mais vous pouvez traiter les logs et les événements transmis via le service SNS.Collecte de logs manuelle.
RedShiftActiver les logs AWS RedshiftCollecte des logs manuelle et automatique
Verified AccessActiver les logs Verified AccessCollecte de logs manuelle.
VPCActiver les logs AWS VPCCollecte de logs manuelle.
Step FunctionsActiver les logs AWS Step FunctionsCollecte de logs manuelle.
Web Application FirewallActiver les logs AWS WAFCollecte de logs manuelle

Configurer des déclencheurs

Il existe deux méthodes de configuration des déclencheurs sur la fonction Lambda du Forwarder Datadog :

  • Automatiquement : Datadog récupère automatiquement les emplacements des logs pour les services AWS sélectionnés et les ajoute en tant que déclencheurs pour la fonction Lambda du Forwarder Datadog. Datadog met également la liste à jour.
  • Manuellement : configurez vous-même chaque déclencheur.

Configurer automatiquement des déclencheurs

Datadog peut automatiquement configurer des déclencheurs sur la fonction Lambda du Forwarder Datadog afin de recueillir les logs AWS à partir des sources et emplacements suivants :

SourceEmplacement
Logs d’accès API GatewayCloudWatch
Logs d’exécution API GatewayCloudWatch
Logs d’accès ELB de l’applicationS3
Logs d’accès ELB classiqueS3
Logs d’accès CloudFrontS3
Logs LambdaCloudWatch
Logs RedshiftS3
Logs d’accès S3S3
Log des Step FunctionsCloudWatch
Logs d’accès Web Application FirewallS3, CloudWatch

Remarque : Les Filtres d’abonnement ne sont pas créés automatiquement par le DatadogForwarder. Créez les directement dans un Log Group.

  1. Si vous ne l’avez pas déjà fait, configurez la fonction Lambda de collecte de logs AWS avec Datadog.

  2. Vérifiez que la stratégie du rôle IAM utilisé pour l’intégration Datadog/AWS possède les autorisations suivantes. Le fonctionnement de ces autorisations est décrit ci-dessous :

    "cloudfront:GetDistributionConfig",
    "cloudfront:ListDistributions",
    "elasticloadbalancing:DescribeLoadBalancers",
    "elasticloadbalancing:DescribeLoadBalancerAttributes",
    "lambda:List*",
    "lambda:GetPolicy",
    "redshift:DescribeClusters",
    "redshift:DescribeLoggingStatus",
    "s3:GetBucketLogging",
    "s3:GetBucketLocation",
    "s3:GetBucketNotification",
    "s3:ListAllMyBuckets",
    "s3:PutBucketNotification",
    "states:ListStateMachines",
    "states:DescribeStateMachine",
    "wafv2:ListLoggingConfigurations",
    "logs:PutSubscriptionFilter",
    "logs:DeleteSubscriptionFilter",
    "logs:DescribeSubscriptionFilters"
    
    Autorisation AWSDescription
    cloudfront:GetDistributionConfigRécupère le nom du compartiment S3 contenant les logs d’accès CloudFront.
    cloudfront:ListDistributionsRépertorie toutes les distributions CloudFront.
    elasticloadbalancing:
    DescribeLoadBalancers
    Répertorie tous les répartiteurs de charge.
    Examinez la colonne Subscriptions de la page des groupes de logs pour vérifier que le nouveau flux Kinesis est bien abonné à vos groupes de logs.
    lambda:List*Énumère toutes les fonctions Lambda.
    lambda:GetPolicyRécupère la stratégie Lambda lorsque des déclencheurs doivent être supprimés.
    redshift:DescribeClustersRépertorie tous les clusters Redshift.
    redshift:DescribeLoggingStatusRécupère le nom du compartiment S3 contenant des logs Redshift.
    s3:GetBucketLoggingRécupère le nom du compartiment S3 contenant les logs d’accès S3.
    s3:GetBucketLocationRécupère la région du compartiment S3 contenant les logs d’accès S3.
    s3:GetBucketNotificationRécupère les configurations des déclencheurs Lambda existants.
    s3:PutBucketNotificationAjoute ou supprime un déclencheur Lambda basé sur des événements de compartiment S3.
    states:ListStateMachinesRépertorie toutes les Step Functions.
    states:DescribeStateMachineRécupère la configuration des logs d’une Step Function.
    wafv2:ListLoggingConfigurationsRépertorie toutes les configurations de logs de Web Application Firewall.
    logs:PutSubscriptionFilterAjoute un déclencheur Lambda basé sur des événements de log CloudWatch.
    logs:DeleteSubscriptionFilterSupprime un déclencheur Lambda basé sur des événements de log CloudWatch.
    logs:DescribeSubscriptionFiltersRépertorie les filtres d’abonnement pour le groupe de logs spécifié.
  3. Sur la page de l’intégration AWS, sélectionnez le compte AWS à partir duquel recueillir les logs, puis cliquez sur l’onglet Log Collection.

    Onglet Log Collection de la page de l'intégration AWS pour un compte AWS spécifique avec des instructions d'envoi de logs de services AWS et une zone de texte permettant d'abonner automatiquement la fonction Lambda du Forwarder en saisissant l'ARN de la fonction Lambda du Forwarder

  4. Saisissez l’ARN du Lambda créé à la section précédente, puis cliquez sur Add.

  5. Sélectionnez les services à partir desquels vous souhaitez recueillir des logs, puis cliquez sur Save. Pour arrêter la collecte de logs d’un service spécifique, désélectionnez la source associée.

    Onglet Log Collection de la page de l'intégration AWS pour un compte AWS spécifique avec une fonction Lambda saisie sous « Included ARNs » et certains services activés sous « Log Sources »

  6. Si vous possédez des logs dans plusieurs régions, vous devez créer des fonctions Lambda supplémentaires dans ces régions et les indiquer sur cette page.

  7. Pour arrêter la collecte de l’ensemble des logs AWS, passez la souris sur une fonction Lambda, puis cliquez sur l’icône de suppression. Tous les déclencheurs de cette fonction seront supprimés.

  8. Quelques minutes après cette première configuration, vos logs AWS apparaissent dans le Log Explorer Datadog.

Configurer manuellement des déclencheurs

Recueillir des logs depuis un groupe de logs CloudWatch

Si vous recueillez des logs depuis un groupe de logs CloudWatch, configurez le déclencheur entraînant l’exécution de la fonction Lambda du Forwarder Datadog à l’aide de l’une des méthodes suivantes :

  1. Dans la console AWS, accédez à Lambda
  2. Cliquez sur Functions, puis sélectionnez le Forwarder Datadog.
  3. Cliquez sur Add trigger, puis sélectionnez CloudWatch Logs.
  4. Sélectionnez le groupe de logs dans le menu déroulant.
  5. Nommez votre filtre, puis indiquez son pattern (facultatif).
  6. Cliquez sur Add.
  7. Accédez à la section Logs de Datadog pour consulter les nouveaux événements de log envoyés à votre groupe de logs.

Si vous utilisez Terraform, vous pouvez provisionner et gérer vos déclencheurs avec la ressource aws_cloudwatch_log_subscription_filter. Consultez l’exemple de code ci-dessous.

resource "aws_cloudwatch_log_subscription_filter" "datadog_log_subscription_filter" {
  name            = "datadog_log_subscription_filter"
  log_group_name  = <NOM_GROUPE_LOGS_CLOUDWATCH> # par exemple, /aws/lambda/nom_fonction_lambda
  destination_arn = <ARN_FORWARDER_DATADOG> # par exemple,  arn:aws:lambda:us-east-1:123:function:datadog-forwarder
  filter_pattern  = ""
}

Si vous utilisez AWS CloudFormation, vous pouvez provisionner et gérer vos déclencheurs avec la ressource CloudFormation AWS::Logs::SubscriptionFilter. Consultez l’exemple de code ci-dessous.

L’exemple de code fonctionne également pour AWS SAM et Serverless Framework. Pour ce dernier, le code doit être placé dans la section resources de votre fichier serverless.yml.

Resources:
  MyLogSubscriptionFilter:
    Type: "AWS::Logs::SubscriptionFilter"
    Properties:
      DestinationArn: "<ARN_FORWARDER_DATADOG>"
      LogGroupName: "<NOM_GROUPE_LOGS_CLOUDWATCH>"
      FilterPattern: ""

Collecte de logs depuis des compartiments S3

Si vous recueillez des logs depuis un compartiment S3, configurez le déclencheur entraînant l’exécution de la fonction Lambda du Forwarder Datadog à l’aide de l’une des méthodes suivantes :

  1. Une fois la fonction Lambda installée, ajoutez manuellement un déclencheur dans la console AWS sur le compartiment S3 qui contient vos logs :

    Ajout d'un déclencheur
  2. Sélectionnez le compartiment, puis suivez les instructions d’AWS :

    Intégration Lambda
  3. Définissez le bon type d’événement sur les compartiments S3 :

    Objet créé

Accédez ensuite à la section Log de Datadog pour commencer à explorer vos logs !

Si vous utilisez Terraform, vous pouvez provisionner et gérer vos déclencheurs avec la ressource aws_s3_bucket_notification. Consultez l’exemple de code ci-dessous.

resource "aws_s3_bucket_notification" "my_bucket_notification" {
  bucket = my_bucket
  lambda_function {
    lambda_function_arn = "<ARN_FORWARDER_DATADOG>"
    events              = ["s3:ObjectCreated:*"]
    filter_prefix       = "AWSLogs/"
    filter_suffix       = ".log"
  }
}

Si vous utilisez CloudFormation, vous pouvez configurer les déclencheurs avec la propriété NotificationConfiguration de CloudFormation pour votre compartiment S3. Consultez l’exemple de code ci-dessous.

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: "<MON_COMPARTIMENT>"
      NotificationConfiguration:
        LambdaConfigurations:
        - Event: 's3:ObjectCreated:*'
          Function: "<ARN_FORWARDER_DATADOG>"

Nettoyage et filtrage

Vous pouvez nettoyer les adresses e-mail ou IP dans les logs envoyés par la fonction Lambda, ou définir une règle de nettoyage personnalisée dans les paramètres de la fonction Lambda. Vous pouvez également exclure ou envoyer uniquement les logs correspondant à un pattern spécifique via l’option de filtrage.