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)、虚拟环境和 Python 包安装程序pipvirtualenv构成 AWS 构造库的模块通过 pypi .org 分发。Python 版本的 eve AWS CDK n 使用了 Python 风格的标识符(例如,snake_case方法名称)。

您可以使用任何编辑器或IDE. 许多 AWS CDK 开发者使用 Visual Studio Code(或其开源代码 VSCodium),它通过官方扩展为 Python 提供了良好的支持。Python 中包含的IDLE编辑器足以开始使用。的 Python 模块 AWS CDK 确实有类型提示,这对于整理工具或支持类型验证IDE的工具很有用。

开始使用 Python

要使用 AWS CDK,您必须拥有 AWS 账户和凭证,并已安装 Node.js 和 AWS CDK Toolkit。请参阅 开始使用 AWS CDK

Python AWS CDK 应用程序需要 Python 3.6 或更高版本。如果您尚未安装,请在 python. org 上下载适用于您的操作系统的兼容版本。如果您运行的是 Linux,则您的系统可能带有兼容版本,或者您可以使用发行版的软件包管理器(yumapt、等)进行安装。Mac 用户可能会对 Homebrew 感兴趣,这是一款适用于 macOS 的 Linux 风格的软件包管理器。

注意

第三方语言弃用:语言版本仅在供应商或社区共享EOL(生命周期结束)之前才受支持,如有更改,恕不另行通知。

还需要使用 Python 软件包安装程序和虚拟环境管理器。pip virtualenvWindows 安装的兼容 Python 版本包括这些工具。在 Linux 上pipvirtualenv可以在你的软件包管理器中作为单独的软件包提供。或者,您可以使用以下命令安装它们:

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 版本。

如果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.SERVICE-NAME.alpha。服务名称包含 a ws 前缀。如果您不确定模块的名称,请在 Py PI 上进行搜索。例如,下面的命令安装该 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

注意

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 freezepip 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 pip command 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 类都使用三个参数进行实例化:定义构造的作用域(构造树中的父级)、idprops(构造函数用来配置其创建的资源的键/值对)。其他类和方法也使用 “属性包” 模式作为参数。

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 不像其他一些语言那样具有接口功能,尽管它确实有类似的抽象基类。(如果你不熟悉界面,维基百科有一个很好的介绍。) TypeScript,实现时所 AWS CDK 用的语言确实提供了接口,而构造和其他 AWS CDK 对象通常需要一个附属于特定接口的对象,而不是从特定类继承的对象。因此,作为JSII层的一部分, AWS CDK 提供了自己的接口功能。

要表示一个类实现了特定的接口,你可以使用@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,则可能需要调用MyPy类型验证器作为构建过程中的一个步骤。还有一些运行时类型检查器可以改进与类型相关的错误的错误消息。