這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 CDK 藍圖設定建構
注意
CDK 藍圖處於預覽版本中,可能會有所變更。
使用 AWS CDK 藍圖來標準化和分佈整個組織的 L2 建構組態。使用藍圖,您可以確保 AWS 資源的設定符合組織標準和最佳實務。例如,您可以自動為所有 Amazon S3 儲存貯體啟用加密、將特定記錄組態套用至所有 AWS Lambda 函數,或強制執行所有安全群組的標準安全規則。
藍圖採用屬性注入技術,這是 AWS CDK v2.196.0 中引入的機制
藍圖不是合規強制執行機制。開發人員仍然可以視需要覆寫預設值。若要嚴格強制執行合規,除了藍圖之外,請考慮使用 AWS CloudFormation Guard、服務控制政策或 CDK 面向。
如需詳細的實作資訊,請參閱 屬性注入 RFC
藍圖的關鍵元件
藍圖是屬性注入器的集合,其會在執行個體化時將預設屬性套用至建構。屬性注入器是實作IPropertyInjector
界面的元件,可攔截建構建立,並在建立建構之前修改或新增屬性。
-
IPropertyInjector -
IPropertyInjector
定義了注入未在 props 中指定之其他屬性的方法。它專屬於一個 L2 建構,並在該建構的屬性上運作。 -
PropertyInjectors -
PropertyInjectors
是連接到建構樹的注入器集合。注入器可以連接到任何建構模組,但實際上,我們預期大多數都連接到App
、Stage
或Stack
。
藍圖的常見使用案例
您可以使用 CDK 藍圖來標準化 AWS 資源的許多層面。以下是一些常見的使用案例:
- 安全標準
-
-
確保所有 Amazon S3 儲存貯體都已啟用伺服器端加密。
-
根據預設,設定所有安全群組以封鎖公開存取。
-
將最低權限的 AWS Identity and Access Management (IAM) 許可套用至 AWS Lambda 函數。
-
對所有網路通訊強制執行 SSL。
-
- 卓越營運
-
-
設定所有 AWS Lambda 函數的標準化記錄。
-
跨資源套用一致的標記策略。
-
設定預設監控和提醒閾值。
-
實作日誌和備份的標準保留政策。
-
- 成本最佳化
-
-
根據環境設定適當的執行個體大小。
-
使用組織預設值套用自動調整規模政策。
-
設定 Amazon S3 儲存貯體的生命週期規則,將物件轉換為更便宜的儲存類別。
-
設定資料庫的預設佈建輸送量。
-
- 合規要求
-
-
實作管制資料所需的加密設定。
-
針對資料保留需求套用必要的備份政策。
-
設定符合安全要求的預設 Amazon VPC 設定。
-
確保資源具有成本分配所需的標籤。
-
- 開發人員生產力
-
-
提供合理的預設值,以減少對樣板程式碼的需求。
-
使用內建注入器建立組織特定的 Stack 類別。
-
透過可重複使用的注入器跨團隊分享最佳實務。
-
透過在程式碼中編碼組織知識來簡化加入。
-
藍圖入門
以下是如何建立和使用屬性注入器的簡單範例:
首先,為 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
以防止覆寫。 -
建立資源時使用略過旗標,以防止無限遞迴。如需範例,請參閱 Property Injection RFC 中的當您需要為儲存貯體建立 accessLogBucket 時會發生什麼情況?
。 -
新增記錄以進行偵錯。
-
使用 CDK 內容來啟用/停用注入器進行測試。
如需屬性注入的詳細資訊,包括實作詳細資訊、疑難排解秘訣和參考資訊,請參閱屬性注入 RFC