Envoyer des logs de services AWS avec la fonction Lambda Datadog

Les journaux des services AWS peuvent être collectés à l’aide de la fonction Lambda Datadog Forwarder. Cette Lambda—qui se déclenche sur les buckets S3, les groupes de journaux CloudWatch et les événements EventBridge—transmet les journaux à Datadog.

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

  1. Configurez la fonction Lambda Datadog Forwarder dans votre compte AWS.
  2. Activez la journalisation pour votre service AWS (la plupart des services AWS peuvent enregistrer dans un bucket S3 ou un groupe de journaux CloudWatch).
  3. Configurez les déclencheurs qui provoquent l’exécution de la fonction Lambda Forwarder lorsqu’il y a de nouveaux journaux à transmettre. Il existe deux façons de configurer les déclencheurs.

Remarques :

  • Vous pouvez utiliser AWS PrivateLink pour envoyer vos journaux via une connexion privée.
  • CloudFormation crée une politique IAM qui inclut KMS:Decrypt pour toutes les ressources et qui n’est pas conforme aux meilleures pratiques d’AWS Security Hub. Cette autorisation est utilisée pour déchiffrer des objets provenant de buckets S3 chiffrés par KMS afin de configurer la fonction Lambda, et la clé KMS utilisée pour chiffrer les buckets S3 ne peut pas être prédite. Vous pouvez supprimer en toute sécurité cette autorisation après la fin réussie de l’installation.

Activez la journalisation pour votre service AWS

Tout service AWS qui génère des journaux dans un bucket S3 ou un groupe de journaux CloudWatch est pris en charge. Trouvez les instructions de configuration pour les services les plus utilisés dans le tableau ci-dessous :

Service AWSActiver la journalisation du service AWSEnvoyer les journaux AWS à Datadog
API GatewayActiver les journaux Amazon API GatewayManuel et collecte automatique des journaux.
AppSyncActiver les journaux AWS AppSyncManuel et collecte automatique des journaux.
Batch-Collecte automatique des journaux.
Bedrock Agentcore-Collecte automatique des journaux.
CloudfrontActiver les journaux Amazon CloudFrontManuel et collecte automatique des journaux.
CloudTrailActiver les journaux AWS CloudTrailManuel et collecte automatique des journaux. Voir Configuration AWS pour Cloud SIEM si vous configurez AWS CloudTrail pour Cloud SIEM.
CodeBuildActiver les journaux AWS CodeBuildManuel et collecte automatique des journaux.
DMSActiver les journaux du Service de Migration de Base de Données AWSManuel et collecte automatique des journaux.
DocumentDBActiver les journaux Amazon DocumentDBManuel et collecte automatique des journaux.
DynamoDBActiver les journaux Amazon DynamoDBManuel collecte des journaux.
EC2-Utilisez l’Agent Datadog pour envoyer vos journaux à Datadog.
ECS-Utilisez l’Agent Docker pour rassembler vos journaux ou collecte automatique des journaux.
EKSActiver les journaux Amazon EKSManuel et collecte automatique des journaux.
Elastic Load Balancing (ELB)Activer les journaux Amazon ELBManuel et collecte automatique des journaux.
GlueActiver les journaux AWS GlueManuel et collecte automatique des journaux.
IoT CoreActiver les journaux Amazon IoT CoreCollecte automatique des journaux.
Lambda-Manuel et collecte automatique des journaux.
MWAAActiver les journaux Amazon MWAAManuel et collecte automatique des journaux.
Network FirewallActiver les journaux AWS Network FirewallManuel et collecte automatique des journaux.
PCS-Collecte automatique des journaux.
RDSActiver les journaux Amazon RDSManuel collecte des journaux.
RedShiftActiver les journaux Amazon RedshiftManuel et collecte automatique des journaux.
Redshift Serverless-Collecte automatique des journaux.
Route 53Activez la journalisation des requêtes DNS d’Amazon Route 53 DNS query logging et resolver query loggingManuel et collecte automatique des journaux.
S3Activez les journaux Amazon S3Manuel et automatique collecte des journaux.
SNSSNS ne fournit pas de journaux, mais vous pouvez traiter les journaux et les événements qui transitent vers le service SNS.Manuel collecte des journaux.
SSM-Collecte automatique des journaux.
Step FunctionsActivez les journaux Amazon Step FunctionsManuel collecte des journaux.
Verified AccessActivez les journaux Verified AccessManuel et automatique collecte des journaux.
VPCActivez les journaux Amazon VPCManuel et automatique collecte des journaux.
VPNActivez les journaux AWS VPNManuel et automatique collecte des journaux.
Web Application FirewallActivez les journaux AWS WAFManuel et automatique collecte des journaux.

Configurez 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 journaux pour les services AWS sélectionnés et les ajoute en tant que déclencheurs sur la fonction Lambda Datadog Forwarder. Datadog maintient également la liste à jour.
  • Manuellement : Configurez chaque déclencheur vous-même.

Configurez automatiquement des déclencheurs

Datadog peut configurer automatiquement des déclencheurs sur la fonction Lambda Datadog Forwarder pour collecter les journaux AWS. Cependant, l’abonnement automatique ne prend pas en charge la création de déclencheurs sur différents comptes ou régions AWS. Pour les scénarios où les journaux sont publiés dans des compartiments S3 dans un compte séparé, nous recommandons de créer manuellement un déclencheur dans le même compte que le compartiment pour contourner cette limitation.

Les sources et emplacements suivants sont pris en charge :

SourceEmplacement
Apache Airflow (MWAA)CloudWatch
Journaux d’accès de l’API GatewayCloudWatch
Journaux d’exécution de l’API GatewayCloudWatch
Journaux d’accès de l’ELB d’applicationS3
Journaux AppSyncCloudWatch
BatchCloudWatch
Journaux de Bedrock AgentcoreS3, CloudWatch
Journaux d’accès de l’ELB classiqueS3
Journaux d’accès de CloudFrontS3
Journaux de CloudTrailS3, CloudWatch
Journaux de CodeBuildS3, CloudWatch
Journaux DMSCloudWatch
Journaux DocumentDBCloudWatch
Journaux ECSCloudWatch
Journaux du plan de contrôle EKSCloudWatch
Journaux Container Insights d’EKSCloudWatch
Journaux des Glue JobsCloudWatch
Journaux LambdaCloudWatch
Journaux Lambda@EdgeCloudWatch
Journaux IoT CoreCloudWatch
Journaux de pare-feu réseauS3, CloudWatch
Journaux PCSCloudWatch
Journaux RedshiftS3, CloudWatch
Journaux Redshift ServerlessCloudWatch
Journaux RDSCloudWatch
Journaux des requêtes DNS Route53CloudWatch
Journaux des requêtes Route53 ResolverS3, CloudWatch
Journaux d’accès S3S3
Journaux de commandes SSMCloudWatch
Step FunctionsCloudWatch
Journaux Verified AccessS3, CloudWatch
Journaux de flux VPCS3, CloudWatch
Journaux VPNCloudWatch
Pare-feu d’application WebS3, CloudWatch

Remarque : Subscription filters sont créés automatiquement sur les groupes de journaux CloudWatch par le DatadogForwarder, et sont nommés au format DD_LOG_SUBSCRIPTION_FILTER_<LOG_GROUP_NAME>.

  1. Si vous ne l’avez pas déjà fait, configurez la Datadog log collection AWS Lambda function.

  2. Assurez-vous que la politique du rôle IAM utilisé pour Datadog-AWS integration dispose des autorisations suivantes. Des informations sur l’utilisation de ces permissions peuvent être trouvées dans les descriptions ci-dessous :

    "airflow:GetEnvironment",
    "airflow:ListEnvironments",
    "appsync:ListGraphqlApis",
    "batch:DescribeJobDefinitions",
    "cloudfront:GetDistributionConfig",
    "cloudfront:ListDistributions",
    "cloudtrail:GetTrail",
    "cloudtrail:ListTrails",
    "codebuild:BatchGetProjects",
    "codebuild:ListProjects",
    "dms:DescribeReplicationInstances",
    "ec2:DescribeFlowLogs",
    "ec2:DescribeVerifiedAccessInstanceLoggingConfigurations",
    "ec2:DescribeVpnConnections",
    "ecs:DescribeTaskDefinition",
    "ecs:ListTaskDefinitionFamilies",
    "eks:DescribeCluster",
    "eks:ListClusters",
    "elasticloadbalancing:DescribeLoadBalancerAttributes",
    "elasticloadbalancing:DescribeLoadBalancers",
    "glue:BatchGetJobs",
    "glue:GetJobs",
    "glue:GetJob",
    "glue:ListJobs",
    "iot:GetV2LoggingOptions",
    "lambda:GetPolicy",
    "lambda:InvokeFunction",
    "lambda:List*",
    "logs:DeleteSubscriptionFilter",
    "logs:DescribeDeliveries",
    "logs:DescribeDeliverySources",
    "logs:DescribeLogGroups",
    "logs:DescribeSubscriptionFilters",
    "logs:GetDeliveryDestination",
    "logs:PutSubscriptionFilter",
    "network-firewall:DescribeLoggingConfiguration",
    "network-firewall:ListFirewalls",
    "rds:DescribeDBClusters",
    "rds:DescribeDBInstances",
    "redshift-serverless:ListNamespaces",
    "redshift:DescribeClusters",
    "redshift:DescribeLoggingStatus",
    "route53:ListQueryLoggingConfigs",
    "route53resolver:ListResolverQueryLogConfigs",
    "s3:GetBucketLocation",
    "s3:GetBucketLogging",
    "s3:GetBucketNotification",
    "s3:ListAllMyBuckets",
    "s3:PutBucketNotification",
    "ssm:GetServiceSetting",
    "ssm:ListCommands",
    "states:DescribeStateMachine",
    "states:ListStateMachines",
    "wafv2:ListLoggingConfigurations"
    
    AWS PermissionDescription
    airflow:ListEnvironmentsList all MWAA environment names.
    airflow:GetEnvironmentGet information about a MWAA environment.
    appsync:ListGraphqlApisList all GraphQL Apis.
    batch:DescribeJobDefinitionsList all Batch job definitions.
    cloudfront:GetDistributionConfigGet the name of the S3 bucket containing CloudFront access logs.
    cloudfront:ListDistributionsList all CloudFront distributions.
    cloudtrail:GetTrailGet Trail logging information.
    cloudtrail:ListTrailsList all Cloudtrail trails.
    codebuild:BatchGetProjectsList all CodeBuild projects.
    codebuild:ListProjectsGet information on CodeBuild projects.
    dms:DescribeReplicationInstancesList all replication instances for DMS.
    ec2:DescribeFlowLogsList all Flow log configurations.
    ec2:DescribeVerifiedAccessInstanceLoggingConfigurationsList all Verified Access instance logging configurations.
    ec2:DescribeVpnConnectionsList all VPN connections.
    ecs:DescribeTaskDefinitionDescribe ECS task definition.
    ecs:ListTaskDefinitionFamiliesList all task definition families.
    elasticloadbalancing:
    DescribeLoadBalancers
    List all load balancers.
    elasticloadbalancing:
    DescribeLoadBalancerAttributes
    Get the name of the S3 bucket containing ELB access logs.
    glue:BatchGetJobsGet information about multiple Glue jobs.
    glue:GetJobGet information about a Glue job.
    glue:GetJobsList all Glue jobs.
    glue:ListJobsList all Glue job names.
    eks:DescribeClusterDescribe an EKS cluster.
    eks:ListClustersList all EKS clusters.
    iot:GetV2LoggingOptionsGet IoT V2 logging options.
    lambda:InvokeFunctionInvoke a Lambda function.
    lambda:List*List all Lambda functions.
    lambda:GetPolicyGet the Lambda policy when triggers are to be removed.
    logs:PutSubscriptionFilterAdd a Lambda trigger based on CloudWatch Log events.
    logs:DeleteSubscriptionFilterRemove a Lambda trigger based on CloudWatch Log events.
    logs:DescribeLogGroupsDescribe CloudWatch log groups.
    logs:DescribeDeliveriesDescribe CloudWatch log deliveries.
    logs:DescribeDeliverySourcesDescribe CloudWatch log delivery sources.
    logs:DescribeSubscriptionFiltersList the subscription filters for the specified log group.
    logs:GetDeliveryDestinationGet a CloudWatch log delivery destination.
    network-firewall:DescribeLoggingConfigurationGet the logging configuration of a firewall.
    network-firewall:ListFirewallsList all Network Firewall firewalls.
    rds:DescribeDBClustersList all RDS clusters.
    rds:DescribeDBInstancesList all RDS instances.
    redshift:DescribeClustersList all Redshift clusters.
    redshift:DescribeLoggingStatusGet the name of the S3 bucket containing Redshift Logs.
    redshift-serverless:ListNamespacesList all Redshift Serverless namespaces.
    route53:ListQueryLoggingConfigsList all DNS query logging configurations for Route 53.
    route53resolver:ListResolverQueryLogConfigsList all Resolver query logging configurations for Route 53.
    s3:GetBucketLoggingGet the name of the S3 bucket containing S3 access logs.
    s3:GetBucketLocationGet the region of the S3 bucket containing S3 access logs.
    s3:GetBucketNotificationGet existing Lambda trigger configurations.
    s3:ListAllMyBucketsList all S3 buckets.
    s3:PutBucketNotificationAdd or remove a Lambda trigger based on S3 bucket events.
    ssm:GetServiceSettingGet the SSM service setting for customer script log group name.
    ssm:ListCommandsList all SSM commands.
    states:ListStateMachinesList all Step Functions.
    states:DescribeStateMachineGet logging details about a Step Function.
    wafv2:ListLoggingConfigurationsList all logging configurations of the Web Application Firewall.
  3. Sur la page d’intégration AWS, sélectionnez le compte AWS à partir duquel collecter les journaux et cliquez sur l’onglet Collecte de journaux.

  4. Dans la section Datadog Forwarder Lambda, entrez l’ARN de la Lambda créée dans la section précédente et cliquez sur Ajouter. La fonction Lambda apparaît dans le tableau ci-dessous avec son nom, sa version et sa région.

  5. Dans la section Log Autosubscription, sous Log Sources, activez les services dont vous souhaitez collecter les journaux en les activant. Pour arrêter la collecte des journaux d’un service particulier, désactivez la source de journaux correspondante.

  6. (Optionnel) Dans la section Log Source Tag Filters, vous pouvez filtrer la collecte des journaux par balises de ressources pour chaque source de journal. Sélectionnez une source de journal dans le menu déroulant et ajoutez des balises au format key:value pour limiter la collecte des journaux aux ressources concernées. Remarque : Les balises de ressources sont automatiquement mises en minuscules pour correspondre aux conventions de la plateforme Datadog. Définissez vos filtres de balises en minuscules pour éviter les incohérences.

  7. Si vous avez des journaux dans plusieurs régions, vous devez créer des fonctions Lambda supplémentaires dans ces régions et les ajouter dans la section Datadog Forwarder Lambda.

  8. Pour arrêter la collecte de tous les journaux AWS d’une fonction Lambda spécifique, survolez la Lambda dans le tableau et cliquez sur l’icône de suppression. Tous les déclencheurs pour cette fonction sont supprimés.

  9. Dans les quelques minutes suivant cette configuration initiale, vos journaux AWS apparaissent dans le Log Explorer de Datadog.

Configurez manuellement les déclencheurs

Collecte des journaux du groupe de journaux 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, allez à Lambda.
  2. Cliquez sur Functions et sélectionnez le Datadog Forwarder.
  3. Cliquez sur Ajouter un déclencheur et sélectionnez CloudWatch Logs.
  4. Sélectionnez le groupe de journaux dans le menu déroulant.
  5. Entrez un nom pour votre filtre et, si vous le souhaitez, spécifiez un motif de filtre.
  6. Cliquez sur Ajouter.
  7. Allez dans la section Datadog Log pour explorer les nouveaux événements de journal envoyés à votre groupe de journaux.

Pour les utilisateurs de Terraform, vous pouvez provisionner et gérer vos déclencheurs en utilisant la ressource aws_cloudwatch_log_subscription_filter. Voir le code d’exemple ci-dessous.

data "aws_cloudwatch_log_group" "some_log_group" {
  name = "/some/log/group"
}

resource "aws_lambda_permission" "lambda_permission" {
  action        = "lambda:InvokeFunction"
  function_name = "datadog-forwarder" # this is the default but may be different in your case
  principal     = "logs.amazonaws.com" # or logs.amazonaws.com.cn for China*
  source_arn    = data.aws_cloudwatch_log_group.some_log_group.arn
}

resource "aws_cloudwatch_log_subscription_filter" "datadog_log_subscription_filter" {
  name            = "datadog_log_subscription_filter"
  log_group_name  = <CLOUDWATCH_LOG_GROUP_NAME> # for example, /some/log/group
  destination_arn = <DATADOG_FORWARDER_ARN> # for example,  arn:aws:lambda:us-east-1:123:function:datadog-forwarder
  filter_pattern  = ""
}

* All use of Datadog Services in (or in connection with environments within) mainland China is subject to the disclaimer published in the Restricted Service Locations section on our website.

Pour les utilisateurs d’AWS CloudFormation, vous pouvez provisionner et gérer vos déclencheurs en utilisant la ressource CloudFormation AWS::Logs::SubscriptionFilter. Voir le code d’exemple ci-dessous.

Le code d’exemple fonctionne également pour AWS SAM et Serverless Framework. Pour Serverless Framework, placez le code sous la section resources dans votre serverless.yml.

Resources:
  MyLogSubscriptionFilter:
    Type: "AWS::Logs::SubscriptionFilter"
    Properties:
      DestinationArn: "<DATADOG_FORWARDER_ARN>"
      LogGroupName: "<CLOUDWATCH_LOG_GROUP_NAME>"
      FilterPattern: ""

Collecte des journaux à partir des buckets 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 sur le bucket S3 contenant vos journaux dans la console AWS :

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

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

    Objet créé

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

Pour les utilisateurs de Terraform, vous pouvez provisionner et gérer vos déclencheurs en utilisant la ressource aws_s3_bucket_notification. Voir le code d’exemple ci-dessous.

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

Pour les utilisateurs de CloudFormation, vous pouvez configurer des déclencheurs en utilisant la NotificationConfiguration de CloudFormation pour votre bucket S3. Voir le code d’exemple ci-dessous.

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

Nettoyage et filtrage

Vous pouvez nettoyer les e-mails ou les adresses IP des journaux envoyés par la fonction Lambda, ou définir une règle de nettoyage personnalisée dans les paramètres Lambda. Vous pouvez également exclure ou envoyer uniquement les journaux qui correspondent à un modèle spécifique en utilisant le filtering option.

Lectures complémentaires