[アップデート] CloudWatch Logs からついに ListLogGroups API が登場しました
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
いつものように AWS の API 変更をみていると、新しく ListLogGroups API が登場したようです。
Changes This release adds a new API "ListLogGroups" and an improvement in API "DescribeLogGroups"
ListLogGroups
ListLogGroups API は、文字通りロググループの一覧を取得する API です。
今まで、なぜか CloudWatch Logs では ListLogGroups API が提供されておらず、ロググループ一覧を取得したいケースでは DescribeLogGroups API を利用する必要がありました。
DescribeLogGroups の Response Syntax
DescribeLogGroups の Response Syntax は以下のとおりで、Describe 系の API のため、情報量(データ量)が多い結果が返ってきました。そのため、出力結果をもとに並列/並行で処理を捌くような際には、メモリに乗っかるかを意識する必要がありました。
{
"logGroups": [
{
"arn": "string",
"creationTime": number,
"dataProtectionStatus": "string",
"inheritedProperties": [ "string" ],
"kmsKeyId": "string",
"logGroupArn": "string",
"logGroupClass": "string",
"logGroupName": "string",
"metricFilterCount": number,
"retentionInDays": number,
"storedBytes": number
}
],
"nextToken": "string"
}
ListLogGroups の Response Syntax
今回新しく登場した ListLogGroups の Response Syntax は以下のとおりです。
データ量もコンパクトで、ロググループ一覧を知りたいことにフォーカスできていますね。
{
"logGroups": [
{
"logGroupArn": "string",
"logGroupClass": "string",
"logGroupName": "string"
}
],
"nextToken": "string"
}
paginators は非対応
今回の ListLogGroups は paginators は非対応でした。
>>> import boto3
>>> client = boto3.client('logs')
>>> response = client.can_paginate('list_log_groups')
>>> print(response)
False
ちなみにデフォルトでは 50 件、ロググループが返ってくるようです。
This operation is paginated. By default, your first use of this operation returns 50 results, and includes a token to use in a subsequent operation to return more results.
そのため、NextToken を利用して、別途自前でページネーション処理を実装する必要があります。
import boto3
from botocore.exceptions import BotoCoreError, ClientError
def list_all_log_groups(region_name=None):
"""
CloudWatch Logsの全ロググループ名をリストで返す
"""
try:
client = boto3.client('logs', region_name=region_name)
log_groups = []
params = {}
while True:
response = client.describe_log_groups(**params)
log_groups.extend(response.get('logGroups', []))
next_token = response.get('NextToken')
if not next_token:
break
params['NextToken'] = next_token
return [lg['logGroupName'] for lg in log_groups]
except (BotoCoreError, ClientError) as e:
print(f"Error: {e}")
return []
if __name__ == "__main__":
log_group_names = list_all_log_groups()
print(f"Total log groups: {len(log_group_names)}")
for name in log_group_names:
print(name)
まとめ
以上、非常にコンパクトなブログですが、ListLogGroups API が登場しました。
細かいですが、地味に嬉しいアップデートだと思います。(私も最近この辺りを調べていたため助かりました。)
クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!