这是 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)、虚拟环境和 Python 包安装程序pip
。virtualenv
构成 AWS 构造库的模块通过 pypisnake_case
方法名称)。
您可以使用任何编辑器或IDE. 许多 AWS CDK 开发者使用 Visual Studio Code(或其开源代码 VSCodium
开始使用 Python
要使用 AWS CDK,您必须拥有 AWS 账户和凭证,并已安装 Node.js 和 AWS CDK Toolkit。请参阅 开始使用 AWS CDK。
Python AWS CDK 应用程序需要 Python 3.6 或更高版本。如果您尚未安装,请在 pythonyum
apt
、等)进行安装。Mac 用户可能会对 Homebrew
注意
第三方语言弃用:语言版本仅在供应商或社区共享EOL(生命周期结束)之前才受支持,如有更改,恕不另行通知。
还需要使用 Python 软件包安装程序和虚拟环境管理器。pip
virtualenv
Windows 安装的兼容 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
中进行编辑来调整用于运行应用程序的命令。
注意
在 Windows 上,你可能需要使用py可执行文件(适用于 Windows 的 >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 包安装程序安装和更新 AWS 构造库模块以供您的应用程序使用,以及您需要的其他包。pip pip还会自动安装这些模块的依赖关系。如果您的系统无法识别pip为独立命令,请以 Python 模块的pip形式调用,如下所示:
python -m pip
PIP-COMMAND
大多数 AWS CDK 构造都在。aws-cdk-lib
实验模块位于名为 like 的单独模块中aws-cdk.
。服务名称包含 a ws 前缀。如果您不确定模块的名称,请在 Py PI 上进行搜索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
注意
Python 版本的《CDKAPI参考资料》还显示了软件包名称。
用于将 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 中,你可以通过requirements.txt
为应用程序或setup.py
构造库输入依赖关系来指定依赖关系。然后使用该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每次开始使用项目时,都必须通过运行来激活此虚拟环境。在 Windows 上,.\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
。
参数和属性
所有 C AWS onstruct Library 类都使用三个参数进行实例化:定义构造的作用域(构造树中的父级)、id 和 props(构造函数用来配置其创建的资源的键/值对)。其他类和方法也使用 “属性包” 模式作为参数。
s@@ cop e 和 id 应始终作为位置参数而不是关键字参数传递,因为如果构造接受名为 s co pe 或 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 和核心之间进行转换)无法处理意外类型时,你可能会遇到运行时错误,而不是像静态类型语言 TypeScript 那样 AWS CDK在构建过程中出现类型错误。
根据我们的经验,Python 程序员犯的类型错误往往属于这些类别。
-
在构造需要容器(Python 列表或字典)的地方传递单个值,反之亦然。
-
将与第 1 层 (
CfnXxxxxx
) 构造关联的类型的值传递给 L2 或 L3 构造,反之亦然。
AWS CDK Python 模块确实包含类型注释,因此您可以使用支持它们的工具来帮助处理类型。如果您使用的不是支持这些IDE功能的,例如 PyCharm