

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

# レイヤー 1 コンストラクト
<a name="layer-1"></a>

[L1 コンストラクト](https://docs.aws.amazon.com/cdk/v2/guide/constructs.html#constructs_l1_using)は AWS CDK の構成要素であり、`Cfn` というプレフィックスが付くため、他のコンストラクトと簡単に区別できます。例えば、AWS CDK の Amazon DynamoDB パッケージには、L2 コンストラクトである `Table` コンストラクトが含まれています。対応する L1 コンストラクトを `CfnTable` と呼び、これによって、CloudFormation DynamoDB `Table` を直接表します。通常、AWS CDK アプリケーションで L1 コンストラクトを直接使用することはありませんが、この最初のレイヤーにアクセスせずに AWS CDK を使用することは不可能です。ただし、ほとんどの場合、開発者が使い慣れている L2 および L3 コンストラクトは、L1 コンストラクトに大きく依存しているため、L1 コンストラクトは CloudFormation と AWS CDK 間の橋渡しをするものと考えると良いでしょう。

AWS CDK は、標準のコーディング言語を使用して CloudFormation テンプレートを生成することに特化しています。つまり、**cdk synth** CLI コマンドを実行し、CloudFormation テンプレートが生成されると、AWS CDK は仕事を終えます。利便性に配慮して **cdk deploy** コマンドが用意されていますが、これを実行すると、その処理は CloudFormation 内ですべて実行されます。CloudFormation で理解可能な形式に AWS CDK コードを変換する際に重要な役割を果たすのが、L1 コンストラクトなのです。

## AWS CDK と CloudFormation 間における、L1 コンストラクトのライフサイクル
<a name="l1-lifecycle"></a>

L1 コンストラクトを作成して使用するプロセスは、以下のステップで構成されます。

1. AWS CDK のビルドプロセスにより、CloudFormation の仕様が L1 コンストラクトの形式でプログラムコードに変換されます。

1. 開発者が、AWS CDK アプリケーションの一部として L1 コンストラクトを直接または間接的に参照するコードを記述します。

1. 開発者が、**cdk synth** コマンドを実行して、プログラムコードを CloudFormation 仕様 (テンプレート) で指定された形式に変換します。

1. 開発者が、**cdk deploy** コマンドを実行して、こうしたテンプレート内の CloudFormation スタックを AWS アカウント環境にデプロイします。

簡単な演習を行いましょう。GitHub の [AWS CDK オープンソースリポジトリ](https://github.com/aws/aws-cdk)にアクセスして、AWS サービスの 1 つをランダムに選択し、そのサービスの AWS CDK パッケージに移動します (次のようにフォルダをたどります: `packages`、`aws-cdk-lib`、`aws-<servicename>`、`lib`)。この例では Amazon S3 を選択しますが、どのサービスを使用しても動作します。そのパッケージのメイン [index.ts ファイル](https://github.com/aws/aws-cdk/blob/main/packages/aws-cdk-lib/aws-s3/lib/index.ts)を確認すると、次の行があります。

```
export * from './s3.generated';
```

ただし、対応するディレクトリのどこにも、`s3.generated` ファイルはありません。なぜなら、L1 コンストラクトは、AWS CDK ビルドプロセス中に [CloudFormation リソース仕様](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-resource-specification.html)に基づいて自動生成されるからです。そのため、対象のパッケージに AWS CDK ビルドコマンドを実行した後にのみ、パッケージ内に `s3.generated` が存在することになります。

## AWS CloudFormation リソース仕様
<a name="l1-spec"></a>

AWS CloudFormation リソース仕様は、AWS の Infrastructure as Code (IAC) を定義するとともに、この仕様によって、CloudFormation テンプレート内のコードをどのように AWS アカウントのリソースに変換するかを決定するものです。この仕様には、リージョンごとのレベルで、[JSON 形式](https://www.json.org/json-en.html)の AWS リソースが定義されています。各リソースには、`provider::service::resource` の形式に従い、一意の[リソースタイプ名](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)が付与されます。例えば、Amazon S3 バケットのリソースタイプには `AWS::S3::Bucket` という名前付き、Amazon S3 アクセスポイントのリソースタイプには `AWS::S3::AccessPoint` という名前が付きます。こうしたリソースタイプは、AWS CloudFormation リソース仕様で定義されている構文を使用して CloudFormation テンプレート内にレンダリングすることもできます。AWS CDK ビルドプロセスを実行すると、各リソースタイプも L1 コンストラクトに変換されます。

したがって、各 L1 コンストラクトは、対応する CloudFormation リソースがプログラムによってそのまま反映されたものです。CloudFormation テンプレートに適用するどのプロパティも、L1 コンストラクトのインスタンス化に使用でき、対応する L1 コンストラクトをインスタンス化する際にも、必要なすべての CloudFormation プロパティを引数に指定しなければなりません。次の表は、CloudFormation テンプレートに表された S3 バケットと、AWS CDK L1 コンストラクトとして定義した同じ S3 バケットを比較したものです。


| 
| 
| **CloudFormation テンプレート** | **L1 コンストラクト** | 
| --- |--- |
| <pre>"amzns3demobucket": {<br />    "Type": "AWS::S3::Bucket",<br />    "Properties": {<br />      "BucketName": "amzn-s3-demo-bucket",<br />      "BucketEncryption": {<br />        "ServerSideEncryptionConfiguration": [<br />          {<br />            "ServerSideEncryptionByDefault": {<br />              "SSEAlgorithm": "AES256"<br />            }<br />          }<br />        ]<br />      },<br />      "MetricsConfigurations": [<br />        {<br />          "Id": "myConfig"<br />        }<br />      ],<br />      "OwnershipControls": {<br />        "Rules": [<br />          {<br />            "ObjectOwnership": "BucketOwnerPreferred"<br />          }<br />        ]<br />      },<br />      "PublicAccessBlockConfiguration": {<br />        "BlockPublicAcls": true,<br />        "BlockPublicPolicy": true,<br />        "IgnorePublicAcls": true,<br />        "RestrictPublicBuckets": true<br />      },<br />      "VersioningConfiguration": {<br />        "Status": "Enabled"<br />      }<br />    }<br />  }</pre> | <pre>new CfnBucket(this, "amzns3demobucket", {<br />  bucketName: "amzn-s3-demo-bucket",<br />  bucketEncryption: {<br />    serverSideEncryptionConfiguration: [<br />      {<br />        serverSideEncryptionByDefault: {<br />          sseAlgorithm: "AES256"<br />        }<br />      }<br />    ]<br />  },<br />  metricsConfigurations: [<br />    {<br />      id: "myConfig"<br />    }<br />  ],<br />  ownershipControls: {<br />    rules: [<br />      {<br />        objectOwnership: "BucketOwnerPreferred"<br />      }<br />    ]<br />  },<br />  publicAccessBlockConfiguration: {<br />    blockPublicAcls: true,<br />    blockPublicPolicy: true,<br />    ignorePublicAcls: true,<br />    restrictPublicBuckets: true<br />  },<br />  versioningConfiguration: {<br />    status: "Enabled"<br />  }<br />});</pre> | 

ご覧のとおり、L1 コンストラクトは、CloudFormation リソースのコードを正確に示すマニフェストであり、ショートカットや単純化が行われないため、記述が必要なボイラープレートテキストの量はほぼ同じです。ただし、AWS CDK を使用する大きな利点の 1 つは、こうした CloudFormation 構文ボイラープレートの多くを排除しやすくなることです。これを可能にするために、有用なのが、L2 コンストラクトです。