

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護，並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 CDK 藍圖設定建構
<a name="blueprints"></a>

使用 AWS CDK 藍圖來標準化和分配整個組織的 L2 建構組態。使用藍圖，您可以確保 AWS 資源的設定符合組織標準和最佳實務。例如，您可以自動為所有 Amazon S3 儲存貯體啟用加密、將特定記錄組態套用至所有 AWS Lambda 函數，或強制執行所有安全群組的標準安全規則。

藍圖採用*屬性注入*技術，這是 AWS CDK v[2.196.0 中引入的機制](https://github.com/aws/aws-cdk/releases/tag/v2.196.0)，可讓您在執行個體化時修改建構屬性。藍圖是屬性注入器的集合，其中每個屬性注入器都會針對特定 L2 建構指定最佳組態。藍圖代表組織的整體最佳實務。

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

如需詳細的實作資訊，請參閱 [屬性注入 RFC](https://github.com/aws/aws-cdk-rfcs/blob/main/text/0693-property-injection.md)。

## 藍圖的關鍵元件
<a name="blueprints-key-pieces"></a>

藍圖是屬性注入器的集合，其會在執行個體化時將預設屬性套用至建構。屬性注入器是實作`IPropertyInjector`界面的元件，可攔截建構建立，並在建立建構之前修改或新增屬性。
+  **IPropertyInjector** - ` [IPropertyInjector](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.IPropertyInjector.html) `定義了注入未在 props 中指定之其他屬性的方法。它專屬於一個 L2 建構，並在該建構的屬性上運作。
+  **PropertyInjectors** - ` [PropertyInjectors](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.PropertyInjectors.html) `是連接到建構樹的注入器集合。注入器可以連接到任何建構模組，但實際上，我們預期大多數都連接到 `App`、 `Stage`或 `Stack`。

## 藍圖的常見使用案例
<a name="blueprints-use-cases"></a>

您可以使用 CDK 藍圖來標準化 AWS 資源的許多層面。以下是一些常見的使用案例：

 **安全標準**   
+ 確保所有 Amazon S3 儲存貯體都已啟用伺服器端加密。
+ 根據預設，設定所有安全群組以封鎖公開存取。
+ 將最低權限的 AWS Identity and Access Management (IAM) 許可套用至 AWS Lambda 函數。
+ 對所有網路通訊強制執行 SSL。

 **卓越營運**   
+ 設定所有 AWS Lambda 函數的標準化記錄。
+ 跨資源套用一致的標記策略。
+ 設定預設監控和提醒閾值。
+ 實作日誌和備份的標準保留政策。

 **成本最佳化**   
+ 根據環境設定適當的執行個體大小。
+ 使用組織預設值套用自動調整規模政策。
+ 設定 Amazon S3 儲存貯體的生命週期規則，將物件轉換為更便宜的儲存類別。
+ 設定資料庫的預設佈建輸送量。

 **合規要求**   
+ 實作管制資料所需的加密設定。
+ 針對資料保留需求套用必要的備份政策。
+ 設定符合安全要求的預設 Amazon VPC 設定。
+ 確保資源具有成本分配所需的標籤。

 **開發人員生產力**   
+ 提供合理的預設值，以減少對樣板程式碼的需求。
+ 使用內建注入器建立組織特定的堆疊類別。
+ 透過可重複使用的注入器跨團隊分享最佳實務。
+ 透過在程式碼中編碼組織知識來簡化入門。

## 藍圖入門
<a name="blueprints-getting-started"></a>

以下是如何建立和使用屬性注入器的簡單範例：

首先，為 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');
```

## 最佳實務
<a name="blueprints-best-practices"></a>
+ 將預設屬性放在 之前`…​originalProps`，以允許覆寫。
+ 在 之後放置強制屬性`…​originalProps`以防止覆寫。
+ 建立資源時使用略過旗標，以防止無限遞迴。如需範例，請參閱 *Property Injection RFC* 中的[當您需要為儲存貯體建立 accessLogBucket 時會發生什麼情況？](https://github.com/aws/aws-cdk-rfcs/blob/main/text/0693-property-injection.md#what-happens-when-you-need-to-create-a-accesslogbucket-for-a-bucket)。
+ 新增記錄以進行偵錯。
+ 使用 CDK 內容來啟用/停用注入器進行測試。

如需屬性注入的詳細資訊，包括實作詳細資訊、疑難排解秘訣和參考資訊，請參閱[屬性注入 RFC](https://github.com/aws/aws-cdk-rfcs/blob/main/text/0693-property-injection.md)。