在上一篇的內容中,我們實際使用AWS Console與SDK工具體驗過了 S3 部署靜態網頁在兩者上的流程以及差別分析,我們學到了善用 SDK 工具可以如何幫助我們將繁瑣的設定給集成起來,而在今天我們將要深入探討 IaC(Infrastructure as Code),向大家介紹 AWS CloudFormation 以及 AWS CDK
經過昨天的介紹,大家應該可以很輕易的想像程式會怎麼樣與AWS服務交互了,不過不知道大家會不會隱約有一種感覺。好像透過SDK,有好多的API要去一個一個慢慢叫,萬一弄錯了還要重新再刪除掉被創建的東西。雖然是可以自動化了但感覺一點也不方便。
如果你有這種感覺,你的直覺是正確的,SDK 雖然能創建資源,但在基礎設施管理上不如 IaC 工具直觀與可維護!
AWS 最開始的確都主要都以 CLI 以及 SDK 作為程式化部署的主要工具,但隨著IaC工具推出,現在SDK和 IaC的定位已經被區分開來了。
SDK 是較低階的工具:它能讓你用程式精確操作 AWS API,包括「創建」「刪除」「修改」資源,但這意味著你需要自己處理所有細節(權限、錯誤處理、狀態同步)。
IaC (CloudFormation/CDK) 是 集成的服務或者說高階工具:它在 SDK 之上包了一層抽象,讓你能以「描述需求」 而不是「一步一步呼叫 API」的方式來建構基礎設施。
簡單來說,SDK就是一條一條的API讓你直接呼叫,但IaC是為基礎設施專門「包裝過的API」讓你用更加輕鬆的寫法來去調用 AWS服務資源的管理。
但除了基礎設施以外的部分當然還是得靠 SDK 所以兩個都得會啊
在 AWS上有兩種 IaC 工具選擇
AWS CloudFormation
CloudFormation中一個重要的邏輯單元是堆疊 (CloudFormation Stack) 這代表著一群 AWS 基礎設施,而我們則透過Template (YAML或JSON形式)來創建 CloudFormation Stack。
Template的例子:
AWSTemplateFormatVersion: '2010-09-09'
Description: A sample CloudFormation template to create an IAM role.
# 這是描述一個 IAM Role 的Resource
Resources:
MyIAMRole:
Type: AWS::IAM::Role
Properties:
RoleName: MyExampleRole
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: S3AccessPolicy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
Resource: !Sub arn:aws:s3:::my-example-bucket-20250817/*
Outputs:
RoleArn:
Description: The ARN of the IAM role
Value: !GetAtt MyIAMRole.Arn
如果已有範本的話,用CloudFormation可以輕易的部署完成整個系統
在Console上的CloudFormation
可以在建立堆疊 (Create Stack) 頁面中透過導入已有的範本 (Template) 建立你的基礎設施,也可以透過Visual Designer介面用拖拉的方式來建立可以導入的範本 (此服務在ap-east-2台北region在寫稿當下還未開放)
不過 CloudFormation也有他的缺點,對於複雜的基礎設施難以維護,且缺乏程式設計語言的靈活性(例如迴圈、條件邏輯)。
AWS CDK (Cloud Development Kit)
AWS CDK 則可以理解成CloudFormation Template的超強開發工具,可以用開發者習慣的程式語言來生成Template (AWS CDK支援 Python、TypeScript、Java、C# 等語言,詳細可以看文件)
在 CDK 中,開發者不直接用YAML或JSON撰寫Template,而是透過cdk synth
從程式碼生成。CDK 的程式碼(例如 TypeScript 或 Python)定義了資源,轉換為等價的 CloudFormation Template用以創建CloudFormation Stack。
列點式總結一下
使用程式語言(Python、TypeScript、Java、C# 等)來定義基礎設施。
優點:更貼近開發者日常,支援條件判斷、迴圈、抽象化。
缺點:比 CloudFormation 多一層抽象,學習成本稍高。
因為我們的目標是創造CI/CD Pipeline,相較於CloudFormation,CDK是CI/CD中更佳的選擇,既然如此,我們就來建置一個 AWS CDK專案吧!
第一步,安裝前置需求
我們需要安裝 Node.js 與 npm
因為 CDK CLI 本身是用 Node.js 開發的,所以必須先安裝。
node -v
npm -v
如果沒有,建議去 Node.js 官方網站 下載 LTS 版本。
AWS CLI 與 IAM 憑證
aws configure
如果你已經跟著Day4設定過相關設定的話,CDK會直接讀取你的配置不用重複設定
第二步,安裝 AWS CDK CLI
npm install -g aws-cdk
cdk --version #檢查版本
第三步,cdk init
- 初始化 Python CDK 專案
因為我們的 SDK 也使用 python boto3,我們維持一致性一樣以python為例
但許多人會推薦選擇 typescript,擁有最成熟的社群文件。
mkdir my-cdk-project #創建一個資料夾來放這個專案
cd my-cdk-project
因為我們打算初始化一個python CDK專案
cdk init app --language python
這樣會在資料夾中生成一些檔案,架構應該看起來像這樣]:
my-cdk-app/
├── app.py # 入口點,定義 App 和 Stack
├── cdk.json # CDK 配置檔案
├── requirements.txt # Python 依賴(包含 aws-cdk-lib)
├── setup.py # Python 專案設置
├── my_cdk_app/ # 堆疊定義模組
│ ├── __init__.py
│ └── my_cdk_app_stack.py # 堆疊程式碼
├── tests/ # 單元測試資料夾
│ └── unit/
│ └── test_my_cdk_app_stack.py
└── README.md
第四步,安裝依賴
CDK for Python 預設使用 virtualenv(虛擬環境,將你的依賴獨立出來)所以我們需要啟用環境:
source .venv/bin/activate # Linux / Mac
.venv\Scripts\activate # Windows PowerShell
接著用 pip 安裝依賴至python環境
pip install -r requirements.txt
這樣你就安裝好執行python cdk的依賴項了
第五步,部署前初始化
第一次使用 CDK 必須先做一件叫做 "bootstrap"的事情,他會為你創建一個 S3 Bucket和一個CloudFormation Stack,這樣AWS才知道要將你生成出的 template 放在何處。
cdk bootstrap aws://123456/ap-east-2 #改成你的account id和region
如果你忘記account id 可以透過aws sts get-caller-identity
來取得,但如果你的aws cli 並非全局安裝,可能需要退出虛擬環境( 開new terminal或exit
)才能使用該命令
接著你會發現在你的專案目錄下多出了一個叫cdk.out的資料夾,你使用cdk synth
輸出的 template 都會存放在這裡。
恭喜你完成了cdk的前期環境配置!想要趕快進入部署環節的再忍一下!今天引入了許多新且具體的重要概念,所以就讓我們慢下來好好消化吧哈哈。
今天我們完成了 CDK 的安裝與環境準備,接下來的文章,我們將正式進入CDK專案中,深入分析專案結構中各部件的功能,並學習用CDK進行部署所需要的知識!今天的內容可能對許多人來說有些陌生,希望透過本篇文章能讓大家更好的想像AWS服務的部署是如何邁向「可擴充」、「高維護性」以及「自動化」。