【小ネタ】CloudWatch Logs の AWS CLI コマンドの --filter-pattern オプションでハイフンで始まる値を指定する方法
困っていた内容
CloudWatch Logs の AWS CLI のオプション --filter-pattern で、ハイフンで始まる除外条件(例: -INFO)を指定したいです。
--filter-pattern "-INFO" のように記述すると、AWS CLI がハイフンで始まる値をコマンドオプションとして解釈し、expected one argument エラーが発生します。
$ aws logs filter-log-events \
--log-group-name /test \
--log-stream-names test-stream \
--filter-pattern "-INFO"
aws: [ERROR]: An error occurred (ParamValidation): argument --filter-pattern: expected one argument
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:
aws help
aws <command> help
aws <command> <subcommand> help
どう対応すればいいの?
--filter-pattern="-INFO" のように、オプション名と値を = で繋げて指定してください。
--filter-pattern="-INFO"
なぜスペース区切りだとエラーになるのか
--filter-pattern "-INFO" のようにスペースで区切ると、AWS CLI はハイフンで始まる -INFO を別のオプション名として解釈しようとしてエラーになります。
一方、= で繋ぐとその右側全体が「そのオプションの値」として扱われるため、値がハイフンで始まっていてもオプションとして解釈されません。
この = 記法は AWS CLI の公式ドキュメントに記載されています。
引数を使用する各オプションには、オプション名から引数を分離するスペースまたは等号 (=) が必要です。
オプションとして、パラメータ名と値をスペースの代わりに等号 = で区切ることができます。通常、これはパラメータの値がハイフンで始まる場合にのみ必要です。
$ aws ec2 delete-key-pair --key-name=-mykey
設定例
aws logs filter-log-events \
--log-group-name /your-log-group \
--filter-pattern="-INFO"
別解: 全マッチ条件と組み合わせる方法
" " -INFO のように、全マッチ条件(" ")と除外条件を組み合わせる方法でも動作します。この場合、フィルターパターン内のダブルクォーテーションをエスケープします。
--filter-pattern "\" \" -INFO"
公式ドキュメント の「Include and exclude terms」の例では、除外条件(-)は他のマッチ条件と組み合わせて使用する形で記載されています。ただし、検証の結果 -INFO 単独でも除外フィルターとして機能することを確認しています。
GUI から設定する場合
マネジメントコンソールから設定する場合は = 記法やエスケープは不要です。フィルターパターン入力欄に以下をそのまま入力してください。
-INFO
注意事項
- この
=記法は--filter-patternに限らず、AWS CLI の全オプションで使用できます
やってみた
filter-log-events コマンドを使って、フィルターパターンの動作を確認します。
1. テスト用のロググループとログストリームを作成
aws logs create-log-group --log-group-name /test
aws logs create-log-stream --log-group-name /test --log-stream-name test-stream
2. テストログを投入
ERROR、INFO、WARN を含むログイベントを投入します。
TIMESTAMP=$(date +%s000)
aws logs put-log-events \
--log-group-name /test \
--log-stream-name test-stream \
--log-events \
"[{\"timestamp\":${TIMESTAMP},\"message\":\"[ERROR] something went wrong\"},{\"timestamp\":$((TIMESTAMP+1)),\"message\":\"[INFO] application started\"},{\"timestamp\":$((TIMESTAMP+2)),\"message\":\"[WARN] connection timeout\"}]"
3. いったん全件取得テストをする
aws logs filter-log-events \
--log-group-name /test \
--log-stream-names test-stream
{
"events": [
{
"logStreamName": "test-stream",
"timestamp": 1782958999000,
"message": "[ERROR] something went wrong",
"ingestionTime": 1782959002294,
"eventId": "39761314336126216109434224747335139860999758272121864192"
},
{
"logStreamName": "test-stream",
"timestamp": 1782958999001,
"message": "[INFO] application started",
"ingestionTime": 1782959002294,
"eventId": "39761314336148516854632755370476675579272406633627844609"
},
{
"logStreamName": "test-stream",
"timestamp": 1782958999002,
"message": "[WARN] connection timeout",
"ingestionTime": 1782959002294,
"eventId": "39761314336170817599831285993618211297545054995133825026"
}
],
"searchedLogStreams": []
}
4. 除外フィルターを適用して確認
aws logs filter-log-events \
--log-group-name /test \
--log-stream-names test-stream \
--filter-pattern="-INFO"
{
"events": [
{
"logStreamName": "test-stream",
"timestamp": 1782958999000,
"message": "[ERROR] something went wrong",
"ingestionTime": 1782959002294,
"eventId": "39761314336126216109434224747335139860999758272121864192"
},
{
"logStreamName": "test-stream",
"timestamp": 1782958999002,
"message": "[WARN] connection timeout",
"ingestionTime": 1782959002294,
"eventId": "39761314336170817599831285993618211297545054995133825026"
}
],
"searchedLogStreams": []
}
INFO を含むログが除外され、ERROR と WARN のみが返却されることを確認できました。
参考情報
- Command line options - AWS CLI User Guide
- オプションと値の区切りにスペースまたは
=が使用可能
- オプションと値の区切りにスペースまたは
- Using quotation marks and literals with strings in the AWS CLI
- オプションとして、パラメータ名と値をスペースの代わりに等号 = で区切ることができる。これはパラメータの値がハイフンで始まる場合に必要との記載あり。
- Filter pattern syntax - Amazon CloudWatch Logs
- 「Example: Match everything」—
" "で全イベントにマッチ - 「Example: Include and exclude terms」—
-で除外条件を指定
- 「Example: Match everything」—




