iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Build on AWS

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

Day8 AWS CDK資源部署,CLI 以及 Construct 撰寫| 程式化部署AWS服務邁向CI/CD!(5)

  • 分享至 

  • xImage
  •  

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


在上篇我們探索了在 CDK 中 Construct 用何種方式來描述資源以及 app.pymy_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來將他們部署上去

https://ithelp.ithome.com.tw/upload/images/20250818/20178103kiSBNZE26T.png

我們可以在CloudFormation上看到我們剛剛部建的兩個 S3 Bucket

現在我們用cdk destroy來銷毀這個Stack,收回所有資源

https://ithelp.ithome.com.tw/upload/images/20250818/20178103DvqLZJrcbH.png

由於DeletionPolicy被設定為Retain L2 Bucket的Deletion被跳過了

https://ithelp.ithome.com.tw/upload/images/20250818/20178103wFCrDbf3vP.png

https://ithelp.ithome.com.tw/upload/images/20250818/20178103f8lhH3pqwK.png

而在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的建置邁進,請各位期待!


上一篇
Day7 剖析CDK專案架構 Construct的三個層次| 程式化部署AWS服務邁向CI/CD!(4)
下一篇
Day9 什麼是CI/CD?DevOps精神自動化流程!
系列文
一步步帶你認識 Cloud Native —— 用AWS免費服務打造雲原生專案23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言