在上篇我們探索了在 CDK 中 Construct 用何種方式來描述資源以及 app.py
、my_cdk_app_stack.py
等專案檔案目錄,奠定了 CDK 的理論基礎,而今天我們要正式進入之前創建的專案,繼續出發到實作了!今天我們將用 Python CDK 中不同的Level Construct部署一個 S3 儲存桶。同時學會 CLI 命令和 Construct 撰寫
第一次的部署嘗試我們先從簡單的開始,我們要部署最熟悉的 S3 Bucket 到我們的 AWS 帳號中。
首先我們進到app.py中,設定一下我們的部署範圍,指定我們的CDK將會部署到的rigeon以及帳號中
#!/usr/bin/env python3
import os
import aws_cdk as cdk
from my_cdk_project.my_cdk_project_stack import MyCdkProjectStack
app = cdk.App()
MyCdkProjectStack(app, "MyCdkProjectStack",
env=cdk.Environment(account='你的Account id', region='ap-east-2(以台北為例)'),
)
app.synth()
再來來到目錄中的Stack.py
大概會看起來像這樣
from aws_cdk import (
Stack,
aws_s3 as s3, # 因為我們想要部署S3,所以需要import aws_s3
)
from constructs import Construct
class MyCdkProjectStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
# 這裡的區域就是我們的stack
# 我們在這裡創建 construct 來代表 AWS 資源
在上一篇中我們提到Construct的L1、L2以及L3,現在我們來看看他們具體長怎樣
那我們現在來在這塊區域中用 L1 Construct來創建一個 S3 Bucket
MyL1Bucket = s3.CfnBucket( # 創建一個L1的s3 Bucket construct實例
self,
"MyL1Bucket", # 這是construct id,輸出yaml中的construct名字
bucket_name="my-30daysaws-example-l1bucket", # s3 bucket真正的名字(全球唯一)
versioning_configuration={ # 物件被更新時不刪除而是分配新的版本ID
"status": "Enabled"
}
)
再來試試看用L2 Construct來創造一模一樣的 S3 Bucket
MyL2Bucket = s3.Bucket(
self,
"MyL2Bucket",
bucket_name="my-30daysaws-example-l2bucket",
versioned=True,
)
接下來我們用cdk synth
來編譯並印出我們撰寫出的CloudFormation
Resources:
MyL1Bucket: #這部份是我們的L1 Bucket
Type: AWS::S3::Bucket
Properties:
BucketName: my-30daysaws-example-l1bucket
VersioningConfiguration:
Status: Enabled
Metadata:
aws:cdk:path: MyCdkProjectStack/MyL1Bucket
MyL2BucketC842E3F4: #這部份是我們的L2 Bucket(後綴會被添加亂碼)
Type: AWS::S3::Bucket
Properties:
BucketName: my-30daysaws-example-l2bucket
VersioningConfiguration:
Status: Enabled
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
Metadata:
aws:cdk:path: MyCdkProjectStack/MyL2Bucket/Resource
Parameters:
BootstrapVersion:
Type: AWS::SSM::Parameter::Value<String>
Default: /cdk-bootstrap/hnb659fds/version
Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]
在L1 Bucket的yaml區塊中,一切都按照我們的設定
MyL1Bucket: #這部份是我們的L1 Bucket
Type: AWS::S3::Bucket
Properties:
BucketName: my-30daysaws-example-l1bucket
VersioningConfiguration:
Status: Enabled
不過在L2 Bucket中我們卻能發現一些我們並未設定的內容
MyL2BucketC842E3F4: #這部份是我們的L2 Bucket(後綴會被添加亂碼)
Type: AWS::S3::Bucket
Properties:
BucketName: my-30daysaws-example-l2bucket
VersioningConfiguration:
Status: Enabled
UpdateReplacePolicy: Retain #這兩個沒有被設定但卻出現了
DeletionPolicy: Retain
在L2中被預設了兩個額外的設定
UpdateReplacePolicy: Retain
用於在CDK部署後保存我們的舊版本而非直接覆蓋DeletionPolicy: Retain
則是在執行cdk destroy
收回所有資源時仍然保存已部署的S3 Bucket
現在讓我們試試看用 cdk deploy
來將他們部署上去
我們可以在CloudFormation上看到我們剛剛部建的兩個 S3 Bucket
現在我們用cdk destroy
來銷毀這個Stack,收回所有資源
由於DeletionPolicy被設定為Retain L2 Bucket的Deletion被跳過了
而在CloudFormation中我們的Stack已經被移至「已刪除」,但仍然可以在S3中找到我們的L2 Bucket
L2 Construct幫我們預設的數值常常都蠻恰當的,以S3 bucket而言,這樣就可以保護在維運過程中不會誤刪運行中的S3實體。
畢竟萬一刪除了不該刪的 Bucket 實體,裡面的物件也會消失殆盡...
那麼經過這一整個流程,我們來回顧一下cdk的cli指令以及他們的使用時機
CDK CLI常用指令
指令 | 用途 | 範例 |
---|---|---|
cdk init |
初始化新 CDK 專案 | cdk init app --language python |
cdk synth |
合成 CloudFormation 範本 | cdk synth MyCdkProjectStack |
cdk deploy |
部署堆疊到 AWS | cdk deploy MyCdkProjectStack |
cdk diff |
比較本地程式碼與已部署的差異 | cdk diff MyCdkProjectStack |
cdk destroy |
刪除堆疊及資源 | cdk destroy MyCdkProjectStack |
cdk bootstrap |
初始化 CDK 環境 | cdk bootstrap aws://390402542308/ap-east-2 |
cdk list (或 ls ) |
列出應用程式中的堆疊 | cdk ls |
cdk doctor |
診斷 CDK 環境問題 | cdk doctor |
cdk context |
管理上下文設定 | cdk context --list |
cdk version |
顯示 CDK CLI 版本 | cdk version |
到這邊我們就正式走完了CDK的部署流程,在往後的天數中,我們會隨著整個專案的建構,慢慢去學習不同服務的特性以及去撰寫他們的Construct,接下來我們馬上要向CI/CD pipeline的建置邁進,請各位期待!