Datadog の Lambda 関数で AWS サービスのログを送信する

AWS サービスのログは、Datadog Forwarder Lambda 関数を使用して収集できます。この Lambda は、S3 バケット、CloudWatch ロググループ、および EventBridge イベントでトリガーされ、ログを Datadog に転送します。

AWS サービスからログの収集を開始するには

  1. AWS アカウントで Datadog Forwarder Lambda 関数 をセットアップします。 AWS サービスで 2. Enable logging します (ほとんどの AWS サービスは、S3 バケットまたは CloudWatch ロググループにログを記録できます)。 新しいログがある場合に、Forwarder Lambda を実行させる 3. Set up the triggers します。トリガーを設定する方法は 2 つあります。

:

  • AWS PrivateLink を使用して、プライベート接続経由でログを送信できます。
  • CloudFormation はすべてのリソースに対して KMS:Decrypt を含む IAM ポリシーを作成し、AWS Security Hub のベストプラクティスに沿っていません。この権限は、Lambda 関数をセットアップするために KMS で暗号化された S3 バケットからオブジェクトを復号化するために使用され、S3 バケットを暗号化するために使用される KMS キーは予測できません。インストールが正常に完了した後、この権限は安全に削除できます。

AWS サービスのログを有効にします

S3 バケットまたは CloudWatch ロググループにログを生成する任意の AWS サービスがサポートされています。最も使用されるサービスのためのセットアップ手順を以下のテーブルに示します。

AWS サービスAWS サービス側でのログ有効化Datadog への AWS ログの送信
API GatewayAmazon API Gateway のログを有効化手動 および自動ログ収集。
AppSyncAWS AppSync のログを有効化手動 および自動ログ収集。
Batch-自動ログ収集。
Bedrock Agentcore-自動ログ収集。
CloudfrontAmazon CloudFront のログを有効化手動 および自動ログ収集。
CloudTrailAWS CloudTrail のログを有効化手動 および自動ログ収集。Cloud SIEM 用に AWS CloudTrail を設定する場合は、Cloud SIEM の AWS 構成 を参照してください。
CodeBuildAWS CodeBuild のログを有効化手動 および自動ログ収集。
DMSAWS Database Migration Service のログを有効化手動 および自動ログ収集。
DocumentDBAmazon DocumentDB のログを有効化手動 および自動ログ収集。
DynamoDBAmazon DynamoDB のログを有効化手動 ログ収集。
EC2-Datadog Agent を使用してログを Datadog に送信。
ECS-Docker Agent を使用してログ収集、または自動ログ収集。
EKSAmazon EKS のログを有効化手動 および自動ログ収集。
Elastic Load Balancing (ELB)Amazon ELB のログを有効化手動 および自動ログ収集。
GlueAWS Glue のログを有効化手動 および自動ログ収集。
IoT CoreAmazon IoT Core のログを有効化自動ログ収集。
Lambda-手動 および自動ログ収集。
MWAAAmazon MWAA のログを有効化手動 および自動ログ収集。
Network FirewallAWS Network Firewall のログを有効化手動 および自動ログ収集。
PCS-自動ログ収集。
RDSAmazon RDS のログを有効化手動 ログ収集。
RedShiftAmazon Redshift のログを有効化手動 および自動ログ収集。
Redshift Serverless-自動ログ収集。
Route 53Amazon Route 53 の DNS クエリログ および リゾルバークエリログ を有効化手動 および自動ログ収集。
S3Amazon S3 のログを有効化手動 および自動ログ収集。
SNSSNS はログを提供しませんが、SNS サービスを通過するログおよびイベントを処理。手動 ログ収集。
SSM-自動ログ収集。
Step FunctionsAmazon Step Functions のログを有効化手動 ログ収集。
Verified AccessVerified Access のログを有効化手動 および自動ログ収集。
VPCAmazon VPC のログを有効化手動 および自動ログ収集。
VPNAWS VPN のログを有効化手動 および自動ログ収集。
Web Application FirewallAWS WAF のログを有効化手動 および自動ログ収集。

トリガーの設定

Datadog Forwarder Lambda 関数でトリガーを構成する場合、オプションは 2 つあります。

  • Automatically: Datadog は選択した AWS サービスのログの場所を自動的に取得し、Datadog Forwarder Lambda 関数にトリガーとして追加します。Datadog はリストを常に最新の状態に保ちます。
  • Manually: 各トリガーを自分で設定します。

トリガーを自動的に設定する

Datadog は、AWS ログを収集するために Datadog Forwarder Lambda 関数にトリガーを自動的に構成することができます。ただし、自動サブスクリプションは異なる AWS アカウントやリージョンにまたがるトリガーの作成をサポートしていません。ログが別のアカウントの S3 バケットに公開されるシナリオでは、この制限に対する対応策として、バケットと同じアカウントで手動でトリガーを作成することをお勧めします。

以下のソースと場所がサポートされています。

ソース場所
Apache Airflow (MWAA)CloudWatch
API Gateway のアクセスログCloudWatch
API Gateway の実行ログCloudWatch
アプリケーション ELB アクセスログS3
AppSync ログCloudWatch
BatchCloudWatch
Bedrock Agentcore ログS3, CloudWatch
クラシック ELB アクセスログS3
CloudFront アクセスログS3
Cloudtrail ログS3, CloudWatch
CodeBuild ログS3, CloudWatch
DMS ログCloudWatch
DocumentDB ログCloudWatch
ECS ログCloudWatch
EKS Control Plane ログCloudWatch
EKS Container Insights ログCloudWatch
Glue Jobs ログCloudWatch
Lambda ログCloudWatch
Lambda@Edge ログCloudWatch
IoT Core ログCloudWatch
Network Firewall ログS3, CloudWatch
PCS ログCloudWatch
Redshift ログS3, Cloudwatch
Redshift Serverless ログCloudWatch
RDS ログCloudWatch
Route53 DNS Query ログCloudWatch
Route53 Resolver クエリのログS3, CloudWatch
S3 アクセスログS3
SSM Command ログCloudWatch
Step FunctionsCloudWatch
Verified Access ログS3, CloudWatch
VPC Flow ログS3, CloudWatch
VPN ログCloudWatch
Web アプリケーションファイアウォールS3, CloudWatch

: サブスクリプション フィルター は、Datadog Forwarder によって CloudWatch ロググループに自動的に作成され、DD_LOG_SUBSCRIPTION_FILTER_<LOG_GROUP_NAME> の形式で名前が付けられます。

  1. まだセットアップしていない場合、Datadog のログ収集用 AWS Lambda 関数 をセットアップしてください。

  2. Datadog-AWS インテグレーション に使用される IAM ロールのポリシーに、以下の権限があることを確認してください。これらの権限がどのように使用されるかについての情報は、以下の説明にあります。

    "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. AWS インテグレーション ページ で、ログを収集する AWS アカウントを選択し、[Log Collection] (ログ収集) タブをクリックします。

  4. [Datadog Forwarder Lambda] セクションで、前のセクションで作成した Lambda の ARN を入力し、[Add] (追加) をクリックします。Lambda 関数は、名前、バージョン、およびリージョンとともに下のテーブルに表示されます。

  5. [Log Autosubscription] (ログ自動サブスクリプション) セクションで、[Log Sources] (ログソース) の下に、ログを収集したいサービスをトグルして有効にします。特定のサービスからのログ収集を停止するには、ログソースをオフにします。

  6. (オプション) [Log Source Tag Filters] (ログソースタグフィルター) セクションで、各ログソースのリソースタグによってログ収集をフィルタリングできます。ドロップダウンメニューからログソースを選択し、key:value 形式でタグを追加して、収集するリソースのログを制限します。: リソースタグは、Datadog プラットフォームの規約に合わせて自動的に小文字に変換されます。不一致を避けるため、タグフィルターは小文字で定義してください。

  7. 複数のリージョンにログがある場合は、そのリージョンに追加の Lambda 関数を作成し、[Datadog Forwarder Lambda] セクションに追加する必要があります。

  8. 特定の Lambda 関数からすべての AWS ログの収集を停止するには、テーブル内の Lambda にカーソルを合わせて削除アイコンをクリックします。その関数のすべてのトリガーが削除されます。

  9. この初期のセットアップから数分以内に、AWS ログが Datadog Log エクスプローラー に表示されるようになります。

手動でトリガーをセットアップする

CloudWatch ロググループからログを収集する

CloudWatch ロググループからログを収集している場合、以下のいずれかの方法で Datadog Forwarder Lambda 関数 へのトリガーを構成します。

  1. AWS コンソールで、Lambda に移動します。
  2. [Functions] (関数) をクリックし、[Datadog Forwarder] を選択します。
  3. [Add trigger] (トリガーを追加) をクリックし、[CloudWatch Logs] (CloudWatch ログ) を選択します。
  4. ドロップダウンメニューからロググループを選択します。
  5. フィルターの名前を入力し、オプションでフィルターパターンを指定します。
  6. [Add] をクリックします。
  7. Datadog Log セクション にアクセスし、ロググループに送信された新しいログイベントを確認します。

Terraform ユーザーは、aws_cloudwatch_log_subscription_filter リソースを使用してトリガーのプロビジョニングと管理ができます。以下のサンプルコードを参照してください。

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.

AWS CloudFormation ユーザーは、CloudFormation AWS::Logs::SubscriptionFilter リソースを使用してトリガーのプロビジョニングと管理ができます。以下のサンプルコードを参照してください。

このサンプルコードは、AWS SAM および Serverless Framework にも対応しています。Serverless Framework の場合、コードを serverless.ymlresources (リソース) セクションに配置してください。

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

S3 バケットからログを収集する

S3 バケットからログを収集している場合、以下のいずれかの方法で Datadog Forwarder Lambda 関数 へのトリガーを構成します。

  1. Lambda 関数がインストールされたら、AWS コンソールから手動で、ログを含む S3 バケットにトリガーを追加します:

    トリガーの追加
  2. バケットを選択して、AWS の指示に従います。

    統合 Lambda
  3. S3 バケットで正しいイベントタイプを設定します。

    オブジェクト作成

完了したら、Datadog Log セクション に移動し、ログを確認します。

Terraform ユーザーは、aws_s3_bucket_notification リソースを使用してトリガーのプロビジョニングと管理ができます。以下のサンプルコードを参照してください。

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"
  }
}

CloudFormation ユーザーは、S3 バケットの CloudFormation NotificationConfiguration を利用してトリガーを構成できます。以下のサンプルコードを参照してください。

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

スクラビングとフィルタリング

Lambda 関数から送信されるログに対して、メールアドレスや IP アドレスをスクラビングでき、Lambda パラメーター でカスタムのスクラビングルールを定義することもできます。 フィルタリング機能 を使用して、特定のパターンに一致するログを除外したり、一致するログだけを送信したりすることもできます。

参考資料