使用 CDK 藍圖設定建構 - AWS 雲端開發套件 (AWS CDK) v2

這是 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 中引入的機制,可讓您在執行個體化時修改建構屬性。藍圖是屬性注入器的集合,其中每個屬性注入器會針對特定 L2 建構指定最佳組態。藍圖代表組織的整體最佳實務。

藍圖不是合規強制執行機制。開發人員仍然可以視需要覆寫預設值。若要嚴格強制執行合規,除了藍圖之外,請考慮使用 AWS CloudFormation Guard、服務控制政策或 CDK 面向。

如需詳細的實作資訊,請參閱 屬性注入 RFC

藍圖的關鍵元件

藍圖是屬性注入器的集合,其會在執行個體化時將預設屬性套用至建構。屬性注入器是實作IPropertyInjector界面的元件,可攔截建構建立,並在建立建構之前修改或新增屬性。

  • IPropertyInjector - IPropertyInjector 定義了注入未在 props 中指定之其他屬性的方法。它專屬於一個 L2 建構,並在該建構的屬性上運作。

  • PropertyInjectors - PropertyInjectors 是連接到建構樹的注入器集合。注入器可以連接到任何建構模組,但實際上,我們預期大多數都連接到 AppStageStack

藍圖的常見使用案例

您可以使用 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