跳轉到

EKS Dev 環境部署:AWS 區域選擇、IAM 設定、Secrets 管理與外部 DNS 整合

文檔資訊

  • 分類: architecture
  • 難度: intermediate
  • 預估閱讀時間: 12 分鐘
  • 標籤: EKS, Terraform, AWS, IAM, DNS, GitHub Actions, OIDC, ap-east-2, hostingireland, CI/CD, Secrets Manager, random_password, Kiali, Istio

摘要

部署 MatchRPG dev 環境至 EKS 的完整決策記錄與執行結果:將 AWS 區域從 ap-northeast-1(東京)改為 ap-east-2(台灣),從 root 帳號建立 IAM 使用者(Lotus),使用 hostingireland.ie 管理 DNS,透過 GitHub Actions OIDC 整合 AWS,採用 Terraform random_password + Secrets Manager 自動管理密碼(取代手動 TF_VAR),並為 staging 環境加入 manual approval gate。S3 state bucket 已成功建立,terraform init 在 dev 環境完成初始化,terraform plan 輸出確認所有密碼以 (sensitive value) 呈現。

關鍵學習

  • AWS ap-east-2 是台灣區域,比 ap-northeast-1(東京)更靠近台灣終端用戶,延遲更低

  • 應使用 IAM 使用者(如 Lotus)而非 root 帳號進行日常操作,並建立 User Group 管理權限

  • 密碼管理業界標準:使用 Terraform random_password 自動生成並存入 Secrets Manager,plan 輸出顯示 (sensitive value) 而非明文 — 已經由 terraform plan 實際輸出確認

  • 非 Route 53 的 DNS 供應商(如 hostingireland.ie)仍可使用 ACM,只需手動加 CNAME 驗證記錄

  • GitHub Actions OIDC 整合 AWS 不需要長期存取金鑰,OIDC Provider URL: https://token.actions.githubusercontent.com

  • Staging 環境設定 manual approval,確保 dev 驗證通過後才繼續部署,形成 dev(自動)→ staging(手動確認)→ prod(手動確認)安全流程

  • Terraform 後端 S3 bucket 必須在 apply 前手動 bootstrap 建立

  • AWS credentials 在 Windows 設定於 C:\Users{user}.aws\credentials(即 ~/.aws/credentials)

  • Kiali 確實被包含在 Helm releases 中(helm_release.kiali),並整合 Grafana 和 Prometheus,dev 環境使用 auth.strategy: anonymous

  • 可以透過 aws sts get-caller-identity 確認當前 AWS 身份,避免誤用 root 或舊帳號 credentials

技術細節

基礎設施概覽

專案 MatchRPG 使用 Terraform 管理 EKS 基礎設施,ArgoCD 管理 Kubernetes 應用部署。AWS Account ID: 228170791874區域: ap-east-2(台灣)

密碼管理架構(業界標準實作,已由 terraform plan 輸出確認)

舊做法:手動設定 TF_VAR_aurora_master_passwordTF_VAR_redis_auth_token 環境變數,密碼暴露於 terminal history 中。

新做法(已實作並確認):使用 Terraform random_password resource 自動生成強密碼,存入 AWS Secrets Manager。**terraform plan 實際輸出確認**密碼以 (sensitive value) 呈現,包含:random_password.aurorarandom_password.redisrandom_password.admin_api_keyrandom_password.s2s_api_keyrandom_password.signing_key,以及所有 aws_secretsmanager_secret_version.*secret_string = (sensitive value)

resource "random_password" "aurora" {
  length  = 32
  special = false
}

resource "aws_secretsmanager_secret_version" "database" {
  secret_id     = aws_secretsmanager_secret.database.id
  secret_string = jsonencode({ password = random_password.aurora.result })
}

密碼存放路徑:matchrpg/databasematchrpg/redismatchrpg/appmatchrpg/admin

Terraform Bootstrap 執行結果(已成功)

在 Windows PowerShell 執行 bootstrap,成功建立 S3 state bucket:

bucket_arn    = "arn:aws:s3:::matchrpg-tfstate-dev"
bucket_name   = "matchrpg-tfstate-dev"
bucket_region = "ap-east-2"

S3 bucket 設定:AES256 SSE + Versioning Enabled + Public Access Block,lifecycle 設定 90 天清理舊版本。

Dev 環境 Terraform Init 成功(已確認)

terraform/environments/dev 已成功 init 並執行 plan,providers:aws v5.100.0、kubernetes v2.38.0、helm v2.17.0、tls v4.2.1、random v3.8.1(新增,用於 random_password)

EKS 叢集配置(來自 terraform plan 實際輸出)

  • Cluster: matchrpg-dev,版本 1.29,Node: t3.large(desired: 2, max: 5)
  • Addons: coredns、kube-proxy、vpc-cni、aws-ebs-csi-driver
  • Helm charts(完整清單,已由 plan 確認):ArgoCD (5.51.6)、Argo Rollouts (2.35.0)、Istio base/cni/istiod (1.28.0)、Kiali (2.1.0,整合 Grafana + Prometheus)、Loki (6.24.0)、Tempo、kube-prometheus-stack (65.1.0)、External Secrets (0.9.11)、Cluster Autoscaler (9.37.0)、Prometheus Adapter

DNS 配置(hostingireland.ie)

由於 DNS 供應商非 Route 53,需在 hostingireland.ie 後台手動新增 CNAME 記錄:ACM 驗證記錄 + Wildcard 子網域 *.dev.phantomarcstudio.ie 指向 ALB。所有手動操作步驟已記錄於 runbook。

IAM 設定

建立 IAM User Lotus,加入 User Group 管理權限。Access Key 設定於 Windows C:\Users\user\.aws\credentials。原本帳號中存在舊的無效 credentials(region: us-east-1),已更新為 Lotus 的 Access Key 後 aws sts get-caller-identity 確認成功。

What Changed

區域遷移(已完成並驗證)

所有 Terraform 和 K8s 配置從 ap-northeast-1(東京)改為 ap-east-2(台灣)。terraform plan 實際輸出確認 S3 bucket 名稱已更新(matchrpg-loki-matchrpg-dev-ap-east-2matchrpg-tempo-matchrpg-dev-ap-east-2),IAM policy ARN 也已更新為 ap-east-2。

密碼管理升級(已完成並由 plan 輸出驗證)

由手動設定 TF_VAR 環境變數改為 Terraform random_password resource 自動生成密碼並存入 AWS Secrets Manager。terraform plan 實際輸出確認所有 secret_string = (sensitive value),密碼不在任何 terminal output 中暴露。新增 hashicorp/random v3.8.1 provider。

Kiali 確認包含(舊版文檔有誤已更正)

實際 terraform plan 輸出確認 helm_release.kiali(版本 2.1.0)被包含在 Helm releases 中,與 Grafana 和 Prometheus 整合,auth.strategy: anonymous。這推翻了更早期文檔中「非 Kiali」的錯誤記載。

CI/CD 與部署流程完善

Staging GitHub Actions workflow 新增 manual approval gate,形成 dev(自動)→ staging(手動確認)→ prod(手動確認) 的安全部署流程。遇到 PR CI 失敗(Terraform validate)也已修復並重跑通過。

So What

這次 session 完成了 EKS dev 環境部署的所有前置工作,並有實際執行結果(terraform plan/apply 輸出)作為驗證依據,而非只是計劃。

安全性全面升級:三層安全升級全部落地且有實際輸出確認:IAM 取代 root(Lotus user)、OIDC 取代長期 Access Key、random_password 取代手動環境變數。特別重要的是,terraform plan 的實際輸出截圖確認了密碼確實以 sensitive value 處理,這消除了實作是否正確的疑慮。

台灣區域決策落地:ap-east-2 確認為台灣區域,比東京更靠近台灣用戶,這個決策已完整反映在所有 Terraform 資源名稱和 ARN 中,並且 S3 bucket 已成功在 ap-east-2 建立。

未解決的 follow-up 項目:Secret Rotation 是否啟用尚未確認,這是本 session 遺留的唯一重要技術債,需後續確認。

Trade-offs

  • ap-east-2 部分 AWS 服務可能較 ap-northeast-1 少,需在正式上線前確認所需服務的可用性
  • 外部 DNS 供應商(hostingireland.ie)需手動更新 CNAME,無法自動化 DNS 驗證流程,每次新增子網域需人工操作並更新 runbook
  • random_password 生成的密碼存於 Terraform state,需確保 S3 state bucket 有適當的加密和存取控制(已啟用 AES256 SSE + Versioning)
  • Manual approval 增加部署步驟但提升安全性,需建立清晰的審批 SOP
  • Secret rotation 未確認:Secrets Manager 中的 matchrpg/* secrets 是否啟用 automatic rotation 尚未確認,需後續 follow up
  • Kiali 使用 auth.strategy: anonymous 在 dev 環境,生產環境需改為適當的認證方式
  • Windows 環境執行 Terraform 需注意路徑(D:\phantomarc\MatchRPG_Infra),WSL 和 Windows 都可以安裝 Terraform,但 credentials 設定路徑不同

Try It Fast

# Step 0: 確認 AWS 身份(確保是 IAM user Lotus,非 root)
aws sts get-caller-identity
# 預期輸出: Account: "228170791874", UserId 應該是 Lotus 的 ARN

# Step 1: Bootstrap S3 state bucket(首次執行)
cd terraform/bootstrap/state-bucket
terraform init
terraform plan -var="environment=dev" -var="aws_region=ap-east-2" -out=tfplan
terraform apply tfplan
# 預期輸出: bucket_name = "matchrpg-tfstate-dev", bucket_region = "ap-east-2"

# Step 2: 初始化 dev 環境(密碼由 random_password 自動生成,無需手動設定 TF_VAR)
cd terraform/environments/dev
terraform init -upgrade
# 確認 hashicorp/random v3.8.1 被安裝
terraform plan -out=tfplan
# 確認所有 secret_string = (sensitive value)
terraform apply tfplan

# Step 3: EKS 建立後配置 kubeconfig
aws eks update-kubeconfig --name matchrpg-dev --region ap-east-2

# Step 4: 部署 ArgoCD application
kubectl apply -f k8s/argocd/projects/matchrpg.yaml
kubectl apply -f k8s/argocd/applications/game-server-dev.yaml

# Step 5: 驗證 Secrets Manager 密碼(確認 sensitive value 已存入)
aws secretsmanager get-secret-value --secret-id matchrpg/database --region ap-east-2

# Step 6: 確認 Secret Rotation 狀態(TODO: 本 session 未完成)
aws secretsmanager describe-secret --secret-id matchrpg/database --region ap-east-2 | grep -i rotation

Recommendation

  1. **永遠不要使用 root 帳號**執行日常操作,已建立 IAM user Lotus 並設定 Access Key 至 C:\Users\user\.aws\credentials;執行前先跑 aws sts get-caller-identity 確認身份
  2. [待完成] 確認 Secret Rotation:檢查 AWS Secrets Manager 中的 matchrpg/* secrets 是否已啟用 automatic rotation(本 session 未確認,是唯一遺留技術債)
  3. 使用 GitHub Actions OIDC 整合 AWS,OIDC Provider URL: https://token.actions.githubusercontent.com,避免長期存取金鑰洩漏
  4. DNS 手動操作必須記錄於 runbook:hostingireland.ie 不支援自動化,每次新增子網域需更新 runbook,ACM 驗證記錄和 wildcard CNAME 都需手動新增
  5. Staging 環境務必保留 manual approval,形成 dev(自動)→ staging(手動確認)→ prod(手動確認)的安全部署流程
  6. 選擇 AWS 區域優先考慮終端用戶地理位置,台灣用戶應使用 ap-east-2(已完成遷移,bucket_region 已確認為 ap-east-2)
  7. Terraform state 安全:確保 matchrpg-tfstate-dev bucket 的 versioning 和加密已啟用(已確認:AES256 SSE + Versioning Enabled)
  8. Kiali 生產環境認證:dev 環境使用 auth.strategy: anonymous,staging/prod 需改為適當的認證策略(token 或 openid)
  9. 通訊工具使用 Telegram 而非 Slack,本專案的告警和通知應配置 Telegram webhook,不要誤用 Slack integration

本文檔由 Semi-Brain 自動生成

Session ID: 12166813-461c-4fea-8bdc-9685a03af89c

分析信心度: 95%