AWS CDK 提供更簡潔直觀的程式設計模型,相較於繁瑣的 CloudFormation 範本,更易於撰寫和維護。開發者能以 Python 等高階語言定義基礎設施,例如建立 VPC、子網、S3 儲存桶等,並透過 CDK 自動轉換成 CloudFormation 範本進行佈署。此方法提升了開發效率,減少錯誤,更易於版本控制和團隊協作,對於複雜的雲端環境管理更具優勢。
使用AWS CDK簡化範本開發
AWS CDK(Cloud Development Kit)為開發者提供了一種以程式設計方式定義雲端基礎設施的方法。相較於傳統的CloudFormation範本,CDK提供了更高的抽象層級和更強大的功能,使得範本開發變得更加容易和靈活。
為何選擇AWS CDK?
儘管CloudFormation具有強大的功能和與AWS的深度整合,但其宣告式語法對於初學者來說可能會造成一定的負擔。CDK的程式設計性質使得開發者能夠更輕鬆地定義和佈署基礎設施。
CloudFormation的挑戰
在CloudFormation中定義一個簡單的S3儲存桶需要大量的屬性和組態:
Type: AWS::S3::Bucket
Properties:
AccelerateConfiguration: ...
AccessControl: ...
AnalyticsConfigurations: [ ... ]
BucketEncryption: ...
BucketName: ...
CorsConfiguration: ...
InventoryConfigurations: [ ... ]
LifecycleConfiguration: ...
LoggingConfiguration: ...
MetricsConfigurations: [ ... ]
NotificationConfiguration: [ ... ]
這種宣告方式不僅繁瑣,而且容易出錯。
CDK的優勢
使用CDK可以簡化這個過程:
bucket = s3.Bucket(self, 'myBucket')
app = App()
BucketStack(app, 'bucket')
app.synth()
CDK透過其程式設計模型,允許開發者使用Python等程式語言來定義基礎設施。這不僅提高了開發效率,還使得程式碼更具可讀性和可維護性。
使用CDK建立第一個範本
安裝CDK
首先,需要安裝Node.js和CDK:
$ npm install -g aws-cdk
$ cdk --version
接下來,初始化CDK專案:
$ mkdir app && cd app
$ cdk init app --language=python
$ source .env/bin/activate
$ pip install -r requirements.txt
定義基礎設施
我們將建立一個包含核心網路、Web層和儲存層的基礎設施。首先,定義核心堆積疊:
// app.py
import aws_cdk as cdk
from app.app_stack import AppStack
app = core.App()
AppStack(app, 'app')
app.synth()
# app/app_stack.py
from aws_cdk import Stack
from constructs import Construct
class AppStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs):
super().__init__(scope, construct_id, **kwargs)
# 定義基礎設施資源
self.create_resources()
def create_resources(self):
# 建立VPC
CIDR = '10.0.0.0/16'
vpc = ec2.Vpc(self, 'Vpc',
ip_addresses=ec2.IpAddresses.cidr(CIDR),
subnet_configuration=[
ec2.SubnetConfiguration(name='Public', subnet_type=ec2.SubnetType.PUBLIC, cidr_mask=24),
ec2.SubnetConfiguration(name='Private', subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS, cidr_mask=24)
])
# #### 內容解密:
# 這段程式碼定義了一個VPC資源,並組態了公有和私有子網。
# - `ip_addresses=ec2.IpAddresses.cidr(CIDR)` 指定了VPC的CIDR區塊。
# - `subnet_configuration` 定義了子網的組態,包括公有子網和私有子網。
# 建立S3儲存桶
bucket = s3.Bucket(self, 'myBucket')
# #### 內容解密:
# 這行程式碼建立了一個名為`myBucket`的S3儲存桶。
# CDK會自動處理儲存桶的建立和組態。
佈署基礎設施
完成基礎設施定義後,可以使用以下命令佈署:
$ cdk deploy
這將根據定義的CDK程式碼生成CloudFormation範本並佈署到指定的AWS帳戶和區域。
隨著雲端運算的不斷發展,AWS CDK將繼續扮演重要的角色。未來,我們可以期待CDK提供更多功能和改進,以進一步簡化基礎設施即程式碼(IaC)的實踐。
graph LR A[開始] --> B[安裝CDK] B --> C[初始化CDK專案] C --> D[定義基礎設施] D --> E[佈署基礎設施] E --> F[驗證佈署結果]
圖表翻譯: 此圖示展示了使用AWS CDK佈署基礎設施的主要步驟。從安裝CDK開始,接著初始化專案,然後定義所需的雲端資源,最後佈署並驗證結果。這個過程簡化了基礎設施的管理和佈署。
參考資料
- AWS CDK官方檔案:https://docs.aws.amazon.com/cdk/latest/guide/home.html
- AWS CDK GitHub倉函式庫:https://github.com/aws/aws-cdk
內容擴充
在實際應用中,開發者可以根據具體需求擴充和自定義CDK程式碼。例如,可以新增更多的資源定義,如資料函式庫、負載平衡器等,以建立更複雜的基礎設施。此外,還可以利用CDK的模組化和重用特性,將常用的基礎設施模式封裝成可重用的元件,以提高開發效率。
# 範例:建立RDS資料函式庫例項
rds_instance = rds.DatabaseInstance(self, 'DatabaseInstance',
engine=rds.DatabaseInstanceEngine.mysql(
version=rds.MysqlEngineVersion.VER_8_0_21
),
instance_identifier='my-rds-instance',
vpc=vpc,
allocated_storage=100,
max_allocated_storage=200
)
# #### 內容解密:
# 這段程式碼定義了一個RDS資料函式庫例項。
# - `engine` 指定了資料函式庫引擎和版本。
# - `instance_identifier` 是資料函式庫例項的唯一識別符號。
# - `vpc` 指定了資料函式庫例項所在的VPC。
# - `allocated_storage` 和 `max_allocated_storage` 組態了資料函式庫的儲存空間。
透過這種方式,開發者可以根據具體需求靈活地定義和佈署各種雲端資源和服務。
使用 AWS CDK 和 Python 編寫第一個範本
準備工作
在開始使用 AWS CDK(Cloud Development Kit)之前,我們需要了解其基本架構和運作方式。AWS CDK 是一個開源的軟體開發框架,允許開發者使用熟悉的程式語言(如 Python、JavaScript、Java 等)來定義雲端基礎架構。CDK 將這些定義轉換成 AWS CloudFormation 範本,以便在 AWS 上佈署資源。
初始化 CDK 專案
首先,我們需要初始化一個 CDK 專案。假設你已經安裝了 AWS CDK,可以使用以下命令建立一個新的 Python 專案:
cdk init app --language python
這個命令會建立一個基本的 CDK 專案結構,包括一個 app.py
檔案和一個與當前目錄名相同的目錄(例如,如果當前目錄名為 my_cdk_project
,則會建立 my_cdk_project_stack.py
)。
定義核心堆積疊(Core Stack)
在 CDK 中,堆積疊(Stack)是資源的集合。我們首先定義一個核心堆積疊,包含 VPC、子網、路由表、IAM 角色等核心資源。
重構初始程式碼
初始的 app.py
和 *_stack.py
檔案可能需要重構以滿足我們的命名約定。假設我們將 app_stack.py
重新命名為 core_stack.py
,並將類別 AppStack
重新命名為 CoreStack
:
# app/core_stack.py
from aws_cdk import Stack
from constructs import Construct
class CoreStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# 在這裡定義堆積疊的資源
並更新 app.py
以使用新的堆積疊類別:
# app.py
import aws_cdk as cdk
from app.core_stack import CoreStack
app = cdk.App()
CoreStack(app, 'CoreStack')
app.synth()
定義核心資源
IAM 角色
首先,我們在 CoreStack
中定義兩個 IAM 角色:一個用於管理員,一個用於開發者。
# app/core_stack.py
from aws_cdk import Stack, Fn
from constructs import Construct
import aws_cdk.aws_iam as iam
class CoreStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
admin_role = iam.Role(self, 'admin', assumed_by=iam.AccountPrincipal(Fn.ref('AWS::AccountId')))
dev_role = iam.Role(self, 'developer', assumed_by=iam.AccountPrincipal(Fn.ref('AWS::AccountId')))
admin_role.add_managed_policy(iam.ManagedPolicy.from_aws_managed_policy_name('AdministratorAccess'))
dev_role.add_managed_policy(iam.ManagedPolicy.from_aws_managed_policy_name('ReadOnlyAccess'))
VPC 和子網
接下來,我們定義 VPC 和子網:
# app/core_stack.py
import aws_cdk.aws_ec2 as ec2
class CoreStack(Stack):
# ...
self.vpc = ec2.Vpc(self, 'vpc', cidr='10.0.0.0/16',
enable_dns_hostnames=True,
enable_dns_support=True,
max_azs=3, nat_gateways=1,
subnet_configuration=[
ec2.SubnetConfiguration(name='Public', subnet_type=ec2.SubnetType.PUBLIC, cidr_mask=24),
ec2.SubnetConfiguration(name='Private', subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS, cidr_mask=24)
])
驗證生成的 CloudFormation 範本
執行 cdk synth
可以生成 CloudFormation 範本,並驗證資源定義是否正確。
定義 Web 層堆積疊(Web Tier Stack)
Web 層堆積疊建立在核心堆積疊之上,包含應用程式負載平衡器、啟動組態、自動擴充套件群組和安全群組等資源。
建立 Web 堆積疊
# app/web_stack.py
from aws_cdk import Stack
from constructs import Construct
import aws_cdk.aws_ec2 as ec2
class WebStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# 在這裡定義 Web 堆積疊的資源
#### 內容解密:
在上述程式碼中,我們定義了一個名為 WebStack
的新堆積疊類別,用於建立 Web 層所需的資源。這包括應用程式負載平衡器、啟動組態、自動擴充套件群組和相關的安全群組。我們將在這個堆積疊中參照核心堆積疊中定義的 VPC 和其他資源。
隨著雲端運算的不斷發展,使用 AWS CDK 和 Python 來管理基礎架構將變得越來越重要。未來,我們可以期待更多的功能和改進,以簡化開發流程並提高資源管理的效率。
AWS CDK 結構圖
graph LR A[app.py] --> B[CoreStack] A --> C[WebStack] B --> D[VPC] B --> E[IAM Roles] C --> F[Application Load Balancer] C --> G[Auto Scaling Group] D --> H[Public Subnets] D --> I[Private Subnets] E --> J[Admin Role] E --> K[Dev Role]
圖表翻譯:
此圖表展示了使用 AWS CDK 和 Python 定義的基礎架構的層次結構。app.py
是主入口點,它例項化了 CoreStack
和 WebStack
。CoreStack
定義了核心資源,如 VPC 和 IAM 角色,而 WebStack
定義了 Web 層所需的資源,如應用程式負載平衡器和自動擴充套件群組。VPC 進一步分為公共子網和私有子網,IAM 角色則包括管理員和開發者角色。