iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
Build on AWS

30 天將工作室 SaaS 產品部署起來系列 第 6

Day 6: 從零開始建立 AWS 環境 - 帳號申請到 CDK 部署實戰

  • 分享至 

  • xImage
  •  

從理論到實戰

前面五天我們討論了很多架構和理論,今天開始要動手設定了

今天我們要從最基礎開始:

  1. 申請 AWS 帳號
  2. 設定 IAM 使用者和權限
  3. 安裝並設定 AWS CLI V2
  4. 執行昨天的 CDK 部署

讓我們一步步實際操作,Kyo-System 部署到 AWS!

步驟一:申請 AWS 帳號

🔗 前往 AWS 官網註冊

重要提醒

  • 📧 電子郵件:使用企業或個人主要信箱(這將是 Root 帳號)
  • 💳 信用卡:需要國際信用卡進行驗證
  • 📱 手機號碼:用於身分驗證
  • 💰 費用:AWS 有 6 個月的免費方案試用

註冊步驟

  1. 前往 AWS 官網,點擊「建立 AWS 帳戶」
  2. 輸入 Root 使用者電子郵件
  3. 設定帳戶名稱(建議使用公司或專案名稱)
  4. 驗證電子郵件
  5. 設定 Root 密碼(強烈建議使用密碼管理器)
  6. 選擇帳戶類型:個人用戶選「個人」,公司選「企業」
  7. 輸入帳單資訊(信用卡資料)
  8. 手機驗證
  9. 選擇支援方案:開發測試選「基本(免費)」

⚠️ 安全提醒

  • Root 帳號非常強大,建議立即啟用 MFA(多重驗證)
  • 不要在日常開發中使用 Root 帳號

步驟二:設定 IAM 使用者

為了安全性,我們要建立一個專門用於開發的 IAM 使用者。

登入 AWS 控制台

  1. 前往 AWS 控制台
  2. 使用 Root 帳號登入

建立 IAM 使用者

  1. 搜尋並進入 IAM 服務

    • 在搜尋框輸入「IAM」,點擊進入
  2. 建立使用者

    IAM > 使用者 > 建立使用者
    
  3. 設定使用者詳細資訊

    • 使用者名稱kyo-developer
    • 選擇存取類型:✅ 「我要建立 IAM 使用者」
  4. 設定權限

    • 選擇「直接連接現有政策」
    • 搜尋並選擇 AdministratorAccess

    ⚠️ 注意:在生產環境中要使用最小權限原則,但開發階段為了方便,我們先用管理員權限。

  5. 檢查並建立

    • 確認設定後點擊「建立使用者」

建立存取金鑰

  1. 進入使用者詳細資料

    • 點擊剛建立的 kyo-developer 使用者
  2. 建立存取金鑰

    安全憑證標籤 > 存取金鑰 > 建立存取金鑰
    
  3. 選擇使用案例

    • 選擇「命令列介面 (CLI)」
    • ✅ 勾選「我了解上述建議」
  4. 設定描述標籤(可選)

    • 輸入:Kyo-System 開發環境
  5. 下載憑證

    • 重要:下載 CSV 檔案或複製金鑰資訊
    • Access Key ID:AKIA...
    • Secret Access Key:只會顯示這一次!

步驟三:在 Mac 上安裝 AWS CLI V2

安裝方法一:官方安裝包(推薦)

# 下載 AWS CLI V2 for macOS
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"

# 安裝
sudo installer -pkg AWSCLIV2.pkg -target /

安裝方法二:使用 Homebrew

# 如果你有 Homebrew
brew install awscli

驗證安裝

aws --version
# 應該顯示:aws-cli/2.x.x

步驟四:設定 AWS CLI 認證

配置憑證

aws configure

系統會詢問:

AWS Access Key ID [None]: AKIA... (你的 Access Key ID)
AWS Secret Access Key [None]: ... (你的 Secret Access Key)
Default region name [None]: ap-northeast-1
Default output format [None]: json

區域選擇建議

  • 台灣用戶:ap-east-2(台北)
  • 延遲最低且費用低

測試連線

# 測試 AWS CLI 是否正常工作
aws sts get-caller-identity

應該會顯示類似這樣的結果:

{
    "UserId": "AIDA...",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/kyo-developer"
}

步驟五:安裝 Node.js 和 AWS CDK

安裝 Node.js

# 檢查是否已安裝 Node.js
node --version

# 如果沒有安裝,前往 https://nodejs.org/ 下載
# 或使用 Homebrew 安裝
brew install node

要求版本:Node.js 18 或更高,我是使用v22.15.0

安裝 AWS CDK CLI

# 全域安裝 CDK CLI
npm install -g aws-cdk

# 驗證安裝
cdk --version

步驟六:準備 Kyo-System CDK 專案

複製並準備專案

# 進入你的專案目錄
cd /path/to/kyong-saas

# 安裝依賴(如果還沒安裝的話)
pnpm install

# 進入 CDK 目錄
cd infrastructure

檢查 CDK 程式碼

確認 infra/cdk/lib/kyo-infrastructure-stack.ts 的內容:

import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as rds from 'aws-cdk-lib/aws-rds';
import * as elasticache from 'aws-cdk-lib/aws-elasticache';
import { Construct } from 'constructs';

export class KyoInfrastructureStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // VPC - 我們的虛擬私有雲
    const vpc = new ec2.Vpc(this, 'KyoVpc', {
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      maxAzs: 2,
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'PublicSubnet',
          subnetType: ec2.SubnetType.PUBLIC,
        },
        {
          cidrMask: 24,
          name: 'PrivateSubnet',
          subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
        },
        {
          cidrMask: 24,
          name: 'DatabaseSubnet',
          subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
        }
      ]
    });

    // PostgreSQL 資料庫
    const database = new rds.DatabaseInstance(this, 'KyoDatabase', {
      engine: rds.DatabaseInstanceEngine.postgres({
        version: rds.PostgresEngineVersion.VER_15_3
      }),
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.MICRO),
      vpc,
      vpcSubnets: {
        subnetType: ec2.SubnetType.PRIVATE_ISOLATED
      },
      databaseName: 'kyo',
      credentials: rds.Credentials.fromGeneratedSecret('kyoadmin'),
      allocatedStorage: 20,
      deleteAutomatedBackups: false,
      deletionProtection: false // 開發環境設為 false,生產環境要設 true
    });

    // Redis (ElastiCache)
    const redisSubnetGroup = new elasticache.CfnSubnetGroup(this, 'KyoRedisSubnetGroup', {
      description: 'Subnet group for Kyo Redis',
      subnetIds: vpc.selectSubnets({ subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS }).subnetIds
    });

    const redis = new elasticache.CfnCacheCluster(this, 'KyoRedis', {
      cacheNodeType: 'cache.t3.micro',
      engine: 'redis',
      numCacheNodes: 1,
      cacheSubnetGroupName: redisSubnetGroup.ref
    });

    // 輸出重要資訊
    new cdk.CfnOutput(this, 'VpcId', {
      value: vpc.vpcId,
      description: 'VPC ID'
    });

    new cdk.CfnOutput(this, 'DatabaseEndpoint', {
      value: database.instanceEndpoint.hostname,
      description: 'RDS PostgreSQL endpoint'
    });

    new cdk.CfnOutput(this, 'RedisEndpoint', {
      value: redis.attrRedisEndpointAddress,
      description: 'ElastiCache Redis endpoint'
    });
  }
}

步驟七:Bootstrap 和部署

Bootstrap AWS 環境

這是第一次使用 CDK 時必須執行的步驟:

# Bootstrap CDK(只需執行一次)
cdk bootstrap

# 如果指定區域
cdk bootstrap aws://你的帳號ID/ap-northeast-1

Bootstrap 會建立:

  • S3 Bucket(存放 CDK 資產)
  • IAM 角色(CDK 部署權限)
  • CloudFormation Stack

檢視即將部署的資源

# 合成 CloudFormation 模板
cdk synth

這會顯示將要建立的所有 AWS 資源。

部署基礎設施

# 部署 Kyo Infrastructure
cdk deploy

CDK 會詢問:

Do you wish to deploy these changes (y/n)? y

部署過程大約需要 10-15 分鐘,因為要建立:

  • VPC 和子網路
  • PostgreSQL RDS 實例
  • ElastiCache Redis
  • 相關的安全群組和路由表

查看部署結果

部署完成後,你會看到輸出資訊:

Outputs:
KyoInfrastructureStack.VpcId = vpc-abc123...
KyoInfrastructureStack.DatabaseEndpoint = kyo-database.abc123.ap-northeast-1.rds.amazonaws.com
KyoInfrastructureStack.RedisEndpoint = kyo-redis.abc123.cache.amazonaws.com

步驟八:驗證部署

在 AWS 控制台檢查

  1. VPC

    AWS 控制台 > VPC > 你的 VPC
    
  2. RDS

    AWS 控制台 > RDS > 資料庫 > kyo-database
    
  3. ElastiCache

    AWS 控制台 > ElastiCache > Redis 叢集
    

檢查 CloudFormation Stack

AWS 控制台 > CloudFormation > KyoInfrastructureStack

你可以看到所有建立的資源和它們的關係。

估算費用

在 AWS 免費方案下:

  • RDS t3.micro:750 小時/月免費
  • ElastiCache t3.micro:750 小時/月免費
  • VPC, 子網路:免費
  • NAT Gateway:每小時 $0.045(注意:這可能產生費用)

💰 省錢提醒:如果你不需要 private subnet 連外網,可以移除 NAT Gateway 來節省費用。

常見問題解決

1. 權限不足錯誤

User: arn:aws:iam::xxx:user/kyo-developer is not authorized to perform: xxx

解決方案:確認 IAM 使用者有 AdministratorAccess 權限。

2. 區域不支援某些服務

The requested configuration is currently not supported in this region

解決方案:改用 us-east-1ap-northeast-1 區域。

3. 資源配額不足

You have exceeded the maximum number of VPCs

解決方案:刪除不用的 VPC 或申請配額增加。

4. CDK 版本不相容

CDK version mismatch

解決方案

npm install -g aws-cdk@latest

清理資源(重要!)

當你完成測試後,記得清理資源以避免產生費用:

# 刪除整個 Stack
cdk destroy

# 確認刪除
Do you really want to delete: KyoInfrastructureStack (y/n)? y

下一步規劃

明天(Day 7)我們將:

  1. 建立 Secrets Manager 來安全管理憑證
  2. 設定 IAM 角色 給 ECS 使用
  3. 準備 ECR Repository 來存放 Docker 映像
  4. 建立 ECS Cluster 來執行我們的應用程式

今日成果

AWS 帳號建立完成
IAM 使用者和存取金鑰設定完成
AWS CLI V2 安裝並設定完成
CDK 安裝完成
基礎網路架構部署完成
PostgreSQL 和 Redis 運行中

提醒:記得定期檢查 AWS 帳單,確保沒有意外費用產生。在免費方案範圍內使用是最安全的做法。


上一篇
Day5:AWS 基礎設施規劃與 VPC 網路架構
下一篇
Day 7: 現代化前後端分離部署架構
系列文
30 天將工作室 SaaS 產品部署起來7
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言