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 是主入口點,它例項化了 CoreStackWebStackCoreStack 定義了核心資源,如 VPC 和 IAM 角色,而 WebStack 定義了 Web 層所需的資源,如應用程式負載平衡器和自動擴充套件群組。VPC 進一步分為公共子網和私有子網,IAM 角色則包括管理員和開發者角色。