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