这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 CDK 蓝图配置构造
注意
CDK 蓝图处于预览版,可能会发生变化。
使用 AWS CDK 蓝图在整个组织中标准化和分发 L2 构造配置。借助蓝图,您可以确保根据您的组织标准和最佳实践一致地配置 AWS 资源。例如,您可以自动为所有 Amazon S3 存储桶启用加密,将特定的日志配置应用于所有 Lamb AWS da 函数,或者对所有安全组强制执行标准安全规则。
蓝图由属性注入提供支持,这是一种在 AWS CDK v2.196.0
蓝图不是合规执法机制。如果需要,开发人员仍然可以覆盖默认值。为了严格执行合规性,除了蓝图之外,还可以考虑使用 AWS CloudFormation 警卫、服务控制策略或 CDK Aspects。
有关详细的实现信息,请参阅属性注入 RFC
蓝图的关键组件
蓝图是属性注入器的集合,它们在实例化构造时将默认属性应用于构造。属性注入器是实现IPropertyInjector
接口的组件,它拦截构造的创建,并在创建构造之前修改或添加属性。
-
IPropertyInjector-
IPropertyInjector
定义了一种注入道具中未指定的其他属性的方法。它特定于一个 L2 构造,并对该构造的属性进行操作。 -
PropertyInjectors-
PropertyInjectors
是附着在构造树上的注入器的集合。注入器可以连接到任何构造上,但实际上,我们预计它们中的大多数会附着在App
、Stage
或。Stack
蓝图的常见用例
您可以使用 CDK 蓝图对 AWS 资源的许多方面进行标准化。以下是一些常见的用例:
- 安全标准
-
-
确保所有 Amazon S3 存储桶都启用了服务器端加密。
-
默认情况下,将所有安全组配置为阻止公共访问。
-
对 Lambda 函数 AWS 应用权限最低的 AWS 身份和访问管理 (IAM) 权限。
-
对所有网络通信强制执行 SSL。
-
- 卓越运营
-
-
为所有 AWS Lambda 函数配置标准化日志。
-
在所有资源中应用一致的标记策略。
-
设置默认的监控和警报阈值。
-
对日志和备份实施标准保留政策。
-
- 成本优化
-
-
根据环境配置适当的实例大小。
-
应用具有组织默认值的自动缩放策略。
-
为 Amazon S3 存储桶设置生命周期规则,将对象转换为更便宜的存储类别。
-
为数据库配置默认的预配置吞吐量。
-
- 合规性要求
-
-
为受监管数据实施所需的加密设置。
-
应用必要的备份策略以满足数据保留要求。
-
配置符合安全要求的默认 Amazon VPC 设置。
-
确保资源具有成本分配所需的标签。
-
- 开发人员的工作效率
-
-
提供合理的默认值,以减少对样板代码的需求。
-
使用内置注入器创建组织特定的堆栈类。
-
通过可重复使用的注射器跨团队共享最佳实践。
-
通过在代码中编码组织知识来简化入职流程。
-
蓝图入门
以下是如何创建和使用属性注入器的简单示例:
首先,为 Amazon S3 存储桶创建一个属性注入器:
import { IPropertyInjector, InjectionContext } from 'aws-cdk-lib'; import { Bucket, BucketProps, BlockPublicAccess } from 'aws-cdk-lib/aws-s3'; export class SecureBucketDefaults implements IPropertyInjector { public readonly constructUniqueId: string; constructor() { this.constructUniqueId = Bucket.PROPERTY_INJECTION_ID; } public inject(originalProps: BucketProps, _context: InjectionContext): BucketProps { return { // Set security defaults blockPublicAccess: BlockPublicAccess.BLOCK_ALL, enforceSSL: true, // Include original props to allow overrides ...originalProps, }; } }
然后,在 CDK 应用程序中使用注射器:
import { App, Stack } from 'aws-cdk-lib'; import { Bucket } from 'aws-cdk-lib/aws-s3'; import { SecureBucketDefaults } from './secure-bucket-defaults'; // Attach injectors when creating the App const app = new App({ propertyInjectors: [new SecureBucketDefaults()] }); const stack = new Stack(app, 'MyStack'); // This bucket automatically gets the default properties const myBucket = new Bucket(stack, 'MyBucket');
或者,你可以使用以下PropertyInjectors.of()
方法:
import { App, Stack, PropertyInjectors } from 'aws-cdk-lib'; import { SecureBucketDefaults } from './secure-bucket-defaults'; const app = new App(); PropertyInjectors.of(app).add(new SecureBucketDefaults()); const stack = new Stack(app, 'MyStack'); const myBucket = new Bucket(stack, 'MyBucket');
最佳实践
-
将默认属性放在前面
…originalProps
以允许覆盖。 -
在后面放置强制属性
…originalProps
以防止覆盖。 -
创建资源时使用跳过标志以防止无限递归。有关示例,请参阅当你需要 accessLogBucket 为存储桶创建时会发生什么?
在属性注入 RFC 中。 -
添加用于调试的日志记录。
-
使用 CDK 上下文启用/禁用注射器进行测试。
有关属性注入的更多详细信息,包括实现细节、故障排除提示和参考信息,请参阅属性注入 RFC