iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0
Build on AWS

一步步帶你認識 Cloud Native —— 用AWS免費服務打造雲原生專案系列 第 6

Day6 IaC 程式定義基礎設施 CloudFormation及 CDK介紹| 程式化部署AWS服務邁向CI/CD!(3)

  • 分享至 

  • xImage
  •  

歡迎來到本系列的第六篇文章!


上一篇的內容中,我們實際使用AWS Console與SDK工具體驗過了 S3 部署靜態網頁在兩者上的流程以及差別分析,我們學到了善用 SDK 工具可以如何幫助我們將繁瑣的設定給集成起來,而在今天我們將要深入探討 IaC(Infrastructure as Code),向大家介紹 AWS CloudFormation 以及 AWS CDK


IaC (Infrastructure as Code) 是甚麼?

經過昨天的介紹,大家應該可以很輕易的想像程式會怎麼樣與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 工具:CloudFormation & CDK

在 AWS上有兩種 IaC 工具選擇

AWS CloudFormation

  • 使用 JSON 或 YAML 來宣告資源。

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

https://ithelp.ithome.com.tw/upload/images/20250816/2017810334CPsJN6wz.png

可以在建立堆疊 (Create Stack) 頁面中透過導入已有的範本 (Template) 建立你的基礎設施,也可以透過Visual Designer介面用拖拉的方式來建立可以導入的範本 (此服務在ap-east-2台北region在寫稿當下還未開放)

https://ithelp.ithome.com.tw/upload/images/20250816/20178103w4T8w1I2Fd.png

不過 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專案吧!

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服務的部署是如何邁向「可擴充」、「高維護性」以及「自動化」。


上一篇
Day5 SDK 操作 S3 部暑網站! & S3服務介紹 | 程式化部署AWS服務邁向CI/CD!(2)
下一篇
Day7 剖析CDK專案架構 Construct的三個層次| 程式化部署AWS服務邁向CI/CD!(4)
系列文
一步步帶你認識 Cloud Native —— 用AWS免費服務打造雲原生專案23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言