CloudWatch LogsからS3にエクスポートする際に注意すべきこと

初めに

CloudWatch Logsを使って、EC2インスタンス、Lambda実行状況及びその他のログファイルの監視、保存、アクセスすることができます。なお、ログ長期保管する場合、AWS S3を利用することが多いでしょう。CloudWatch LogsもS3にエクスポートする機能を提供しています。今回はCloudWatch LogsからS3にエクスポートする際に注意すべきことをご紹介します。

S3にエクスポートする方法

1.コンソールを使用してS3へエクスポート

コンソール上からの操作は簡単で、エクスポートしたいロググループまたはログストリームを選択し、数クリックでエクスポートできます。もちろん、エクスポートする前に、IAMユーザとS3のアクセス制限を設定する必要があります。

2.Export APIを利用してエクスポート

コンソール上からログエクスポートするには簡単ですが、普段Lambdaなどを使って定時的にエクスポートすることは多いでしょうか。AWSから結構便利なBoto3ライブラリーも提供しています。

[create_export_task](CloudWatchLogs — Boto3 Docs 1.17.61 documentation (amazonaws.com))

response = client.create_export_task(
    taskName='string',
    logGroupName='string',
    logStreamNamePrefix='string',
    fromTime=123,
    to=123,
    destination='string',
    destinationPrefix='string'
)

CloudWatch Logsエクスポート時の注意点

1.同一アカウントは、一度に1つのアクティブなエクスポートタスクのみを持つことができます

create_export_task APIの説明に、以下の解釈があります。

This is an asynchronous call. If all the required information is provided, this operation initiates an export task and responds with the ID of the task. After the task has started, you can use DescribeExportTasks to get the status of the export task. Each account can only have one active (RUNNING or PENDING ) export task at a time. To cancel an export task, use CancelExportTask .

同一アカウントは、一度に1つのアクティブなエクスポートタスクのみを持つことができます。なので、複数CloudWatch Logsグループが作成されたとしても、一回1個のロググループしかエクスポートできないです。エクスポートする前に、以下のAPIを利用して現在実行中のタスクがあるかをチェックすることは無難でしょう。

describe_export_tasks

実行中のタスクがなければ、エクスポートタスクを作成しましょう

2.CloudWatch Logsストリーム名がリネームされることがあります

CloudWatch Logsの仕様で指定したS3のプレフィクスの下に、タスクIDが作成される後、ログストリームが出力されます。ただし、場合によって、S3に出力される時にリネームされることがあります。

筆者では、/-に書き換えることがわかりました。

特に公式ドキュメントから上記みたいな置き換える仕様が見当たりませんでしたが、/はS3に出力されるフォルダ構成になりますので何となく理解できます。また、オブジェクトキーに推奨していない特殊記号についてログストリーム名にも避けたほうが良いでしょう。

オブジェクトキー名の作成

特殊な処理を必要とする可能性がある文字

キー名で以下の文字を使用すると、追加のコード処理が必要になる場合があり、16 進数として URL エンコードまたは参照することが必要になる可能性があります。これらの文字の一部は表示不可能な文字であり、ブラウザで処理されない場合があります。この場合も、特殊な処理が必要です。

  • アンパサンド ("&")
  • ドル記号 ("$")
  • 16 進数の 00~1F (10 進数の 0~31) の範囲および 7F (10 進数の 127) の ASCII 文字
  • アットマーク ("@")
  • 等号 ("=")
  • セミコロン (";")
  • コロン (":")
  • プラス記号 ("+")
  • スペース – いくつかの用途 (特に複数のスペース) では、スペースの重要なシーケンスが失われる可能性があります。
  • カンマ (",")
  • 疑問符 ("?")

使用しない方がよい文字

すべてのアプリケーションで一貫性を維持するには相当な量の特殊な処理が必要になるため、キー名には以下の文字を使用しないでください。

  • バックスラッシュ ("\")
  • 左中括弧 ("{")
  • 表示不可能な ASCII 文字 (10 進数の 128 ~ 255 の文字)
  • カレット ("^")
  • 右中括弧 ("}")
  • パーセント記号 ("%")
  • アクサングラーブ/バックティック ("`")
  • 右角括弧 ("]")
  • 引用符
  • 大なり記号 (">")
  • 左角括弧 ("[")
  • チルダ ("~")
  • 小なり記号 ("- シャープ記号 ("#")
  • 縦棒/パイプ ("|")

纏め

CloudWatch Logsが便利な機能ですが、長期保管でS3に出力するために、S3のオブジェクトキー仕様を注意する必要があります。オブジェクトキー名にサポートしない/推奨しない記号はログストリーム名にも含めない設計にするが必要です。

Last modified: 2021-04-30

Author