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_REGIONALB 所在 region;東京通常是 ap-northeast-1,仍需實際確認
MIG_ENVIRONMENT只控制輸出資料夾名稱,不會自動切換 AWS 環境
MIG_ALB_NAMEAWS 裡的 Load Balancer name,不是 API 網址
MIG_EVIDENCE_DIRJSON 要存放的本機資料夾

最重要的判斷:

實際查到哪個環境
= AWS profile/account + region + ALB name

MIG_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。
  • 共用文件只保存去識別化後的摘要。

官方參考