create-export-taskで特定のログストリームだけエクスポートしたい
create-export-task APIで特定のログストリームだけエクスポートする方法を調べました。
docs.aws.amazon.com
モチベーション
AWS CLIからcreate-export-task APIを叩くと、CloudWatch Logsの特定のログストリームのログ を取ることができる記事を書きました。
tasotasoso.hatenablog.com
ただ、システムの設計によっては、一つのロググループに全てのログを突っ込んで、ログストリーム名でログ種別を区別しているかもしれません。
そのため、ログストリーム単位で取る方法も知りたいなということで調べました。
ログストリームごとに取る方法
--log-stream-name-prefix
例として、my-log-streamという名前のログストリームを考えます。
ログストリーム名を指定する。
プレフィクスをエクスポート対象のログストリーム名に一致させることで可能です。
aws logs create-export-task (略) --log-stream-name-prefix my-log-stream
ログストリームのプレフィクスを指定する
--log-stream-name-prefix にエクスポート対象のログストリームに含まれるプレフィクスを指定することで可能です。
aws logs create-export-task (略) --log-stream-name-prefix my-log
ログストリームを後方一致させる
例えば、以下のような指定で"stream"がログストリーム名の最後にくるログストリームだけをエクスポートしたい場合です。
aws logs create-export-task (略) --log-stream-name-prefix *stream
こちらは、残念ながら無理そうでした。悲しい。
Create-Export-taskのAPIドキュメントをみると、
logStreamNamePrefix
Export only log streams that match the provided prefix. If you don't specify a value, no prefix filter is applied.Type: String
Length Constraints: Minimum length of 1. Maximum length of 512.
Pattern: [^:*]*
Required: No
CreateExportTask - Amazon CloudWatch Logs
ということで、残念ながらワイルドカードは使用不可のようです。
cliで試してみると、以下のように怒られます。
An error occurred (InvalidParameterException) when calling the CreateExportTask operation: 1 validation error detected: Value '*stream' at 'logStreamNamePrefix' failed to satisfy constraint: Member must satisfy regular expression pattern: [^:*]*
また、.+などでなんとかならないかと試してみましたが、.や+なども普通の文字として取られるようでダメでした。(もし、やり方をご存知の方は教えてください。。。)
後方一致の代替策
describe-log-streams APIであるロググループ内にあるログストリームの一覧を取ることができます。
ログストリーム名を取得して、目的にあったログストリーム名ごとにcreate-export-taskを作るのが良さそうです。
docs.aws.amazon.com
ちなみに、返却されたjsonには、creationTimeやなどいろいろ情報が入っているので、使い道がありそうです。
#From https://docs.aws.amazon.com/cli/latest/reference/logs/describe-log-streams.html { "logStreams": [ { "creationTime": 1433189871774, "arn": "arn:aws:logs:us-west-2:0123456789012:log-group:my-logs:log-stream:20150531", "logStreamName": "20150531", "storedBytes": 0 }, { "creationTime": 1433189873898, "arn": "arn:aws:logs:us-west-2:0123456789012:log-group:my-logs:log-stream:20150601", "logStreamName": "20150601", "storedBytes": 0 } ] }
参考
github.com
今回のAPIとは違いますが、CloudWatch Logsのログをfluentdのpluginで読み出す際に、ログストリームはワイルドカードで指定できないというIssueです。共通の悩みのようです。
docs.aws.amazon.com
いろいろ実験して、不発に終わったcreate-export-taskがどうなってるのか心配だったので、taskの一覧を表示させるのに使えます。