

これは AWS CDK v2 デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 混合
<a name="mixins"></a>

ミキサーは、 `.with()`メソッドを使用してコンストラクトに適用する再利用可能な機能です。バージョニング、オブジェクトの自動削除、パブリックアクセスのブロックなど、L1 (CloudFormation レベル) コンストラクトと L2 (インテントベース) コンストラクトの両方に機能を追加します。各ミキサーは 1 つのリソースで機能します。2 つのリソースを接続するには、代わりに[ファサード](facades.md)を使用します。

各ミックスインは特定のリソースタイプをターゲットとし、そのリソースにちなんで命名されます。たとえば、 は Amazon S3 バケットを`BucketVersioning`ターゲットにします。などの各サービスモジュール`mixins`の名前空間からミックスインにアクセスします`s3.mixins`。

## ミキサーの適用
<a name="mixins-basic"></a>

すべてのコンストラクトで使用できる `.with()`メソッドを使用して、ミキサーを適用します。複数のミキサーを連結できます。

**Example**  

```
import * as s3 from 'aws-cdk-lib/aws-s3';

const bucket = new s3.CfnBucket(this, 'MyBucket')
  .with(new s3.mixins.BucketVersioning())
  .with(new s3.mixins.BucketBlockPublicAccess());
```

```
const s3 = require('aws-cdk-lib/aws-s3');

const bucket = new s3.CfnBucket(this, 'MyBucket')
  .with(new s3.mixins.BucketVersioning())
  .with(new s3.mixins.BucketBlockPublicAccess());
```

```
import aws_cdk.aws_s3 as s3

bucket = s3.CfnBucket(self, "MyBucket") \
    .with_(s3.mixins.BucketVersioning()) \
    .with_(s3.mixins.BucketBlockPublicAccess())
```

```
import software.amazon.awscdk.services.s3.*;

CfnBucket bucket = new CfnBucket(this, "MyBucket");
bucket.with(new BucketVersioning());
bucket.with(new BucketBlockPublicAccess());
```

```
using Amazon.CDK.AWS.S3;

var bucket = new CfnBucket(this, "MyBucket");
bucket.With(new BucketVersioning());
bucket.With(new BucketBlockPublicAccess());
```

```
bucket := awss3.NewCfnBucket(stack, jsii.String("MyBucket"), nil)
bucket.With(awss3.NewBucketVersioning())
bucket.With(awss3.NewBucketBlockPublicAccess())
```

各 mixin は、サポートするリソースタイプを宣言します。サポートされていないコンストラクトにミックスインを適用すると、サイレントにスキップされます。つまり、タイプの不一致を気にすることなく、ミクシンを広範囲に安全に適用できます。ミキサーが適用されていることを確認する必要がある場合は、 [`requireAll()`または `requireAny()`](#mixins-advanced)を使用します。

## L1 および L2 コンストラクトで Mixins を使用する
<a name="mixins-l1-l2"></a>

ミキサーは L1 コンストラクトと L2 コンストラクトの両方で機能します。ミックスインを L2 コンストラクトに適用すると、その背後にある L1 リソースにも適用されます。

次の例は、L1 コンストラクトと L2 コンストラクトの両方にミクシンを適用する方法を示しています。

**Example**  

```
import * as cdk from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';

// Using a mixin with an L1 construct
new s3.CfnBucket(this, 'L1Bucket')
  .with(new s3.mixins.BucketVersioning());

// Using a mixin with an L2 construct
new s3.Bucket(this, 'L2Bucket', {
  removalPolicy: cdk.RemovalPolicy.DESTROY,
}).with(new s3.mixins.BucketAutoDeleteObjects());
```

```
const cdk = require('aws-cdk-lib');
const s3 = require('aws-cdk-lib/aws-s3');

// Using a mixin with an L1 construct
new s3.CfnBucket(this, 'L1Bucket')
  .with(new s3.mixins.BucketVersioning());

// Using a mixin with an L2 construct
new s3.Bucket(this, 'L2Bucket', {
  removalPolicy: cdk.RemovalPolicy.DESTROY,
}).with(new s3.mixins.BucketAutoDeleteObjects());
```

```
import aws_cdk as cdk
import aws_cdk.aws_s3 as s3

# Using a mixin with an L1 construct
s3.CfnBucket(self, "L1Bucket") \
    .with_(s3.mixins.BucketVersioning())

# Using a mixin with an L2 construct
s3.Bucket(self, "L2Bucket",
    removal_policy=cdk.RemovalPolicy.DESTROY,
).with_(s3.mixins.BucketAutoDeleteObjects())
```

```
import software.amazon.awscdk.*;
import software.amazon.awscdk.services.s3.*;

// Using a mixin with an L1 construct
CfnBucket l1Bucket = new CfnBucket(this, "L1Bucket");
l1Bucket.with(new BucketVersioning());

// Using a mixin with an L2 construct
Bucket l2Bucket = Bucket.Builder.create(this, "L2Bucket")
        .removalPolicy(RemovalPolicy.DESTROY)
        .build();
l2Bucket.with(new BucketAutoDeleteObjects());
```

```
using Amazon.CDK;
using Amazon.CDK.AWS.S3;

// Using a mixin with an L1 construct
var l1Bucket = new CfnBucket(this, "L1Bucket");
l1Bucket.With(new BucketVersioning());

// Using a mixin with an L2 construct
var l2Bucket = new Bucket(this, "L2Bucket", new BucketProps
{
    RemovalPolicy = RemovalPolicy.DESTROY
});
l2Bucket.With(new BucketAutoDeleteObjects());
```

```
l1Bucket := awss3.NewCfnBucket(stack, jsii.String("L1Bucket"), nil)
l1Bucket.With(awss3.NewBucketVersioning())

l2Bucket := awss3.NewBucket(stack, jsii.String("L2Bucket"), &awss3.BucketProps{
    RemovalPolicy: awscdk.RemovalPolicy_DESTROY,
})
l2Bucket.With(awss3.NewBucketAutoDeleteObjects())
```

## 混合とコンストラクトのプロパティ
<a name="mixins-vs-props"></a>

混合プロパティとコンストラクトプロパティは連携します。L2 コンストラクトプロパティは、作成時にリソースを設定します。ミキサーはいつでも適用できます。

次の場合に L2 コンストラクトプロパティを使用する  
L2 コンストラクトを使用しており、必要な プロパティを使用できます。これは最も簡単なアプローチです。

次の場合に Mixins を使用する  
+ L1 コンストラクトを使用していて、L2-like機能が必要です。
+ プロパティとして使用できない L2 コンストラクトに機能を追加します。
+ 異なるタイプの複数のコンストラクトに同じ機能を適用する場合。

Mixins はコンストラクトプロパティを置き換えません。必須プロパティをオプションにしたり、デフォルト値を変更したりすることはできません。

## 複数のコンストラクトに Mixins を適用する
<a name="mixins-advanced"></a>

`Mixins.of()` API は、スコープ全体にミクシンがどのように適用されるかをより詳細に制御します。個々のコンストラクト`.with()`を呼び出す代わりに、スタックまたはスコープ内のすべての一致するコンストラクトに一度にミックスインを適用できます。

**Example**  

```
import { Mixins } from 'aws-cdk-lib';
import * as s3 from 'aws-cdk-lib/aws-s3';

// Apply to all supported constructs in the stack
Mixins.of(stack).apply(new s3.mixins.BucketVersioning());
```

```
const { Mixins } = require('aws-cdk-lib');
const s3 = require('aws-cdk-lib/aws-s3');

// Apply to all supported constructs in the stack
Mixins.of(stack).apply(new s3.mixins.BucketVersioning());
```

```
from aws_cdk import Mixins
import aws_cdk.aws_s3 as s3

# Apply to all supported constructs in the stack
Mixins.of(stack).apply(s3.mixins.BucketVersioning())
```

```
import software.amazon.awscdk.Mixins;
import software.amazon.awscdk.services.s3.*;

// Apply to all supported constructs in the stack
Mixins.of(stack).apply(new BucketVersioning());
```

```
using Amazon.CDK;
using Amazon.CDK.AWS.S3;

// Apply to all supported constructs in the stack
Mixins.Of(stack).Apply(new BucketVersioning());
```

```
awscdk.Mixins_Of(stack, nil).Apply(awss3.NewBucketVersioning())
```

デフォルトでは、ミキサーをサポートしていないコンストラクトはサイレントにスキップされます。`requireAll()` を使用して、ミキサーが選択内のすべてのコンストラクトに適用されることをアサート`requireAny()`するか、少なくとも 1 つに適用されることをアサートします。これは、リソースに必要な設定を強制するのに役立ちます。

**Example**  

```
// Throws an error if any construct in the scope doesn't support the mixin
Mixins.of(stack)
  .requireAll()
  .apply(new s3.mixins.BucketVersioning());
```

```
// Throws an error if any construct in the scope doesn't support the mixin
Mixins.of(stack)
  .requireAll()
  .apply(new s3.mixins.BucketVersioning());
```

```
# Throws an error if any construct in the scope doesn't support the mixin
Mixins.of(stack) \
    .require_all() \
    .apply(s3.mixins.BucketVersioning())
```

```
// Throws an error if any construct in the scope doesn't support the mixin
Mixins.of(stack)
        .requireAll()
        .apply(new BucketVersioning());
```

```
// Throws an error if any construct in the scope doesn't support the mixin
Mixins.Of(stack)
    .RequireAll()
    .Apply(new BucketVersioning());
```

```
awscdk.Mixins_Of(stack, nil).RequireAll().Apply(awss3.NewBucketVersioning())
```

## 混合と側面
<a name="mixins-aspects"></a>

ミックスと[アスペクト](aspects.md)は関連していますが、目的は異なります。
+  **混合**は、 を呼び出すとすぐに適用されます`.with()`。適用するコンストラクトを正確に選択します。
+  **アスペクトは**、合成中にスコープ内のすべてのコンストラクトに適用されます。広範なポリシーとチェックに使用します。

Mixins を使用して、特定のコンストラクトに機能を追加します。アスペクトを使用して、アプリケーション全体にルールを適用したり、変更を適用したりします。

## 関連リソース
<a name="mixins-related"></a>
+  [ファサード](facades.md) – リソースを IAM プリンシパルやその他のサービスに接続します。
+  [側面](aspects.md) – アプリケーション全体に変更を適用するか、コンストラクトを検証します。
+  [コンストラクト](constructs.md) – L1, L2、L3 コンストラクトについて説明します。
+  [コンストラクトのカスタマイズ](cfn-layer.md) – エスケープハッチと raw オーバーライドを使用してコンストラクトをカスタマイズします。