如何用CSV项目ID作为变量批量执行gcloud日志查询命令
批量查询GCP项目创建者并导出CSV
前提说明
你提到的单项目查询命令依赖GCP审计日志(默认保留400天),超过400天的项目无法通过该方式获取创建者,以下方案会将这类情况标记为N/A。
方案1:Shell脚本(适合熟悉命令行的用户)
假设你的输入CSV文件名为projects.csv,格式为第一行表头PROJECT_ID,PROJECT_NAME,后续每行对应项目ID和名称。
步骤:
- 创建并保存以下脚本为
get_project_creators.sh:
#!/bin/bash # 初始化输出CSV,写入表头 echo "PROJECT_ID,PROJECT_NAME,CREATOR_EMAIL" > project_creators.csv # 跳过输入CSV的表头行,循环处理每个项目 tail -n +2 projects.csv | while IFS=, read -r project_id project_name do # 执行审计日志查询,捕获创建者邮箱,错误输出重定向到/dev/null creator=$(gcloud logging read "resource.type=gce_project AND protoPayload.methodName=CreateProject" \ --project="$project_id" \ --format="value(protoPayload.authentication.principalEmail)" 2>/dev/null) # 处理空结果或查询失败的情况 if [ -z "$creator" ]; then creator="N/A" fi # 写入结果到输出CSV(用引号包裹字段,避免特殊字符干扰) echo "\"$project_id\",\"$project_name\",\"$creator\"" >> project_creators.csv # 打印进度,方便跟踪处理状态 echo "已处理项目: $project_id" done
- 给脚本添加执行权限:
chmod +x get_project_creators.sh
- 在命令行执行脚本:
./get_project_creators.sh
方案2:Python脚本(适合处理含特殊字符的CSV)
如果你的项目名称包含逗号、引号等特殊字符,Python的csv模块能更可靠地处理这类情况。
步骤:
- 创建并保存以下脚本为
get_project_creators.py:
import csv import subprocess # 定义输入输出文件路径 INPUT_CSV = "projects.csv" OUTPUT_CSV = "project_creators.csv" # 读取输入CSV,写入结果到输出CSV with open(INPUT_CSV, mode='r', newline='', encoding='utf-8') as infile, \ open(OUTPUT_CSV, mode='w', newline='', encoding='utf-8') as outfile: # 用字典读取输入CSV,自动匹配表头 csv_reader = csv.DictReader(infile) # 定义输出CSV的表头 csv_writer = csv.DictWriter(outfile, fieldnames=['PROJECT_ID', 'PROJECT_NAME', 'CREATOR_EMAIL']) csv_writer.writeheader() for row in csv_reader: project_id = row['PROJECT_ID'] project_name = row['PROJECT_NAME'] # 构建gcloud查询命令 gcloud_cmd = [ 'gcloud', 'logging', 'read', 'resource.type=gce_project AND protoPayload.methodName=CreateProject', '--project', project_id, '--format', 'value(protoPayload.authentication.principalEmail)' ] try: # 执行命令,捕获标准输出 result = subprocess.run(gcloud_cmd, capture_output=True, text=True, check=True) creator_email = result.stdout.strip() if result.stdout.strip() else "N/A" except subprocess.CalledProcessError: # 处理命令执行失败的情况(如无权限、项目不存在) creator_email = "N/A" # 写入当前项目的结果 csv_writer.writerow({ 'PROJECT_ID': project_id, 'PROJECT_NAME': project_name, 'CREATOR_EMAIL': creator_email }) print(f"已处理项目: {project_id}")
- 在命令行执行脚本:
python3 get_project_creators.py
注意事项
- 确保已通过
gcloud auth login完成身份验证,且账号拥有logging.logEntries.list权限以及所有项目的查看权限。 - 输出结果会保存在
project_creators.csv文件中,包含项目ID、名称和创建者邮箱(无结果则为N/A)。 - 若输入CSV的表头不是
PROJECT_ID和PROJECT_NAME,需修改脚本中对应的字段名。
内容的提问来源于stack exchange,提问作者Scott E.
相关产品推荐
相关产品推荐

