

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

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

# AWS CDK アプリケーションのデプロイ
<a name="deploy"></a>

 AWS クラウド開発キット (AWS CDK) のデプロイは、インフラストラクチャをプロビジョニングするプロセスです AWS。

## AWS CDK デプロイの仕組み
<a name="deploy-how"></a>

 AWS CDK は AWS CloudFormation サービスを使用してデプロイを実行します。デプロイする前に、CDK スタックを合成します。これにより、アプリケーション内の各 CDK スタックの CloudFormation テンプレートとデプロイアーティファクトが作成されます。デプロイは、ローカル開発マシンまたは*継続的統合と継続的配信 (CI/CD)* 環境から開始されます。デプロイ中、アセットはブートストラップされたリソースにアップロードされ、CloudFormation テンプレートは CloudFormation に送信されて AWS リソースをプロビジョニングします。

デプロイを成功させるには、以下が必要です。
+  AWS CDK コマンドラインインターフェイス (AWS CDK CLI) には、有効なアクセス許可が必要です。
+  AWS 環境はブートストラップする必要があります。
+  AWS CDK は、アセットをアップロードするブートストラップされたリソースを認識している必要があります。

## CDK デプロイの前提条件
<a name="deploy-prerequisites"></a>

 AWS CDK アプリケーションをデプロイする前に、以下を完了する必要があります。
+ CDK CLI のセキュリティ認証情報を設定する。
+  AWS 環境をブートストラップします。
+ CDK スタックごとに AWS 環境を設定します。
+ CDK アプリを開発する。<a name="deploy-prerequisites-creds"></a>

 **セキュリティ認証情報を設定する**   
CDK CLI を使用して を操作するには AWS、ローカルマシンでセキュリティ認証情報を設定する必要があります。手順については、[AWS 「CDK CLI のセキュリティ認証情報を設定する](configure-access.md)」を参照してください。<a name="deploy-prerequisites-bootstrap"></a>

 ** AWS 環境のブートストラップ**   
デプロイは常に 1 つ以上の AWS [環境](environments.md)に関連付けられます。デプロイする前に、まず環境を[ブートストラップ](bootstrapping.md)する必要があります。ブートストラップは、CDK がデプロイの実行と管理に使用するリソースを環境内にプロビジョニングします。これらのリソースには、[アセット](assets.md)を保存および管理するための Amazon Simple Storage Service (Amazon S3) バケットと Amazon Elastic Container Registry (Amazon ECR) リポジトリなどがあります。これらのリソースには、開発およびデプロイ中にアクセス許可を提供するために使用される AWS Identity and Access Management (IAM) ロールも含まれます。  
環境をブートストラップするには、 AWS CDK コマンドラインインターフェイス (AWS CDK CLI) `cdk bootstrap` コマンドを使用することをお勧めします。必要に応じて、ブートストラップをカスタマイズすることや、環境内に手動でリソースを作成することができます。手順については、[AWS 「CDK で使用する環境のブートストラップ](bootstrapping-env.md)」を参照してください。<a name="deploy-prerequisites-env"></a>

 ** AWS 環境を設定する**   
各 CDK スタックは、スタックのデプロイ先を決定するために環境に関連付ける必要があります。手順については、[AWS 「CDK で使用する環境を設定する](configure-env.md)」を参照してください。<a name="deploy-prerequisites-develop"></a>

 **CDK アプリの開発**   
CDK [プロジェクト](projects.md) 内では、CDK アプリを作成および開発します。アプリ内では、CDK [スタック](stacks.md)を 1 つ以上作成します。スタック内では、[コンストラクト](constructs.md)ライブラリから AWS コンストラクトをインポートして使用して、インフラストラクチャを定義します。デプロイの前には、CDK アプリに少なくとも 1 つのスタックが含まれている必要があります。

## CDK アプリケーションの合成
<a name="deploy-how-synth"></a>

合成を実行する際は、CDK CLI の `cdk synth` コマンドを使用することをお勧めします。`cdk deploy` コマンドも、デプロイを開始する前に合成を実行はします。しかし、`cdk synth` を使用すると、デプロイを開始する前に CDK アプリを検証してエラーを検出してくれます。

合成の動作は、CDK スタック用に設定した[スタックシンセサイザー](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#stack-synthesizers)によって決まります。シンセサイザーを特に設定しない場合は、` [DefaultStackSynthesizer](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.DefaultStackSynthesizer.html) ` が使用されます。合成をニーズに合わせて設定およびカスタマイズすることもできます。手順については、「[CDK スタック合成を設定して実行する](configure-synth.md)」を参照してください。

合成された CloudFormation テンプレートを環境に正常にデプロイするには、環境のブートストラップ方法と互換性がある必要があります。たとえば、CloudFormation テンプレートは、アセットをデプロイする正しい Amazon S3 バケットを指定する必要があります。環境のブートストラップにデフォルトのメソッドを使用すると、デフォルトのスタックシンセサイザーが機能します。ブートストラップや合成のカスタマイズなど、CDK の動作をカスタマイズすると、CDK デプロイの動作が変化する場合があります。<a name="deploy-how-synth-app"></a>

 **アプリケーションのライフサイクル**   
合成を実行すると、CDK アプリケーションは、*アプリケーションのライフサイクル*と呼ばれる以下のフェーズを順に実行します。    
 **構築 (または初期化)**   
コードは、定義されたすべてのコンストラクトをインスタンス化し、それらをリンクします。このステージでは、すべてのコンストラクト (アプリケーション、スタック、およびそれらの子コンストラクト) がインスタンス化され、コンストラクターチェーンが実行されます。ほとんどのアプリケーションコードはこの段階で実行されます。  
 **準備**   
`prepare` メソッドを実装したすべてのコンストラクトは、最終状態を設定するための最終変更ラウンドに参加します。準備フェーズは自動的に行われます。このフェーズからのフィードバックは、ユーザーには表示されません。「準備」フックを使用する必要はまれであり、一般的には推奨されません。オペレーションの順序が動作に影響する可能性があるため、このフェーズでコンストラクトツリーをミューテーションするときは細心の注意を払ってください。  
このフェーズでは、コンストラクトツリーが構築されると、設定したすべての[アスペクト](aspects.md)も適用されます。  
 **検証**   
`validate` メソッドを実装したすべてのコンストラクトは、正しくデプロイされる状態であることを確認するための自己検証を行うことができます。このフェーズ中に発生した検証失敗は通知されます。通常、できるだけ早く (通常、入力が得られたらすぐに) 検証を実行し、できるだけ早く例外をスローすることをおすすめします。検証を早期に実行すると、スタックトレースの精度が向上し、コードを安全に実行し続けることができるため、信頼性が向上します。  
 **合成**   
これは、CDK アプリを実行する最後の段階です。`app.synth()` への呼び出しによってトリガーされ、コンストラクトツリーを横断し、すべてのコンストラクトで `synthesize` メソッドを呼び出します。`synthesize` を実装するコンストラクトは、合成に参加して、結果のクラウドアセンブリにデプロイアーティファクトを生成できます。これらのアーティファクトには、CloudFormation テンプレート、 AWS Lambda アプリケーションバンドル、ファイルおよび Docker イメージアセット、その他のデプロイアーティファクトが含まれます。ほとんどの場合、`synthesize` メソッドを実装する必要はありません。<a name="deploy-how-synth-run"></a>

 **アプリの実行**   
CDK CLI は、CDK アプリの実行方法を知る必要があります。`cdk init` コマンドを使用してテンプレートからプロジェクトを作成した場合、アプリの `cdk.json` ファイルには `app` キーが含まれます。このキーは、アプリケーションが書き込まれる言語に必要なコマンドを指定します。言語にコンパイルが必要な場合、コマンドラインはアプリを自動的に実行する前にこのステップを実行します。  

**Example**  

```
{
  "app": "npx ts-node --prefer-ts-exts bin/my-app.ts"
}
```

```
{
  "app": "node bin/my-app.js"
}
```

```
{
    "app": "python app.py"
}
```

```
{
  "app": "mvn -e -q compile exec:java"
}
```

```
{
  "app": "dotnet run -p src/MyApp/MyApp.csproj"
}
```

```
{
  "app": "go mod download && go run my-app.go"
}
```
CDK CLI を使用してプロジェクトを作成しなかった場合、または `cdk.json` で指定されたコマンドラインを上書きしたい場合は、`cdk` コマンドの実行時に ` --app ` オプションを指定します。

```
$ cdk --app '<executable>' <cdk-command> ...
```

コマンドの `<executable>` の部分は、CDK アプリケーションを実行するために実行する必要があるコマンドを示します。このようなコマンドにはスペースが含まれているため、図のように引用符を使用します。`<cdk-command>` は、`synth` や `deploy` のようなサブコマンドで、アプリケーションで実行したい内容を CDK CLI に指示します。これに続けて、そのサブコマンドに必要な追加オプションを指定します。

CDK CLI は、既に合成されたクラウドアセンブリを直接操作することもできます。これを行うには、クラウドアセンブリが保存されているディレクトリを `--app` で渡します。以下の例では、`./my-cloud-assembly` に格納されているクラウドアセンブリで定義されているスタックが一覧表示されます。

```
$ cdk --app <./my-cloud-assembly> ls
```<a name="deploy-how-synth-assemblies"></a>

 **クラウドアセンブリ**   
を呼び出すと、 `app.synth()`はアプリケーションからクラウドアセンブリを合成するように AWS CDK に指示します。通常、クラウドアセンブリを直接操作することはありません。これらは、アプリケーションをクラウド環境にデプロイするために必要なすべてを含むファイルです。たとえば、アプリ内のスタックごとに AWS CloudFormation テンプレートが含まれています。また、アプリで参照するファイルアセットまたは Docker イメージのコピーも含まれます。  
クラウドアセンブリのフォーマットの詳細については、「[クラウドアセンブリ仕様](https://github.com/aws/aws-cdk-cli/blob/main/packages/%40aws-cdk/cloud-assembly-schema/README.md)」を参照してください。  
 AWS CDK アプリケーションが作成するクラウドアセンブリを操作するには、通常、 AWS CDK CLI を使用します。もっとも、クラウドアセンブリ形式を読み取ることができるツールであれば、どれでもアプリケーションのデプロイに使用できます。

## アプリケーションをデプロイします
<a name="deploy-how-deploy"></a>

アプリケーションをデプロイするには、CDK CLI の `cdk deploy` コマンドを使用してデプロイを開始するか、自動デプロイを設定することをお勧めします。

`cdk deploy` を実行すると、CDK CLI はデプロイの準備として `cdk synth` を起動します。以下の図は、デプロイの文脈におけるアプリケーションのライフサイクルを示しています。

![<shared id="AWS"/> CDK アプリのライフサイクルのフローチャート。](http://docs.aws.amazon.com/ja_jp/cdk/v2/guide/images/app-lifecycle_cdk-flowchart.png)


デプロイ中、CDK CLI は合成によって生成されたクラウドアセンブリを受け取り、 AWS 環境にデプロイします。アセットは Amazon S3 と Amazon ECR にアップロードされ、CloudFormation テンプレートはデプロイのために AWS CloudFormation に送信されます。

 AWS CloudFormation デプロイフェーズが開始されるまでに、CDK アプリはすでに実行を終了し、終了します。これには、以下のような影響があります。
+ CDK アプリは、作成中のリソースやデプロイ全体の終了など、デプロイ中に発生するイベントには応答できません。デプロイフェーズ中にコードを実行するには、[カスタムリソース](cfn-layer.md#develop-customize-custom)として AWS CloudFormation テンプレートに挿入する必要があります。アプリケーションにカスタムリソースを追加する方法の詳細については、[「AWS CloudFormation モジュール」](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cloudformation-readme.html)、または[カスタムリソース](https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/custom-resource/)の例を参照してください。デプロイ中にコードを実行するように[トリガー](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.triggers-readme.html)モジュールを設定することもできます。
+ CDK アプリは、実行時にはわからない値を操作する必要がある場合があります。たとえば、 AWS CDK アプリが自動的に生成された名前で Amazon S3 バケットを定義し、 `bucket.bucketName` (Python: `bucket_name`) 属性を取得した場合、その値はデプロイされたバケットの名前ではありません。代わりに、`Token` の値が返されます。特定の値が使用可能かどうかを判断するには、`cdk.isUnresolved(value)` (Python: `is_unresolved`) を呼び出します。詳細については、[「トークンと AWS CDK](tokens.md)」を参照してください。<a name="deploy-how-deploy-permissions"></a>

 **デプロイのアクセス許可**   
デプロイを実行する前には、アクセス許可を確立する必要があります。以下の図は、デフォルトのブートストラッププロセスとスタックシンセサイザーを使用する場合に、デフォルトのデプロイ中に使用されるアクセス許可を示しています。  

![デフォルトの <shared id="AWS"/> CDK デプロイプロセスのフローチャート。](http://docs.aws.amazon.com/ja_jp/cdk/v2/guide/images/default-deploy-process_cdk_flowchart.png)
  
 **アクターがデプロイを開始する**   
デプロイは、*アクター*により、CDK CLI を使用して開始されます。アクターは、人物でも、 AWS CodePipeline などのサービスでもかまいません。  
必要に応じて、`cdk deploy` の実行時に CDK CLI が `cdk synth` を実行します。合成中、 AWS ID は環境でコンテキスト検索を実行する`LookupRole`ために を引き受けます AWS 。  
 **アクセス許可が確立されている**   
まず、アクターのセキュリティ認証情報を使用して、プロセスの最初の IAM ID を認証 AWS し、取得します。アクターが人間である場合、セキュリティ認証情報の設定と取得方法は、ユーザーまたは組織がユーザーを管理する方法によって異なります。詳細については、[AWS 「CDK CLI のセキュリティ認証情報を設定する](configure-access.md)」を参照してください。アクターが CodePipeline などのサービスである場合、IAM 実行ロールが引き受けられ、使用されます。  
次に、ブートストラップ中に AWS 環境で作成された IAM ロールを使用して、デプロイに必要なアクションを実行するためのアクセス許可を確立します。これらのロールおよびロールが付与するアクセス許可の詳細については、「[ブートストラップ中に作成された IAM ロール](bootstrapping-env.md#bootstrapping-env-roles)」を参照してください。このプロセスには以下が含まれます。  
+  AWS ID は`DeploymentActionRole`ロールを引き受け、`CloudFormationExecutionRole`ロールを CloudFormation に渡します。これにより、CloudFormation は AWS 環境でアクションを実行するときにロールを引き受けます。 は、環境へのデプロイを実行するアクセス許可`DeploymentActionRole`を付与し、CloudFormation が実行できるアクション`CloudFormationExecutionRole`を決定します。
+  AWS ID は`FilePublishingRole`、ブートストラップ中に作成された Amazon S3 バケットで実行できるアクションを決定する を引き受けます。
+  AWS ID は`ImagePublishingRole`、ブートストラップ中に作成された Amazon ECR リポジトリで実行できるアクションを決定する を引き受けます。
+ 必要に応じて、 AWS アイデンティティは を引き受け`LookupRole`て AWS 環境でコンテキストルックアップを実行します。このアクションは、テンプレートの合成中に実行することもできます。  
 **デプロイが実行される**   
デプロイ中、CDK CLI はブートストラップバージョンパラメータを読み取り、ブートストラップバージョン番号を確認します。 AWS CloudFormation はデプロイ時にこのパラメータも読み取り、確認します。デプロイワークフロー全体のアクセス許可が有効である場合、デプロイが実行されます。アセットはブートストラップされたリソースにアップロードされ、合成時に生成された CloudFormation テンプレートは CloudFormation サービスを CloudFormation スタックとして使用してデプロイされ、リソースがプロビジョニングされます。