

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

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

# 側面と AWS CDK
<a name="aspects"></a>

アスペクトは、特定のスコープ内のすべてのコンストラクトに操作を適用する方法です。このアスペクトでは、タグの追加などによってコンストラクトを変更できます。または、すべてのバケットが暗号化されていることを確認するなど、コンストラクトの状態について何かを検証することもできます。

1 つのコンストラクトおよび同じスコープ内のすべてのコンストラクトにアスペクトを適用するには、以下の例に示すように、新しいアスペクトで ` [Aspects](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.Aspects.html#static-ofscope).of(<SCOPE>).add()` を呼び出します。

**Example**  

```
Aspects.of(myConstruct).add(new SomeAspect(...));
```

```
Aspects.of(myConstruct).add(new SomeAspect(...));
```

```
Aspects.of(my_construct).add(SomeAspect(...))
```

```
Aspects.of(myConstruct).add(new SomeAspect(...));
```

```
Aspects.Of(myConstruct).add(new SomeAspect(...));
```

```
awscdk.Aspects_Of(stack).Add(awscdk.NewTag(...))
```

 AWS CDK は側面を使用して[リソースにタグ](tagging.md)を付けますが、フレームワークは他の目的でも使用できます。たとえば、これを使用して、高レベルのコンストラクトで定義されている AWS CloudFormation リソースを検証または変更できます。

## 側面とミクシン
<a name="aspects-vs-mixins"></a>

アスペクトと[ミクシン](mixins.md)はどちらもコンストラクトを変更しますが、いつどのように適用されるかは異なります。


| 機能 | アスペクト | 混合 | 
| --- | --- | --- | 
|   **適用時**   |  合成中、他のすべてのコードが実行された後。  |  `.with()` が呼び出された直後。  | 
|   **スコープ**   |  後で追加されたコンストラクトを含む、特定のスコープ内のすべてのコンストラクト。  |  明示的に適用するコンストラクトのみ。  | 
|   **[Style]** (スタイル)   |  宣言型 — ルールを設定し、CDK が適用します。  |  Imperative — 適用する対象と場所を選択します。  | 
|   **最適な用途**   |  検証、コンプライアンス、タグ付け、広範なポリシー。  |  個々のリソースに特定の機能を追加します。  | 

アプリケーション全体にルールを適用する場合や、コンストラクトが特定の基準を満たしていることを検証する場合は、アスペクトを使用します。特定のコンストラクトに特定の機能を追加する場合は、Mixins を使用します。

アスペクトとミクシンは一緒に使用できます。たとえば、Mixins を使用して個々のリソースとアスペクトを設定し、スタック内のすべてのリソースが組織のセキュリティ要件を満たしていることを検証できます。

## アスペクトの詳細
<a name="aspects-detail"></a>

アスペクトは[訪問者パターン](https://en.wikipedia.org/wiki/Visitor_pattern)を使用します。アスペクトは、以下のインターフェイスを実装するクラスです。

**Example**  

```
interface IAspect {
   visit(node: IConstruct): void;}
```
JavaScript には、言語機能としてのインターフェイスはありません。したがって、アスペクトは、運用されるノードを受け入れる `visit` メソッドを持つクラスのインスタンスです。
Python には言語機能としてのインターフェイスはありません。したがって、アスペクトは、運用されるノードを受け入れる `visit` メソッドを持つクラスのインスタンスです。

```
public interface IAspect {
    public void visit(Construct node);
}
```

```
public interface IAspect
{
    void Visit(IConstruct node);
}
```

```
type IAspect interface {
  Visit(node constructs.IConstruct)
}
```

`Aspects.of(<SCOPE>).add(…​)` を呼び出すと、コンストラクトはアスペクトの内部リストにアスペクトを追加します。`Aspects.of(<SCOPE>)` でリストを取得できます。

[準備フェーズ](deploy.md#deploy-how-synth-app)中、 AWS CDK はコンストラクトとその各子の オブジェクトの `visit`メソッドをトップダウンの順序で呼び出します。

`visit` メソッドは、コンストラクト内の任意の要素を自由に変更できます。強く型付けされた言語では、受信したコンストラクトをより具体的な型にキャストしてから、コンストラクト固有のプロパティやメソッドにアクセスします。

`Stages` は定義後は自己完結型で不変であるため、アスペクトは `Stage` コンストラクトの境界を越えては伝播しません。`Stage` 内のコンストラクトを訪問する場合は、`Stage` コンストラクト自体 (またはそれ以下) にアスペクトを適用します。

## 例
<a name="aspects-example"></a>

以下の例では、スタックで作成されたすべてのバケットでバージョニングが有効になっていることを検証します。このアスペクトは、検証に失敗したコンストラクトにエラー注釈を追加します。これにより、`synth` 操作が失敗し、結果として生成されたクラウドアセンブリのデプロイが防止されます。

**Example**  

```
class BucketVersioningChecker implements IAspect {
  public visit(node: IConstruct): void {
    // See that we're dealing with a CfnBucket
    if (node instanceof s3.CfnBucket) {

      // Check for versioning property, exclude the case where the property
      // can be a token (IResolvable).
      if (!node.versioningConfiguration
        || (!Tokenization.isResolvable(node.versioningConfiguration)
            && node.versioningConfiguration.status !== 'Enabled')) {
        Annotations.of(node).addError('Bucket versioning is not enabled');
      }
    }
  }
}

// Later, apply to the stack
Aspects.of(stack).add(new BucketVersioningChecker());
```

```
class BucketVersioningChecker {
   visit(node) {
    // See that we're dealing with a CfnBucket
    if ( node instanceof s3.CfnBucket) {

      // Check for versioning property, exclude the case where the property
      // can be a token (IResolvable).
      if (!node.versioningConfiguration
        || !Tokenization.isResolvable(node.versioningConfiguration)
            && node.versioningConfiguration.status !== 'Enabled')) {
        Annotations.of(node).addError('Bucket versioning is not enabled');
      }
    }
  }
}

// Later, apply to the stack
Aspects.of(stack).add(new BucketVersioningChecker());
```

```
@jsii.implements(cdk.IAspect)
class BucketVersioningChecker:

  def visit(self, node):
    # See that we're dealing with a CfnBucket
    if isinstance(node, s3.CfnBucket):

      # Check for versioning property, exclude the case where the property
      # can be a token (IResolvable).
      if (not node.versioning_configuration or
              not Tokenization.is_resolvable(node.versioning_configuration)
                  and node.versioning_configuration.status != "Enabled"):
          Annotations.of(node).add_error('Bucket versioning is not enabled')

# Later, apply to the stack
Aspects.of(stack).add(BucketVersioningChecker())
```

```
public class BucketVersioningChecker implements IAspect
{
    @Override
    public void visit(Construct node)
    {
        // See that we're dealing with a CfnBucket
        if (node instanceof CfnBucket)
        {
            CfnBucket bucket = (CfnBucket)node;
            Object versioningConfiguration = bucket.getVersioningConfiguration();
            if (versioningConfiguration == null ||
                    !Tokenization.isResolvable(versioningConfiguration.toString()) &&
                    !versioningConfiguration.toString().contains("Enabled"))
                Annotations.of(bucket.getNode()).addError("Bucket versioning is not enabled");
        }
    }
}

// Later, apply to the stack
Aspects.of(stack).add(new BucketVersioningChecker());
```

```
class BucketVersioningChecker : Amazon.Jsii.Runtime.Deputy.DeputyBase, IAspect
{
    public void Visit(IConstruct node)
    {
        // See that we're dealing with a CfnBucket
        if (node is CfnBucket)
        {
            var bucket = (CfnBucket)node;
            if (bucket.VersioningConfiguration is null ||
                    !Tokenization.IsResolvable(bucket.VersioningConfiguration) &&
                    !bucket.VersioningConfiguration.ToString().Contains("Enabled"))
                Annotations.Of(bucket.Node).AddError("Bucket versioning is not enabled");
        }
    }
}

// Later, apply to the stack
Aspects.Of(stack).add(new BucketVersioningChecker());
```