如何用CloudShell按可用区筛选实例以自动化CloudWatch仪表盘创建?
解决方案
1. 按可用区筛选提取EC2实例ID
先用aws ec2 describe-instances命令结合筛选器指定目标可用区,再用jq提取实例ID列表,彻底避免手动复制操作:
# 替换为你的目标可用区,比如us-east-1a TARGET_AZ="us-east-1a" # 获取该AZ下所有运行中的EC2实例ID INSTANCE_IDS=$(aws ec2 describe-instances \ --filters "Name=availability-zone,Values=$TARGET_AZ" "Name=instance-state-name,Values=running" \ --query 'Reservations[].Instances[].InstanceId' \ --output text)
这里额外加入了instance-state-name=running的筛选条件,只抓取运行中的实例,可根据实际需求调整或移除。
2. 循环生成CloudWatch小部件并创建仪表盘
用shell循环遍历实例ID,批量生成指标小部件,最后组合成完整的仪表盘JSON提交到AWS:
# 定义仪表盘名称 DASHBOARD_NAME="EC2-Metrics-by-AZ" # 初始化小部件数组 WIDGETS="[]" # 遍历每个实例ID for INSTANCE_ID in $INSTANCE_IDS; do # 生成单个实例的CPU使用率小部件JSON(可修改指标类型) WIDGET=$(cat <<EOF { "type": "metric", "x": 0, "y": 0, "width": 6, "height": 6, "properties": { "metrics": [ ["AWS/EC2", "CPUUtilization", "InstanceId", "$INSTANCE_ID"] ], "period": 300, "stat": "Average", "title": "$INSTANCE_ID - CPU Utilization" } } EOF ) # 将小部件合并到数组(依赖jq工具,CloudShell默认预装) WIDGETS=$(echo "$WIDGETS" | jq --argjson widget "$WIDGET" '. += [$widget]') done # 构建完整的仪表盘JSON结构 DASHBOARD_JSON=$(cat <<EOF { "widgets": $WIDGETS } EOF ) # 创建或更新CloudWatch仪表盘 aws cloudwatch put-dashboard \ --dashboard-name "$DASHBOARD_NAME" \ --dashboard-body "$DASHBOARD_JSON"
3. 跨账户适配
切换AWS账户时,只需确保当前AWS CLI配置指向目标账户(可通过aws configure switchrole或设置AWS_PROFILE环境变量切换),无需手动修改任何实例ID,脚本会自动拉取目标AZ下的实例数据。
可选调整
- 可修改小部件的指标类型(比如内存使用率、磁盘IO)、布局参数(x/y/width/height)、统计周期等。
- 若需同时处理多个可用区,可嵌套循环遍历AZ列表(比如
TARGET_AZS=("us-east-1a" "us-east-1b"))。
内容的提问来源于stack exchange,提问作者ShellGames
相关产品推荐
相关产品推荐

