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)

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

Python在自动化、脚本编写和任务管理中表现出色。1)自动化:通过标准库如os、shutil实现文件备份。2)脚本编写:使用psutil库监控系统资源。3)任务管理:利用schedule库调度任务。Python的易用性和丰富库支持使其在这些领域中成为首选工具。

Python在科学计算中的应用包括数据分析、机器学习、数值模拟和可视化。1.Numpy提供高效的多维数组和数学函数。2.SciPy扩展Numpy功能,提供优化和线性代数工具。3.Pandas用于数据处理和分析。4.Matplotlib用于生成各种图表和可视化结果。
