AWS CDK 在 Python 中使用 - AWS Cloud Development Kit (AWS CDK) v2

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS CDK 在 Python 中使用

Python 是完全支援的用戶端語言, AWS Cloud Development Kit (AWS CDK) 且被認為是穩定的。 AWS CDK 在 Python 中使用熟悉的工具,包括標準的 Python 實作 (CPython)、使用的虛擬環境virtualenv,以及 Python 套件安裝程式pip。包含 AWS 構造庫的模塊通過 pyp i.org 分發。 AWS CDK 甚至的 Python 版本使用 Python 樣式的標識符(例如,snake_case方法名稱)。

您可以使用任何編輯器或IDE. 許多開 AWS CDK 發人員使用 Visual Studio 代碼(或其開源代碼等價物 VSCodium),它通過官方擴展對 Python 具有良好的支持。Python 中包含的IDLE編輯器就足以開始使用。的 Python 模組確實 AWS CDK 有類型提示,這些提示對於 linting 工具或支援型別驗證的IDE工具非常有用。

開始使用 Python

若要使用 AWS CDK,您必須擁有 AWS 帳戶和認證,並已安裝 Node.js 和工 AWS CDK 具組。請參閱 開始使用 AWS CDK

Python AWS CDK 應用程序需要 3.6 或更高版本。如果您尚未安裝它,請到 pyth on.org 下載適用於您的作業系統的相容版本。如果您運行 Linux,則您的系統可能附帶了兼容的版本,或者您可以使用發行版的軟件包管理器(yumapt等)進行安裝。Mac 用戶可能對自製軟件(macOS 的 Linux 風格的軟件包管理器)感興趣。

注意

第三方語言棄用:語言版本僅在供應商或社區共享其EOL(生命週期結束)之前受到支持,並且如有更改,恕不另行通知。

還需要 Python 軟件包安裝程序和虛擬環境管理器。pip virtualenv相容 Python 版本的視窗安裝包括這些工具。在 Linux 上,pip並且virtualenv可以在您的軟件包管理器中作為單獨的軟件包提供。或者,您可以使用以下命令安裝它們:

python -m ensurepip --upgrade python -m pip install --upgrade pip python -m pip install --upgrade virtualenv

如果您遇到權限錯誤,請使用--user旗標執行上述指令,以便將模組安裝在您的使用者目錄中,或使用sudo來取得在整個系統範圍內安裝模組的權限。

注意

對於 Linux 發行版來說,通常使用 Python 3.x 的可執行文件名稱python3,並python參考 Python 2.x 安裝。一些發行版有一個可選的軟件包,您可以安裝,使命python令引用 Python 3。否則,您可以通過在項目的主目錄cdk.json中編輯來調整用於運行應用程序的命令。

注意

在視窗上,您可能需要使用可py執行文件(> Python 啟動器視窗pip)調用 Python(和)。除此之外,啟動器允許您輕鬆指定要使用的 Python 安裝版本。

如果python在命令行中鍵入導致有關從 Windows 應用商店安裝 Python 的消息,即使在安裝 Windows 版本的 Python 之後,打開 Windows 的管理應用程序執行別名設置面板並關閉 Python 的兩個應用程序安裝程序條目。

建立專案

您可以在空目錄cdk init中呼叫來建立新 AWS CDK 專案。使用選--language項並指定python

mkdir my-project cd my-project cdk init app --language python

cdk init使用專案資料夾的名稱來命名專案的各種元素,包括類別、子資料夾和檔案。資料夾名稱中的連字號會轉換為底線。但是,名稱應該遵循 Python 標識符的形式; 例如,它不應該以數字開頭或包含空格。

若要使用新專案,請啟用其虛擬環境。如此可將專案的相依性安裝在本機專案資料夾中,而不是全域安裝。

source .venv/bin/activate
注意

您可以將其識別為用來啟用虛擬環境的 Mac/Linux 命令。Python 範本包含一個批次檔案 source.bat,允許在 Windows 上使用相同的命令。傳統的 Windows 命令也可以使用。.\venv\Scripts\activate

如果您使用 CDK Toolkit v1.70.0 或更早版本初始化 AWS CDK 項目,則虛擬環境位於.env目錄中而不是。.venv

重要

每當您開始處理專案時,都會啟用專案的虛擬環境。否則,您將無法訪問安裝在那裡的模塊,並且您安裝的模塊將進入 Python 全局模塊目錄中(或將導致權限錯誤)。

首次啟用虛擬環境後,請安裝應用程式的標準相依性:

python -m pip install -r requirements.txt

管理 AWS 建構程式庫模組

使用 Python 套件安裝程式pip,來安裝和更新「 AWS 建構程式庫」模組以供應用程式使用,以及您需要的其他套件。 pip還會自動為這些模塊安裝依賴關係。如果您的系統不能識別pip為獨立命令,請pip作為 Python 模塊調用,如下所示:

python -m pip PIP-COMMAND

大多數 AWS CDK 建構都在aws-cdk-lib。實驗模塊位於名為 like 的單獨模塊中aws-cdk.SERVICE-NAME.alpha。服務名稱包括 aws 前綴。如果您不確定模塊的名稱,請在 PyPI 上搜索它。例如,以下指令會安裝程式 AWS CodeStar 庫。

python -m pip install aws-cdk.aws-codestar-alpha

某些服務的結構位於多個命名空間中。例如,此外aws-cdk.aws-route53,還有三個額外的 Amazon Route 53 命名空間,命名為aws-route53-targetsaws-route53-patterns、和aws-route53resolver

注意

CDKAPI參考的 Python 版本也顯示了包名稱。

用於將「 AWS 建構程式庫」模組匯入 Python 程式碼的名稱如下所示。

import aws_cdk.aws_s3 as s3 import aws_cdk.aws_lambda as lambda_

我們建議您在應用程式中匯入 AWS CDK 類別和 AWS 建構程式庫模組時採取下列作法。遵循這些準則將有助於使您的代碼與其他 AWS CDK 應用程序一致,以及更容易理解。

  • 通常,從頂級導入單個類aws_cdk

    from aws_cdk import App, Construct
  • 如果您需要許多類別aws_cdk,您可以使用的命名空間別名,cdk而不是匯入個別類別。避免兩者都做。

    import aws_cdk as cdk
  • 通常,使用短命名空間別名匯入 AWS 建構程式庫。

    import aws_cdk.aws_s3 as s3

安裝模塊後,更新項目的requirements.txt文件,其中列出了項目的依賴關係。最好手動執行此操作,而不是使用pip freezepip freeze捕獲 Python 虛擬環境中安裝的所有模塊的當前版本,這在捆綁項目以在其他地方運行時非常有用。

但是,通常情況下,您requirements.txt應該只列出頂級依賴項(您的應用程序直接依賴的模塊),而不是這些庫的依賴關係。這種策略使更新您的依賴關係更簡單。

您可以編輯requirements.txt以允許升級;只需將之==前的版本號碼取代為以允許升級到更高的相容版本,或者完全移除版本需求,以指定模組的最新可用版本。~=

在適當requirements.txt編輯以允許升級之後,發出此命令以隨時升級項目的已安裝模塊:

pip install --upgrade -r requirements.txt

管理相依性 Python

在 Python 中,您可以通過將它們放入應用程序或setup.py構造庫中requirements.txt來指定依賴關係。然後使用該PIP工具管理依賴關係。PIP以下列其中一種方式叫用:

pip command options python -m pip command options

python -m pip調用適用於大多數系統; pip 要求可PIP執行文件位於系統路徑上。如果pip不起作用,請嘗試將其替換為python -m pip

此指cdk init --language python令會為您的新專案建立虛擬環境。這使得每個項目都有自己的依賴關係版本,也是一個基本requirements.txt文件。您必須在source .venv/bin/activate每次開始使用專案時執行來啟用此虛擬環境。在視窗上,.\venv\Scripts\activate改為執行

CDK應用

以下是範例 requirements.txt 檔案。由於PIP沒有相依性鎖定功能,因此建議您使用 == 運算子來指定所有相依性的確切版本,如下所示。

aws-cdk-lib==2.14.0 aws-cdk.aws-appsync-alpha==2.10.0a0

使用安裝模組pip install並不會自動將其加入requirements.txt。你必須自己做。如果您要升級至相依性的較新版本,請在中編輯其版本號碼requirements.txt

若要在建立或編輯之後安裝或更新專案的相依性requirements.txt,請執行下列指令:

python -m pip install -r requirements.txt
提示

此指pip freeze令會以可寫入文字檔的格式輸出所有已安裝相依性的版本。這可以用作需求檔案與pip install -r. 此文件很方便地將所有依賴關係(包括傳遞的依賴項)固定到您測試的確切版本。為了避免日後升級軟件包時出現問題,請使用單獨的文件來執行此操作,例如freeze.txt(不requirements.txt)。然後,在升級項目的依賴項時重新生成它。

協力廠商建構庫

在程式庫中,會在中指定相依性setup.py,以便在應用程式使用套件時自動下載傳遞相依性。否則,每個想要使用您的軟件包的應用程序都需要將您的依賴關係複製到它們的requirements.txt. 這裡顯示了一個例子setup.py

from setuptools import setup setup( name='my-package', version='0.0.1', install_requires=[ 'aws-cdk-lib==2.14.0', ], ... )

要處理用於開發的軟件包,創建或激活一個虛擬環境,然後運行以下命令。

python -m pip install -e .

雖然PIP會自動安裝傳遞相依性,但是任何一個套件只能有一個已安裝的副本。系統會選取相依性樹狀結構中指定最高的版本;應用程式永遠會有安裝套件版本的最後一個字詞。

AWS CDK Python 中的成語

語言衝突

在 Python 中,lambda是一種語言關鍵字,因此您不能將其用作 AWS Lambda 構造庫模塊或 Lambda 函數的名稱。這種衝突的 Python 約定是在變量名中使用尾隨下劃線lambda_,如在中所示。

按照慣例, AWS CDK 構造的第二個參數被命名id。編寫自己的堆棧和構造時,調用參數 id「陰影」Python 內置函數id(),該函數返回對象的唯一標識符。這個函數不經常使用,但是如果您在構造中碰巧需要它,請重命名參數construct_id

引數和屬性

所有的 AWS 構造庫類都使用三個參數實例化:正在定義構造的範圍(它在構造樹中的父級),一個 idprop,構造用於配置它創建的資源的鍵/值對的包。其他類和方法也使用「屬性包」模式作為參數。

scopeid 應始終作為位置參數傳遞,而不是關鍵字參數傳遞,因為如果構造接受名為 scopeid 的屬性,它們的名稱會改變。

在 Python 中,道具被表示為關鍵字參數。如果一個參數包含嵌套的數據結構,這些結構是使用一個類來表示,該類在實例化時採用自己的關鍵字參數。相同的模式會套用至採用結構化引數的其他方法呼叫。

例如,在 Amazon S3 儲存貯體的add_lifecycle_rule方法中,該transitions屬性是Transition執行個體的清單。

bucket.add_lifecycle_rule( transitions=[ Transition( storage_class=StorageClass.GLACIER, transition_after=Duration.days(10) ) ] )

當擴展一個類或覆蓋一個方法,你可能需要接受其他參數為自己的目的,這些參數不被父類理解。在這種情況下,您應該接受您不關心使用**kwargs成語的參數,並使用僅關鍵字參數來接受您感興趣的參數。當調用父級的構造函數或重寫的方法時,只傳遞它期望的參數(通常只是**kwargs)。傳遞父類別或方法不期望的引數會導致錯誤。

class MyConstruct(Construct): def __init__(self, id, *, MyProperty=42, **kwargs): super().__init__(self, id, **kwargs) # ...

的 future 版本 AWS CDK 可能會巧合地添加一個新屬性,其中包含您用於自己屬性的名稱。這不會對您的構造或方法的用戶造成任何技術問題(因為您的屬性沒有「上鏈」傳遞,父類或重寫的方法將僅使用默認值),但可能會導致混淆。您可以通過命名屬性來避免這種潛在問題,以使它們顯然屬於您的構造。如果有許多新屬性,請將它們捆綁到適當命名的類中,並將其作為單個關鍵字參數傳遞。

缺少值

AWS CDK 用於表None示缺少或未定義的值。使用時**kwargs,如果未提供屬性,請使用字典的get()方法提供預設值。避免使用kwargs[...],因為這會引KeyError發缺失的值。

encrypted = kwargs.get("encrypted") # None if no property "encrypted" exists encrypted = kwargs.get("encrypted", False) # specify default of False if property is missing

某些 AWS CDK 方法(例如tryGetContext()獲取運行時上下文值)可能會返回None,您將需要明確檢查。

使用介面

Python 沒有像其他語言那樣具有接口功能,儘管它確實具有類似的抽象基類。(如果你不熟悉界面,維基百科有一個很好的介紹。) TypeScript,實現的語言確實 AWS CDK 提供了接口,並且構造和其他對 AWS CDK 象通常需要一個堅持到特定接口的對象,而不是從特定類繼承。因此,提 AWS CDK 供了自己的界面功能作為JSII圖層的一部分。

要指示一個類實現了一個特定的接口,你可以使用@jsii.implements裝飾器:

from aws_cdk import IAspect, IConstruct import jsii @jsii.implements(IAspect) class MyAspect(): def visit(self, node: IConstruct) -> None: print("Visited", node.node.path)

類型陷阱

Python 使用動態類型,其中所有變量都可以引用任何類型的值。參數和返回值可以用類型註釋,但這些都是「提示」,並且不會強制執行。這意味著在 Python 中,很容易將不正確的值類型傳遞給 AWS CDK 構造。與其在構建過程中出現類型錯誤,就像從靜態類型語言那樣,當JSII圖層(在 Python 和 AWS CDK's TypeScript Core 之間進行轉換)無法處理意外類型時,您可能會遇到運行時錯誤。

根據我們的經驗,Python 程序員所犯的類型錯誤往往屬於這些類別。

  • 傳遞一個值,其中一個構造需要一個容器(Python 列表或字典),反之亦然。

  • 將與圖層 1 (CfnXxxxxx) 建構關聯的類型值傳遞給 L2 或 L3 建構,反之亦然。

AWS CDK Python 模塊確實包含類型註釋,因此您可以使用支持它們的工具來幫助類型。如果您不使用支援IDE這些功能的,例如 PyCharm,您可能想要呼叫MyPy型別驗證程式作為建置程序中的步驟。還有一些運行時類型檢查器可以改善類型相關錯誤的錯誤消息。