[アップデート] Amazon CloudWatch LogsがHTTPリクエスト経由でログを取り込めるようになりました
はじめに
おのやんです。
何やら面白そうなアップデートが公開されました。Amazon CloudWatch(以下、CloudWatch) Logsで、HTTP経由のログ取り込みが可能になっています。
これまでCloudWatch Logsへのログ送信は、AWS SDKやCloudWatch Agent、Fluent Bit、FireLensなどのエージェントを利用する方法がメインでした。それが今回のアップデートにより、HTTPリクエストを送信するだけでCloudWatch Logsにログを取り込めるようになっています。
なお、OTLPエンドポイント(/v1/logs)自体は以前からSigV4認証で利用可能でした。CloudWatchのドキュメントとして、OTLPエンドポイントがSigV4認証で記載されています。
弊社でもOTLPエンドポイント経由でCloudWatch Logsにログを発行してみたブログが公開されていますので、合わせてご参照ください。
今回のアップデートでは、HLC、ND-JSON、Structured JSONの3つが追加され、OTLPエンドポイントを含む全エンドポイントで、Bearer Token認証が追加された形です。
これらを経緯を踏まえて、現在利用可能なエンドポイントがこちらです。
| Log type | Endpoint | Content-Type | Format |
|---|---|---|---|
| OpenTelemetry Logs(既存) | https://logs.<region>.amazonaws.com/v1/logs |
application/json or application/x-protobuf |
OTLP JSON or Protobuf |
| HLC Logs(新規) | https://logs.<region>.amazonaws.com/services/collector/event |
application/json |
HLC format |
| ND-JSON Logs(新規) | https://logs.<region>.amazonaws.com/ingest/bulk |
application/json or application/x-ndjson |
Newline-delimited JSON |
| Structured JSON Logs(新規) | https://logs.<region>.amazonaws.com/ingest/json |
application/json |
JSON object or array |
HTTPエンドポイントでは、SigV4認証(IAMクレデンシャルを使用した従来のAWS認証)とBearer Token認証(サービス固有のAPIキーを使用した認証)の二つが利用可能です。
Bearer Token認証を使用する場合、CloudWatchの設定画面からAPIキーを生成します。APIキーの生成時は、CloudWatchの裏側で自動的にIAMユーザーが作成され、CloudWatchLogsAPIKeyAccessマネージドポリシーがアタッチされます。また、各ロググループで個別にbearer token認証を有効化する必要があります。
今回のアップデートで、HTTPリクエストのみでログを送信できるようになった一方で、従来のログ送信エージェントに備わっているようなリトライ処理などはアプリケーション側で実装する必要があります。ネットワークが切断した時のログ欠損リスクなどもあるため、要件に合わせて採用を検討したいところです。
本機能はバージニア(us-east-1)、オハイオ(us-east-2)、カリフォルニア(us-west-1)、オレゴン(us-west-2)でのみ利用可能です。
その他、HTTP Log Collectorに関する仕様はこちらのAWSドキュメントを参考にしてください。
やってみた
ということで、実際にHTTP Log Collectorのエンドポイントにリクエストを送ってCloudWatch Logsのログを発行してみます。今回はバージニアリージョンのAWSアカウント上に、HLCとND-JSONのログを発行する形で検証します。
検証用のCloudWatch Logsロググループ(aws-test-log-group-cloudwatch-http-log-collector)と、CloudWatch Logsログストリーム(aws-test-log-stream-cloudwatch-http-log-collector)を作成します。

次に、CloudWatchコンソール左側のナビゲーションバーから「設定」に移動し、APIキーを作成します。

今回は検証用なので、有効期限を1日に設定して作成します。

表示されたAPI Key名とシークレットをメモしておきます。

ちなみに、裏側ではIAMユーザーが作成されています。

次に、ロググループに対して「ベアラートークン認証の編集」をクリックします。

「はい」を押します。

ベアラートークン認証が有効になりました。

curlを使って、HLCエンドポイントにログを送信します。
$ curl -X POST \
"https://logs.us-east-1.amazonaws.com/services/collector/event" \
-H "Authorization: Bearer <API_KEY_SECRET>" \
-H "Content-Type: application/json" \
-H "x-aws-log-group: aws-test-log-group-cloudwatch-http-log-collector" \
-H "x-aws-log-stream: aws-test-log-stream-cloudwatch-http-log-collector" \
-d '{
"time": 1773821998.413,
"host": "test-server-01",
"source": "/var/log/app.log",
"event": {
"level": "INFO",
"message": "HTTP Log Collector test event",
"request_id": "abc-123"
}
}'
{}
CloudWatchログストリームにHLC形式のログが発行されました。

次に、ND-JSON形式のログイベントを3個送信します。
$ curl -X POST \
"https://logs.us-east-1.amazonaws.com/ingest/bulk" \
-H "Authorization: Bearer <API_KEY_SECRET>" \
-H "Content-Type: application/x-ndjson" \
-H "x-aws-log-group: aws-test-log-group-cloudwatch-http-log-collector" \
-H "x-aws-log-stream: aws-test-log-stream-cloudwatch-http-log-collector" \
-d '{"timestamp": 1773822509381, "level": "INFO", "message": "ND-JSON test event 1"}
{"timestamp": 1773822510381, "level": "WARN", "message": "ND-JSON test event 2"}
{"timestamp": 1773822511381, "level": "ERROR", "message": "ND-JSON test event 3"}'
{}
CloudWatchログストリームにND-JSON形式のログが3個発行されました。

まとめ
CloudWatch Logsで、HTTPリクエストを経由したログ取り込みが可能になりました。エージェントなしでログを取り込めるため、要件にもよりますが、HTTPリクエストで十分なケースではめちゃくちゃ便利ではないでしょうか。
一点、認証方式の選択について触れておきます。EC2インスタンスプロファイルやECSタスクロール、SSMハイブリッドアクティベーションなどが使える環境であれば、SigV4 + AWS認証で一時認証情報を利用するのがセキュアです。
一方で、AWS外の環境でSSMエージェントも導入しづらいケースでは、これまでIAMアクセスキーを払い出すしかありませんでした。IAMアクセスキーには有効期限がないため、漏洩時のリスクが大きくなりがちです。その点、今回のAPIキーは有効期限が組み込みで、スコープもCloudWatch Logsへの送信に限定されるため、漏洩時の被害を限定しやすいのが嬉しいです。
特にCloudWatch Logsのログ取り込み料金は予想外に高額になるケースがあるため、認証情報が漏れて大量のログを発行されて金銭被害に遭うなどないよう、要件に合った認証方式を選択したいですね。では!






