[アップデート]CloudWatch Logsでアカウントレベルのサブスクリプションフィルターがサポートされました

2024.01.15

こんにちは、岩城です。

先日、以下のアップデートがありましたので紹介します。

忙しい人向けまとめ

  • サブスクリプションフィルターは、CloudWatch Logsのロググループから特定の文字列を検出し、以下のサービスにログ転送する機能
    • Kinesis Data Stream
    • Lambda
    • Kinesis Data Firehoseにログ
  • これまではCloudWatch Logsのロググループ単位でサブスクリプションフィルターを設定していた
  • ロググループを横断して同じフィルターパターンでログ転送したい場合に、ロググループごとに設定する必要があった
  • 本アップデートにより、アカウントレベルでサブスクリプションフィルターを設定でき、単一のフィルターで複数のロググループからログ転送可能となった
  • アカウントレベルのサブスクリプションフィルターは、既存含めすべてのロググループが対象となる
  • 特定のロググループをアカウントレベルのサブスクリプションフィルターから除外可能
  • AWS CLI v2で設定する場合は、2.15.10以上にアップデートが必要

やってみた

公式ドキュメントに設定方法が記載されていますので、基本的にドキュメントのとおり設定していきます。

個人的に簡単に検証できそうだと感じたKinesis Data Firehoseにログ転送するようにアカウントレベルのサブスクリプションフィルターを設定します。

Example 3: Subscription filters with Amazon Kinesis Data Firehose

S3バケット、Kinesis Data Firehose、IAMロールについては、特筆すべき点がないので割愛します。

サブスクリプションフィルターの設定

aws logs put-account-policyで設定しますが、ここで注意が必要です。

特定のロググループをアカウントレベルのサブスクリプションフィルターの対象から除外するselection-criteriaが、アップデートされた当日のAWS CLI v2最新バージョン(2.15.8)ではサポートされていませんでした。

今朝(2024.01.15)確認したところ、2.15.10にアップデート可能となっており、このバージョンであれば、selection-criteriaがサポートされています。

このため、まずはAWS CLI v2を最新バージョンにアップデートしてください。

以下のようなパラメーターで設定します。

aws logs put-account-policy \
    --policy-name "20240112_blog_subscription_filter_policy" \
    --policy-type "SUBSCRIPTION_FILTER_POLICY" \
    --policy-document '{"RoleArn": "arn:aws:iam::XXXXXXXXXXXX:role/20240112_blog_cwl_to_firehose_role", "DestinationArn": "arn:aws:firehose:ap-northeast-1:XXXXXXXXXXXX:deliverystream/20240112_blog_delivery_stream", "FilterPattern": "Test", "Distribution": "Random"}' \
    --selection-criteria 'LogGroupName NOT IN ["LogGroupToExclude1","LogGroupToExclude2"]' \
    --scope "ALL" \

パラメーターのポイントを押さえておくと以下のような感じです。

  • policy-documentにて、CloudWatch LogsからKinesis Data Firehoseにログ転送するストリームと権限、CloudWatch Logsのログストリーム内で出力されるTestをログ転送対象のイベントとして指定
  • selection-criteriaにて、アカウントレベルのサブスクリプションフィルターの対象外となるロググループ名を指定

検証

サブスクリプションフィルターが設定されたので以下のようなロググループとログストリームを作成しました。

ロググループ ログストリーム 用途
LogGroup LogGroup_LogStream ログ転送対象
LogGroup2 LogGroup2_LogStream ログ転送対象
LogGroupToExclude1 LogGroupToExclude1_LogStream ログ転送対象外
LogGroupToExclude2 LogGroupToExclude2_LogStream ログ転送対象外

ログイベントはマネジメントコンソールから簡単に作成できるので、Test TestTest Test1 testのイベントを作成し、Kinesis Data Firehoseの出力先であるS3バケットにログ転送されるか確認しました。

testを除きTestが含まれた3イベントがログ転送されていることを確認できました。また、対象外としたLogGroupToExclude1LogGroupToExclude2のロググループのイベントは転送されず、LogGroupLogGroup2から転送されていることも確認できました。

以下は転送されたログイベントの例です。

{
  "messageType": "DATA_MESSAGE",
  "owner": "XXXXXXXXXXXX",
  "logGroup": "LogGroup,
  "logStream": "LogGroup_LogStream",
  "subscriptionFilters": [
    "20240112_blog_subscription_filter_policy"
  ],
  "logEvents": [
    {

<blockquote>
      "id": "38029474538028272237282630734261007489162212094834180096",
      "timestamp</blockquote>

": 1705300616615,
      "message": "Test"
    }
  ],
  "policyLevel": "ACCOUNT_LEVEL_POLICY"
}

サブスクリプションフィルターでログ転送した際に付与されるキーに"policyLevel": "ACCOUNT_LEVEL_POLICY"が追加されていることも確認できました。

おわりに

実は検証中aws logs put-account-policyを実行した際、以下のようなエラーメッセージが出力され、サブスクリプションフィルターを設定できずに躓いていました。

An error occurred (InvalidParameterException) when calling the PutAccountPolicy operation: Could not deliver test message to specified Firehose stream. Unable to unmarshall exception response with the unmarshallers provided

このエラーメッセージからはイメージできませんが、私の場合IAMロールに設定するポリシーをap-northeast-1にすべきところをregionであったことによるポリシーエラーが原因でした。

公式ドキュメントをコピペする際、実行リージョンに置き換え忘れの無いようご注意ください。

本エントリが、どなたかのお役に立てれば幸いです。