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

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

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

  1. AWS アカウントで Datadog Forwarder Lambda 関数をセットアップします。
  2. AWS サービスでログを有効にします (大部分の AWS サービスは、S3 バケットまたは CloudWatch ログ グループにログインできます)。
  3. 転送する新しいログがあったときに Forwarder Lambda を実行させるトリガーの設定をします。トリガーの構成は 2 通りあります。

: AWS us-east-1 リージョンにいる場合は、Datadog-AWS Private Link を利用してください。

: Cloudformation は、すべてのリソースに対して KMS:Decrypt を含む IAM ポリシーを作成し、AWS Security Hub のベストプラクティスと一致しません。この権限は、Lambda 関数を設定するために KMS で暗号化された S3 バケットからオブジェクトを復号するために使用され、どの KMS キーが S3 バケットの暗号化に使用されているかは予測できません。インストーラーが正常に終了したら、この権限を安全に削除することができます。

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

S3 バケットまたは CloudWatch ロググループにログを生成する AWS サービスがサポートされています。以下の表で、よく使用されるサービスのセットアップ手順を参照してください。

AWS サービスAWS サービス ログを有効にするAWS ログを Datadog に送信する
API GatewayAmazon API Gateway ログを有効にする手動および自動ログコレクション。
CloudfrontAmazon CloudFront ログを有効にする手動および自動ログコレクション。
CloudTrailAWS CloudTrail ログを有効にする手動ログコレクション。AWS CloudTrail for Cloud SIEM を設定する場合は、AWS Configuration for Cloud SIEM11 を参照してください。
DynamoDBAmazon DynamoDB ログを有効にする手動ログコレクション。
EC2-Datadog Agent を使用してログを Datadog に送信します。
ECS-docker Agent を使用してログを収集します
Elastic Load Balancing (ELB)Amazon ELB ログを有効にする手動および自動ログコレクション。
Lambda-手動および自動ログコレクション。
RDSAmazon RDS ログを有効にする手動ログコレクション。
Route 53Amazon Route 53 ログを有効にする手動ログコレクション。
S3Amazon S3 ログを有効にする手動および自動ログコレクション。
SNSSNS はログを提供しませんが、SNS サービスに送信されるログとイベントを処理することができます。手動ログコレクション。
RedShiftAmazon Redshift ログを有効にする手動および自動ログコレクション。
Verified AccessVerified Access ログを有効にする手動ログコレクション。
VPCAmazon VPC ログを有効にする手動ログコレクション。

トリガーの設定

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

  • 自動: Datadog は、選択されている AWS サービスのログロケーションを自動的に受信し、Datadog Forwarder Lambda 関数のトリガーとして追加します。また、リストを最新状態に維持します。
  • 手動: 各トリガーをセットアップします。

トリガーを自動的にセットアップする

Datadog は、Datadog Forwarder Lambda 関数にトリガーを自動的に構成し、以下のソースとロケーションから AWS ログを収集することができます。

ソース場所
APIKEYAccessKey ボックスに貼り付けます (Datadog API 設定ページから API キーを取得できます)。CloudWatch
API ゲートウェイの実行ログCloudWatch
アプリケーション ELB アクセスログ: 2 つ以上のソースにサブスクライブする場合、このセットアップを完了後、新しい Kinesis ストリームにサブスクライブすることができます。
クラシック ELB アクセスログ: 2 つ以上のソースにサブスクライブする場合、このセットアップを完了後、新しい Kinesis ストリームにサブスクライブすることができます。
CloudFront のアクセスログ: 2 つ以上のソースにサブスクライブする場合、このセットアップを完了後、新しい Kinesis ストリームにサブスクライブすることができます。
Lambda ログCloudWatch
Redshift ログ: 2 つ以上のソースにサブスクライブする場合、このセットアップを完了後、新しい Kinesis ストリームにサブスクライブすることができます。
S3 アクセスログ: 2 つ以上のソースにサブスクライブする場合、このセットアップを完了後、新しい Kinesis ストリームにサブスクライブすることができます。

: サブスクリプション フィルターは、DatadogForwarder によって自動的に作成されません。ロググループで直接作成してください。

  1. Datadog ログコレクション AWS Lambda 関数をまだセットアップしていない場合は、セットアップします。

  2. Datadog と AWS のインテグレーションに使用する IAM ロールのポリシーに、次のアクセス許可があることを確認します。この許可の使用方法については、以下に説明されています。

    "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",
    "logs:PutSubscriptionFilter",
    "logs:DeleteSubscriptionFilter",
    "logs:DescribeSubscriptionFilters"
    
    AWS アクセス許可説明
    cloudfront:GetDistributionConfigCloudFront アクセスログを含む S3 バケットの名前を取得します。
    cloudfront:ListDistributionsすべての CloudFront ディストリビューションを一覧表示します。
    elasticloadbalancing:
    DescribeLoadBalancers
    すべてのロードバランサーを一覧表示します。
    ロググループインデックスページSubscriptions をチェックして、新しい Kinesis ストリームがロググループをサブスクライブしているかを確認します。
    lambda:List*すべての Lambda 関数を一覧表示します。
    lambda:GetPolicyトリガーが解除された際に Lambda ポリシーを取得します。
    redshift:DescribeClustersすべての Redshift クラスターを一覧表示します。
    redshift:DescribeLoggingStatusRedshift ログを含む S3 バケットの名前を取得します。
    s3:GetBucketLoggingS3 アクセスログを含む S3 バケットの名前を取得します。
    s3:GetBucketLocationS3 アクセスログを含む S3 バケットのリージョンを取得します。
    s3:GetBucketNotification既存の Lambda トリガーコンフィギュレーションを取得します。
    s3:PutBucketNotificationS3 バケットのイベントに基づいて Lambda トリガーを追加または削除します。
    logs:PutSubscriptionFilterCloudWatch ログのイベントに基づいて Lambda トリガーを追加します。
    logs:DeleteSubscriptionFilterCloudWatch ログのイベントに基づいて Lambda トリガーを削除します。
    logs:DescribeSubscriptionFilters特定のロググループのサブスクリプションフィルターを一覧表示します。
  3. AWS インテグレーションページで、ログを収集する AWS アカウントを選択し、Log Collection タブをクリックします。

    特定の AWS アカウントの AWS インテグレーションページの Log Collection タブに、AWS Services のログを送信する指示と、Forwarder Lambda 関数の ARN を入力して自動的にサブスクライブするテキストボックスが表示されます。

  4. 前のセクションで作成した Lambda の ARN を入力し、Add をクリックします。

  5. ログを収集するサービスを選択し、Save をクリックします。特定のサービスからのログの収集を停止するには、ログソースの選択を解除します。

    Included ARNs に 1 つの Lambda 関数が正常に入力され、Log Sources でいくつかのサービスが有効になっている特定の AWS アカウントの AWS インテグレーションページの Log Collection タブ

  6. 複数のリージョンにログがある場合は、そのリージョンに追加の Lambda 関数を作成して、このページに入力する必要があります。

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

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

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

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

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

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

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

resource "aws_cloudwatch_log_subscription_filter" "datadog_log_subscription_filter" {
  name            = "datadog_log_subscription_filter"
  log_group_name  = <CLOUDWATCH_LOG_GROUP_NAME> # 例: /aws/lambda/my_lambda_name
  destination_arn = <DATADOG_FORWARDER_ARN> # 例: arn:aws:lambda:us-east-1:123:function:datadog-forwarder
  filter_pattern  = ""
}

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

このサンプルコードは、AWS の SAMServerless 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 バケットにトリガーを追加します。
トリガーの追加
  1. バケットを選択して AWS の指示に従います。
Lambda インテグレーション
  1. 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 パラメーターで定義することができます。 また、フィルターオプションを使用して、特定のパターンに一致するログのみを除外または送信することができます。