たそらぼ

日頃思ったこととかメモとか。

create-export-taskで特定のログストリームだけエクスポートしたい

create-export-task APIで特定のログストリームだけエクスポートする方法を調べました。
docs.aws.amazon.com

モチベーション

AWS CLIからcreate-export-task APIを叩くと、CloudWatch Logsの特定のログストリームのログ を取ることができる記事を書きました。
tasotasoso.hatenablog.com

ただ、システムの設計によっては、一つのロググループに全てのログを突っ込んで、ログストリーム名でログ種別を区別しているかもしれません。
そのため、ログストリーム単位で取る方法も知りたいなということで調べました。

f:id:tasotasoso:20200517224113p:plain:w400
やりたいこと

ログストリームごとに取る方法

--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の一覧を表示させるのに使えます。