Python 中的 AWS CDK 验证
AWS CDK应用生命周期中包含验证步骤,官方文档的CDK应用合成章节对此进行了说明:
所有已实现validate方法的构造都可以进行自验证,以确保其处于可正确部署的状态。此阶段发生的任何验证失败都会通知您。通常,我们建议尽快执行验证(通常是在获得某些输入后立即执行),并尽快抛出异常。尽早执行验证可以提高可靠性,因为堆栈跟踪将更准确,并确保您的代码可以安全地继续执行。
虽然有一些优秀的文章介绍了如何在TypeScript中处理AWS CDK验证(链接如下),但我找不到相应的Python示例。在Python中创建了一些验证之后,以下示例是对这些文章中示例的补充。
- AWS CDK构造中的验证检查
- 使用AWS CDK进行验证(addValidation)
以下示例使用AWS CDK v2.176.0和Python 3.13.1开发。
示例验证
验证的实现是使用返回错误消息列表的validate方法完成的。如果列表为空,则没有错误;多个条目对应于此验证失败的不同验证检查。验证逻辑封装在一个用@jsii.implements(IValidation)注解的类中,表明它是用于验证的正确类型。在本例中,有一个检查,即传递给验证的Amazon S3存储桶使用自定义AWS KMS密钥,与Amazon S3使用的默认加密相比,这提供了对加密过程的更多控制。
@jsii.implements(IValidation) class KodlotS3KmsValidator: """检查S3存储桶是否使用自定义KMS密钥加密。""" def __init__(self, s3_bucket: s3.Bucket): self.s3_bucket = s3_bucket def validate(self) -> List[str]: error_messages: List[str] = [] if self.s3_bucket.encryption_key is None: error_messages.append(f"存储桶必须使用自定义KMS密钥加密") return error_messages
AWS CDK构造示例
这是一个AWS CDK构造的基本示例,它使用构造节点在作用域树中的add_validation方法添加单个验证。在实现过程中出现了一个错误,其中创建了自定义AWS KMS密钥,但未将其传递给Amazon S3存储桶构造的encryption_key参数。
class KodlotS3Bucket(Construct): """带有验证的S3存储桶。""" def __init__(self, scope: Construct, construct_id: str, bucket_name: str) -> None: super().__init__(scope, construct_id) s3_kms_key = kms.Key(self, f"KodlotS3KmsKey{bucket_name.title()}") self.s3_bucket = s3.Bucket( self, f"KodlotS3{bucket_name.title()}", bucket_name=bucket_name, encryption_key=None, ) self.node.add_validation(KodlotS3KmsValidator(self.s3_bucket))
这种类型的错误很容易被忽略,这就是验证发挥作用的地方。使用此示例运行CDK合成或部署将导致以下错误:
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
多个验证
可以有多个验证器测试我们配置的不同方面,如果我们发现这样的常见模式,它们可以重复用于不同的构造。在此示例中,添加了一个验证检查,以确保Amazon S3存储桶未意外配置为静态网站托管,在这种情况下,这将是一个错误。
@jsii.implements(IValidation) class KodlotS3NotWebsiteValidator: """检查S3存储桶未配置为静态网站托管。""" def __init__(self, s3_bucket: s3.Bucket): self.s3_bucket = s3_bucket def validate(self) -> List[str]: error_messages: List[str] = [] if self.s3_bucket.is_website: error_messages.append(f"存储桶不能用于静态网站托管") return error_messages
更新后的AWS CDK构造示例
要使用附加验证器检查是否为Amazon S3存储桶配置了网站托管,请更新示例CDK构造,如下所示。这次,保留了不传递自定义AWS KMS密钥的原始错误。现在,此外,还错误地将website_index_document传递给Amazon S3存储桶构造,表明它将用于静态网站托管。
@jsii.implements(IValidation) class KodlotS3KmsValidator: """检查S3存储桶是否使用自定义KMS密钥加密。""" def __init__(self, s3_bucket: s3.Bucket): self.s3_bucket = s3_bucket def validate(self) -> List[str]: error_messages: List[str] = [] if self.s3_bucket.encryption_key is None: error_messages.append(f"存储桶必须使用自定义KMS密钥加密") return error_messages
这次,我们的Amazon S3存储桶有两个不同的问题,如下所示,验证机制报告了这两个问题。使用此示例运行CDK合成或部署将导致以下错误:
class KodlotS3Bucket(Construct): """带有验证的S3存储桶。""" def __init__(self, scope: Construct, construct_id: str, bucket_name: str) -> None: super().__init__(scope, construct_id) s3_kms_key = kms.Key(self, f"KodlotS3KmsKey{bucket_name.title()}") self.s3_bucket = s3.Bucket( self, f"KodlotS3{bucket_name.title()}", bucket_name=bucket_name, encryption_key=None, ) self.node.add_validation(KodlotS3KmsValidator(self.s3_bucket))
这非常强大,因为我们可以收集云基础设施中的不同配置问题,并在无需一次又一次地重新运行和修复它们的情况下解决所有问题。
AWS CDK堆栈验证
值得记住的是,验证并非仅限于AWS CDK构造,也可以添加到AWS CDK堆栈级别。在这里,我们可以例如检查给定的堆栈是否不包含不需要的资源。如果我们的要求是堆栈不应包含任何AWS Lambda资源,那么我们可以使用下面介绍的验证来模拟该要求。使用节点构造的子项,可以使用Python的内置isinstance函数检查任何资源是否是AWS CDK函数的实例。
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密</code>
AWS CDK堆栈示例
要为堆栈添加验证,我们使用与构造相同的add_validation方法。由于KodlotS3Stack被标识为必须不包含任何AWS Lambda函数的堆栈,因此它是测试示例堆栈验证的好地方。如果在开发过程中出现错误,例如下面介绍的错误,开发人员在其中定义了AWS Lambda函数资源,则验证将生效。
@jsii.implements(IValidation) class KodlotS3NotWebsiteValidator: """检查S3存储桶未配置为静态网站托管。""" def __init__(self, s3_bucket: s3.Bucket): self.s3_bucket = s3_bucket def validate(self) -> List[str]: error_messages: List[str] = [] if self.s3_bucket.is_website: error_messages.append(f"存储桶不能用于静态网站托管") return error_messages
运行此示例的CDK合成或部署将导致以下错误:
class KodlotS3Bucket(Construct): """带有验证的S3存储桶。""" def __init__(self, scope: Construct, construct_id: str, bucket_name: str) -> None: super().__init__(scope, construct_id) s3_kms_key = kms.Key(self, f"KodlotS3KmsKey{bucket_name.title()}") self.s3_bucket = s3.Bucket( self, f"KodlotS3{bucket_name.title()}", bucket_name=bucket_name, encryption_key=None, website_index_document="index.html", ) self.node.add_validation(KodlotS3KmsValidator(self.s3_bucket)) self.node.add_validation(KodlotS3NotWebsiteValidator(self.s3_bucket))
内置验证
还值得检查AWS CDK是否已经为我们云基础设施的某些方面提供了检查。在Amazon S3的上下文中,事实证明,如果我们将存储桶名称配置为k1,导致名称长度非法,则会出现以下内置错误:
<code>RuntimeError: Error: 验证失败,错误如下: [KodlotS3Stack/KodlotBucket1] 存储桶必须使用自定义KMS密钥加密 [KodlotS3Stack/KodlotBucket1] 存储桶不能用于静态网站托管</code>
同样,如果我们将存储桶名称配置为k_1,导致其中存在非法的下划线字符,则会出现以下内置错误:
@jsii.implements(IValidation) class KodlotNoLambdaInStackValidator: """检查给定堆栈中未定义任何Lambda函数。""" def __init__(self, stack: cdk.Stack): self.stack = stack def validate(self) -> List[str]: error_messages: List[str] = [] for construct in self.stack.node.children: if isinstance(construct, _lambda.Function): error_messages.append(f"堆栈不能包含任何Lambda函数") return error_messages
结论
AWS CDK验证是开发人员可以与单元测试和集成测试结合使用的有用机制,以确保云计算基础设施的整体质量。能够捕获常见的错误配置和定义标准将导致可重用的验证,这些验证可以在不同的组件之间共享。可以在AWS CDK定义的不同级别添加验证,包括AWS CDK构造和AWS CDK堆栈。很高兴看到AWS CDK已经捕获了一些常见的验证,因为它们是各种云服务和资源的基础,应该始终进行检查,从而减少在生产环境中遇到部署错误的可能性。
The code blocks are preserved and the image is referenced correctly. The overall structure and meaning remain the same, while the wording is altered for a more natural flow and to avoid direct repetition.
以上是Python 中的 AWS CDK 验证的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Linux终端中查看Python版本时遇到权限问题的解决方法当你在Linux终端中尝试查看Python的版本时,输入python...

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

在使用Python的pandas库时,如何在两个结构不同的DataFrame之间进行整列复制是一个常见的问题。假设我们有两个Dat...

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

Uvicorn是如何持续监听HTTP请求的?Uvicorn是一个基于ASGI的轻量级Web服务器,其核心功能之一便是监听HTTP请求并进�...

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...
