使用 Boto3 批量删除 Cloudwatch 日志组 - delete_log_group

The*_*eth 3 python json amazon-web-services amazon-cloudwatch boto3

我有一个相当长的 Cloudwatch 日志组列表,需要删除......大概有近一百个。因为你必须一次删除它们,所以我想一个小小的 python 脚本可以帮助我,但现在我卡住了。

到目前为止,这是我的脚本...

import boto3
from botocore.exceptions import ClientError
import json

#Connect to AWS using default AWS credentials in awscli config
cwlogs = boto3.client('logs')

loglist = cwlogs.describe_log_groups(
    logGroupNamePrefix='/aws/lambda/staging-east1-'
)

#writes json output to file...
with open('loglist.json', 'w') as outfile:
    json.dump(loglist, outfile, ensure_ascii=False, indent=4, 
sort_keys=True)

#Opens file and searches through to find given loggroup name
with open("loglist.json") as f:
    file_parsed = json.load(f)

for i in file_parsed['logGroups']:
    print i['logGroupName']


#   cwlogs.delete_log_group(
#       logGroupName='string'   <---here is where im stuck
#   )
Run Code Online (Sandbox Code Playgroud)

如何获取 i 中“logGroupName”的值并将其转换为一个字符串,delete_log_group 命令可以使用该字符串并迭代以删除我需要删除的所有日志组?我尝试使用 json.loads 并出现以下错误...

回溯(最近一次调用最后一次):文件“CWLogCleaner.py”,第 18 行,在 file_parsed = json.loads(f) 文件“/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/ 2.7/lib/python2.7/json/ init .py”,第 339 行,加载中返回 _default_decoder.decode(s) 文件“/usr/local/Cellar/python/2.7.12/Frameworks/Python.framework/Versions/ 2.7/lib/python2.7/json/decoder.py”,第 364 行,在解码 obj 中,end = self.raw_decode(s, idx=_w(s, 0).end())

或者我完全以错误的方式处理这件事?

TIA

jar*_*mod 6

除非您出于其他目的特别需要将 JSON 响应保存到磁盘,否则您可以简单地使用此代码的某些变体:

import boto3

def delete_log_streams(prefix=None):
    """Delete CloudWatch Logs log streams with given prefix or all."""
    next_token = None
    logs = boto3.client('logs')

    if prefix:
        log_groups = logs.describe_log_groups(logGroupNamePrefix=prefix)
    else:
        log_groups = logs.describe_log_groups()

    for log_group in log_groups['logGroups']:
        log_group_name = log_group['logGroupName']
        print("Delete log group:", log_group_name)

        while True:
            if next_token:
                log_streams = logs.describe_log_streams(logGroupName=log_group_name,
                                                        nextToken=next_token)
            else:
                log_streams = logs.describe_log_streams(logGroupName=log_group_name)

            next_token = log_streams.get('nextToken', None)

            for stream in log_streams['logStreams']:
                log_stream_name = stream['logStreamName']
                print("Delete log stream:", log_stream_name)
                logs.delete_log_stream(logGroupName=log_group_name, logStreamName=log_stream_name)
                # delete_log_stream(log_group_name, log_stream_name, logs)

            if not next_token or len(log_streams['logStreams']) == 0:
                break
Run Code Online (Sandbox Code Playgroud)