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 ポリシーを作成します。これは、Security ハブのベストプラクティスと一致しないことが知られています。この権限が使用される理由は、Lambda 関数を設定するために KMS で暗号化された S3 バケットからオブジェクトを復号するためで、どの KMS キーが S3 バケットの暗号化に使用されているかは予測できません。インストーラーが正常に終了したら、この権限を安全に削除することができます。

トリガーの設定

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

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

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

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

ソース場所
API ゲートウェイのアクセスログCloudWatch
API ゲートウェイの実行ログCloudWatch
アプリケーション ELB アクセスログS3
クラシック ELB アクセスログS3
CloudFront のアクセスログS3
Lambda ログCloudWatch
Redshift ログS3
S3 アクセスログS3
  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
    すべてのロードバランサーを一覧表示します。
    elasticloadbalancing:
    DescribeLoadBalancerAttributes
    ELB アクセスログを含む S3 バケットの名前を取得します。
    lambda:List*すべての Lambda 関数を一覧表示します。
    lambda:GetPolicyトリガーが解除された際に Lambda ポリシーを取得します。
    redshift:DescribeClustersすべての Redshift クラスターを一覧表示します。
    redshift:DescribeLoggingStatusRedshift ログを含む S3 バケットの名前を取得します。
    s3:GetBucketLoggingS3 アクセスログを含む S3 バケットの名前を取得します。
    s3:GetBucketLocationS3 アクセスログを含む S3 バケットのリージョンを取得します。
    s3:GetBucketNotification既存の Lambda トリガーコンフィギュレーションを取得します。
    s3:ListAllMyBucketsすべての S3 バケットを一覧表示します。
    s3:PutBucketNotificationS3 バケットのイベントに基づいて Lambda トリガーを追加または削除します。
    logs:PutSubscriptionFilterCloudWatch ログのイベントに基づいて Lambda トリガーを追加します。
    logs:DeleteSubscriptionFilterCloudWatch ログのイベントに基づいて Lambda トリガーを削除します。
    logs:DescribeSubscriptionFilters特定のロググループのサブスクリプションフィルターを一覧表示します。
  3. AWS インテグレーションタイルで _Collect Logs _ タブに移動します。

  4. ログを収集する必要がある AWS アカウントを選択し、前のセクションで作成された Lambda の ARN を入力します。

    Lambda を入力

  5. ログを収集するサービスを選択し、保存をクリックします。特定のサービスからのログの収集を停止するには、チェックを外します。

    サービスを選択

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

  7. すべての AWS ログの収集を停止するには、各 Lambda ARN の隣にある x を押します。その関数のすべてのトリガーが削除されます。

  8. この初期のセットアップから数分以内に、AWS ログがほぼリアルタイムで Datadog log explorer ページに表示されるようになります。

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

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

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

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

AWS サービスAWS サービス ログを有効にするAWS ログを Datadog に送信する
API GatewayAWS API Gateway ログを有効にする手動ログコレクション
CloudfrontAWS Cloudfront ログを有効にする手動および自動ログコレクション
CloudtrailAWS Cloudtrail ログを有効にする手動ログコレクション
DynamoDBAWS DynamoDB ログを有効にする手動ログコレクション
EC2-Datadog Agent を使用してログを Datadog に送信します
ECS-docker Agent を使用してログを収集します
Elastic Load Balancing (ELB)AWS ELB ログを有効にする手動および自動ログコレクション
Lambda-手動および自動ログコレクション
RDSAWS RDS ログを有効にします手動ログコレクション
Route 53AWS Route 53 ログを有効にする手動ログコレクション
S3AWS S3 ログを有効にする手動および自動ログコレクション
SNS「SNS ログ」はありません。SNS サービスに送信されるログとイベントを処理します。手動ログコレクション
RedShiftAWS Redshift ログを有効にします手動および自動ログコレクション
VPCAWS VPC ログを有効にする手動ログコレクション

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

Lambda 関数から送信されるログからメールや IP アドレスをスクラブしたり、カスタムスクラブルールを Lambda パラメーターで定義することができます。 また、フィルターオプションを使用して、特定のパターンに一致するログのみを除外または送信することができます。