Load Balancer 唯讀匯出指令說明
更新日期:2026-07-27
這份指令要做什麼
把 AWS Load Balancer 目前的設定讀出來,存成本機 JSON,作為 production/staging 路由盤點證據。
確認 AWS 身分
→ 找到指定 ALB
→ 取得 listeners
→ 取得 target groups
→ 取得 attributes
→ 取得 listener rules
→ 取得每個 target group 的健康狀態這些 describe-* 指令不會修改 AWS,但 mkdir 和 > 會建立或覆蓋本機檔案。
執行前準備
需要:
- AWS CLI。
jq。- 具有 ELB/S3/CloudWatch read 權限的 AWS profile。
- 正確的 AWS account、region 與 ALB name。
profile 名稱包含 read-only 不代表真的唯讀;實際權限仍由 IAM role/policy 決定。
先列出本機 profile:
aws configure list-profiles設定要使用的 profile 後,確認 AWS 身分:
export MIG_AWS_PROFILE='<read-only-profile>'
aws sts get-caller-identity \
--profile "$MIG_AWS_PROFILE"確認輸出的 AWS Account ID 與 IAM ARN 正確後再繼續。
一、設定環境變數
export MIG_AWS_REGION='ap-northeast-1'
export MIG_ENVIRONMENT='production'
export MIG_ALB_NAME='<production-alb-name>'
export MIG_EVIDENCE_DIR="./evidence/$(date +%F)/${MIG_ENVIRONMENT}"| 變數 | 用途 |
|---|---|
MIG_AWS_PROFILE | 決定 AWS credentials/account/role |
MIG_AWS_REGION | ALB 所在 region;東京通常是 ap-northeast-1,仍需實際確認 |
MIG_ENVIRONMENT | 只控制輸出資料夾名稱,不會自動切換 AWS 環境 |
MIG_ALB_NAME | AWS 裡的 Load Balancer name,不是 API 網址 |
MIG_EVIDENCE_DIR | JSON 要存放的本機資料夾 |
最重要的判斷:
實際查到哪個環境
= AWS profile/account + region + ALB nameMIG_ENVIRONMENT='production' 只是一段資料夾標籤。
二、建立本機輸出資料夾
mkdir -p "$MIG_EVIDENCE_DIR"假設今天是 2026-07-27,會建立:
./evidence/2026-07-27/production/./evidence 是相對於目前 Terminal 所在位置。可以先用 pwd 確認。
三、匯出 ALB 基本資料
aws --profile "$MIG_AWS_PROFILE" --region "$MIG_AWS_REGION" \
elbv2 describe-load-balancers \
--names "$MIG_ALB_NAME" \
> "$MIG_EVIDENCE_DIR/load-balancer.json"用途:
- 找出指定 ALB。
- 保存 ALB ARN、DNS、VPC、AZ、security groups 與狀態。
>會覆蓋同名本機檔案。
確認結果:
jq '.LoadBalancers[] | {
name: .LoadBalancerName,
arn: .LoadBalancerArn,
dns: .DNSName,
state: .State.Code
}' "$MIG_EVIDENCE_DIR/load-balancer.json"如果結果是空的,先檢查 profile、region 與 ALB name,不要繼續。
四、取出 ALB ARN
MIG_ALB_ARN=$(jq -r '.LoadBalancers[0].LoadBalancerArn' \
"$MIG_EVIDENCE_DIR/load-balancer.json")
printf '%s\n' "$MIG_ALB_ARN"jq -r 會從 JSON 取出純文字 ARN,再存入 MIG_ALB_ARN。
如果輸出是空字串或 null,停止並檢查上一個步驟。
五、匯出 Listeners
aws --profile "$MIG_AWS_PROFILE" --region "$MIG_AWS_REGION" \
elbv2 describe-listeners \
--load-balancer-arn "$MIG_ALB_ARN" \
> "$MIG_EVIDENCE_DIR/listeners.json"Listener 是 ALB 的入口,例如 HTTP 80 或 HTTPS 443。這份 JSON 會包含 port、protocol、Listener ARN 與 default action。
列出 listeners:
jq -r '
.Listeners[]
| [.Protocol, .Port, .ListenerArn]
| @tsv
' "$MIG_EVIDENCE_DIR/listeners.json"六、匯出 Target Groups
aws --profile "$MIG_AWS_PROFILE" --region "$MIG_AWS_REGION" \
elbv2 describe-target-groups \
--load-balancer-arn "$MIG_ALB_ARN" \
> "$MIG_EVIDENCE_DIR/target-groups.json"Target group 是 ALB 最後送 request 的機器群組。這裡要辨識哪些是 legacy、哪些是 PHP 8.2。
列出名稱、ARN、port 與 health check:
jq -r '
.TargetGroups[]
| [
.TargetGroupName,
.TargetGroupArn,
.Protocol,
.Port,
.HealthCheckPath
]
| @tsv
' "$MIG_EVIDENCE_DIR/target-groups.json"七、匯出 ALB Attributes
aws --profile "$MIG_AWS_PROFILE" --region "$MIG_AWS_REGION" \
elbv2 describe-load-balancer-attributes \
--load-balancer-arn "$MIG_ALB_ARN" \
> "$MIG_EVIDENCE_DIR/load-balancer-attributes.json"這份資料用來確認:
- ALB access log 是否啟用。
- S3 bucket/prefix。
- Idle timeout。
- Deletion protection 等 ALB 設定。
找 access log 設定:
jq '
.Attributes[]
| select(.Key | startswith("access_logs.s3"))
' "$MIG_EVIDENCE_DIR/load-balancer-attributes.json"八、匯出 HTTPS Listener Rules
先從 listeners.json 找 HTTPS listener:
jq -r '
.Listeners[]
| select(.Protocol == "HTTPS")
| [.Port, .ListenerArn]
| @tsv
' "$MIG_EVIDENCE_DIR/listeners.json"把正確的 ARN 設成變數:
export MIG_LISTENER_ARN='<https-listener-arn>'匯出 routing rules:
aws --profile "$MIG_AWS_PROFILE" --region "$MIG_AWS_REGION" \
elbv2 describe-rules \
--listener-arn "$MIG_LISTENER_ARN" \
> "$MIG_EVIDENCE_DIR/listener-rules.json"這份 JSON 可以回答:
- 規則 priority。
- Host/path/method conditions。
- Request 最後導向哪個 target group。
- 哪一條是 default rule。
ALB 從較小的 priority 數字開始比對,default rule 最後執行。
九、匯出 Target Health
先從 target-groups.json 取得要查的 target group ARN,再逐組執行:
export MIG_TARGET_GROUP_ARN='<target-group-arn>'
aws --profile "$MIG_AWS_PROFILE" --region "$MIG_AWS_REGION" \
elbv2 describe-target-health \
--target-group-arn "$MIG_TARGET_GROUP_ARN" \
> "$MIG_EVIDENCE_DIR/target-health.json"可以確認:
- Instance ID 或 private IP。
- Port 與 Availability Zone。
healthy/unhealthy。- Unhealthy reason。
不同 target group 請使用不同輸出檔名,避免覆蓋:
target-health-legacy.json
target-health-php82.json十、Production 與 Staging 各跑一次
Production 完成後,更換為 staging 的:
- AWS profile/account。
- ALB name。
- 必要時更換 region。
MIG_ENVIRONMENT='staging'。
不要只改 MIG_ENVIRONMENT 就認為已切換到 staging。
最後應得到:
evidence/YYYY-MM-DD/
├── production/
│ ├── load-balancer.json
│ ├── listeners.json
│ ├── target-groups.json
│ ├── load-balancer-attributes.json
│ ├── listener-rules.json
│ └── target-health-*.json
└── staging/
└── 同樣一組 JSON資料保護
原始 JSON 可能包含 ARN、VPC、subnet、security group、內部 IP 與環境結構。
- 不放進共用 git。
- 不貼到公開訊息或 ticket。
- 共用文件只保存去識別化後的摘要。