這是 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 構造庫的模塊通過 pypsnake_case
方法名稱)。
您可以使用任何編輯器或IDE. 許多開 AWS CDK 發人員使用 Visual Studio 代碼
開始使用 Python
若要使用 AWS CDK,您必須擁有 AWS 帳戶和認證,並已安裝 Node.js 和工 AWS CDK 具組。請參閱 開始使用 AWS CDK。
Python AWS CDK 應用程序需要 3.6 或更高版本。如果您尚未安裝它,請到 pythyum
apt
等)進行安裝。Mac 用戶可能對自製
注意
第三方語言棄用:語言版本僅在供應商或社區共享其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在命令行中鍵入導致有關從 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.
。服務名稱包括 aws 前綴。如果您不確定模塊的名稱,請在 PyPI 上搜索它SERVICE-NAME
.alpha
python -m pip install aws-cdk.aws-codestar-alpha
某些服務的結構位於多個命名空間中。例如,此外aws-cdk.aws-route53
,還有三個額外的 Amazon Route 53 命名空間,命名為aws-route53-targets
aws-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 freeze
。 pip
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 pipcommand
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 構造庫類都使用三個參數實例化:正在定義構造的範圍(它在構造樹中的父級),一個 id 和 prop,構造用於配置它創建的資源的鍵/值對的包。其他類和方法也使用「屬性包」模式作為參數。
scope 和 id 應始終作為位置參數傳遞,而不是關鍵字參數傳遞,因為如果構造接受名為 scope 或 id 的屬性,它們的名稱會改變。
在 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 沒有像其他語言那樣具有接口功能,儘管它確實具有類似的抽象基
要指示一個類實現了一個特定的接口,你可以使用@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