

これは 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 [v2.196.0](https://github.com/aws/aws-cdk/releases/tag/v2.196.0) で導入されたメカニズムである*プロパティインジェクション*を使用しています。ブループリントはプロパティインジェクターのコレクションであり、各プロパティインジェクターは特定の L2 コンストラクトに最適な設定を指定します。ブループリントは、組織の全体的なベストプラクティスを表します。

ブループリントはコンプライアンスの適用メカニズムではありません。開発者は、必要に応じてデフォルトを上書きできます。コンプライアンスを厳しく適用するには、ブループリントに加えて AWS CloudFormation ガード、サービスコントロールポリシー、または 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 で指定されていない追加のプロパティを注入する方法を定義します。これは 1 つの 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` の後に強制プロパティを配置します。
+ 無限再帰を防ぐために、リソースの作成時にスキップフラグを使用します。例については、「*プロパティインジェクション 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)」を参照してください。