AWS CDK ライブラリの使用 - AWS Cloud Development Kit (AWS CDK) v2

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

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

AWS CDK ライブラリの使用

AWS Cloud Development Kit (AWS CDK) ライブラリをインポートして使用し、サポートされているプログラミング言語を使用して AWS クラウド インフラストラクチャを定義します。

AWS CDK ライブラリのインポート

AWS CDK ライブラリは、多くの場合は aws-cdk-lib という TypeScript パッケージ名で参照されます。実際のパッケージ名は言語によって異なります。次の内容は、CDK ライブラリをインストールしてインポートする方法の例です。

TypeScript
インストール npm install aws-cdk-lib
Import import * as cdk from 'aws-cdk-lib';
JavaScript
インストール npm install aws-cdk-lib
Import const cdk = require('aws-cdk-lib');
Python
インストール python -m pip install aws-cdk-lib
Import import aws_cdk as cdk
Java
pom.xml に追加 Group software.amazon.awscdk; artifact aws-cdk-lib
Import import software.amazon.awscdk.App;
C#
インストール dotnet add package Amazon.CDK.Lib
Import using Amazon.CDK;
Go
インストール go get github.com/aws/aws-cdk-go/awscdk/v2
Import
import ( "github.com/aws/aws-cdk-go/awscdk/v2" )

construct ベースクラスおよびサポートコードは constructs ライブラリにあります。API がまだ改良中である実験コンストラクトは、個別のモジュールとして分散されます。

AWS CDK API リファレンスの使用

AWS CDK で開発するときは、AWS CDK API リファレンスを使用します。

各モジュールのリファレンスマテリアルは、次のセクションに分かれています。

  • 概要: 概念および例を含め、AWS CDK のサービスを使用するために知る必要がある入門資料。

  • コンストラクト: 1 つ以上の具体的な AWS リソースを表すライブラリクラス。これらは「キュレートされた」(L2) リソースまたはパターン (L3 リソース) であり、正しいデフォルトを持つ高レベルのインターフェイスを提供します。

  • クラス: モジュールのコンストラクトによって使用される機能を提供する非コンストラクトクラス。

  • 構造: プロパティ (コンストラクトの props 引数) やオプションなどの複合値の構造を定義するデータ構造 (属性バンドル)。

  • インターフェイス: 名前が「I」で始まるすべてのインターフェイスは、対応するコンストラクトまたは他のクラスの絶対最小機能を定義します。CDK はコンストラクトインターフェイスを使用して、AWS CDK アプリ外で定義されて Bucket.fromBucketArn() などのメソッドで参照された AWS リソースを表します。

  • 列挙型: 特定のコンストラクトパラメータの指定に使用する名前付き値のコレクション。列挙値を使用すると、CDK が合成中にこれらの値の有効性を確認できるようにします。

  • CloudFormation リソース: 名前が「Cfn」で始まるこれらの L1 コンストラクトは、CloudFormation 仕様で定義されているリソースを正確に表しています。CDK リリースごとにその仕様から自動的に生成されます。各 L2 または L3 コンストラクトは、1 つ以上の CloudFormation リソースをカプセル化します。

  • CloudFormation のプロパティタイプ: 各 CloudFormation リソースのプロパティを定義する名前付き値のコレクション。

コンストラクトクラスと比較したインターフェイス

インターフェイスをプログラミングの概念として理解している場合でも、AWS CDK は明確ではない特定の方法でインターフェイスを使用します。

AWS CDK は、Bucket.fromBucketArn() などのメソッドを使用して CDK アプリケーション外で定義されたリソースの使用をサポートします。外部リソースは変更できず、Bucket クラスなどを使用して CDK アプリで定義されたリソースで利用可能な機能がすべて揃っていない場合があります。次に、インターフェイスは特定の AWS リソースタイプ (外部リソースを含む) の CDK で利用可能な最小限の機能を表します。

CDK アプリでリソースをインスタンス化するとき、Bucket などの具体的なクラスを常に使用する必要があります。独自のコンストラクトのいずれかで受け入れる引数のタイプを指定するとき、外部リソースを処理する準備ができている場合、IBucket などのインターフェイスタイプを使用します (つまり、変更が不要)。CDK で定義されたコンストラクトが必要な場合、使用できる最も一般的なタイプを指定します。

一部のインターフェイスは、コンストラクトではなく、特定のクラスに関連付けられたプロパティまたはオプションバンドルの最小バージョンです。このようなインターフェイスは、親クラスに渡す引数を受け入れるようにサブクラス化するときに便利です。1 つ以上の追加プロパティが必要な場合、このインターフェイスまたはより具体的なタイプから実装または取得する必要があります。

注記

AWS CDK でサポートされている一部のプログラミング言語には、インターフェイス機能がありません。これらの言語では、インターフェイスは通常のクラスにすぎません。頭文字の「I」の後に他のコンストラクトの名前 (例えば、IBucket) が続くパターンに従う名前で特定できます。同じルールが適用されます。

依存関係の管理

AWS CDK アプリまたはライブラリの依存関係は、パッケージ管理ツールを使用して管理されます。これらのツールはプログラミング言語で一般的に使用されます。

通常、AWS CDK は言語の基準をサポートするか、公式パッケージ管理ツールがある場合はそれをサポートします。それ以外の場合、AWS CDK は言語の最も人気または広くサポートされているものをサポートします。特にサポートされているツールに対応している場合、他のツールも使用できる場合があります。ただし、他のツールの公式サポートは限られています。

AWS CDK は、次のパッケージマネージャーをサポートしています。

言語 サポートされているパッケージ管理ツール
TypeScript/JavaScript NPM (ノードパッケージマネージャー) または Yarn
Python PIP (Python のパッケージインストーラ)
Java Maven
C# NuGet
Go Go モジュール

AWS CDK CLI cdk init コマンドを使用して新しいプロジェクトを作成するとき、CDK コアライブラリおよび安定したコンストラクトの依存関係が自動的に指定されます。

サポートされているプログラミング言語の依存関係の管理における詳細については、次の内容を参照してください。

TypeScript の AWS CDK を他の言語と比較

TypeScript は、AWS CDK アプリケーションの開発でサポートされている最初の言語でした。したがって、大量の CDK コード例は TypeScript に記述されています。別の言語で開発している場合、TypeScript で AWS CDK コードが実装されている方法を、選択した言語と比較すると便利です。ドキュメント全体の例を使用できるようになります。

モジュールのインポート

TypeScript/JavaScript

TypeScript は名前空間全体のインポート、あるいは名前空間から個々のオブジェクトのインポートのいずれかをサポートしています。各名前空間には、特定の AWS サービスで使用するコンストラクトやその他のクラスが含まれます。

// Import main CDK library as cdk import * as cdk from 'aws-cdk-lib'; // ES6 import preferred in TS const cdk = require('aws-cdk-lib'); // Node.js require() preferred in JS // Import specific core CDK classes import { Stack, App } from 'aws-cdk-lib'; const { Stack, App } = require('aws-cdk-lib'); // Import AWS S3 namespace as s3 into current namespace import { aws_s3 as s3 } from 'aws-cdk-lib'; // TypeScript const s3 = require('aws-cdk-lib/aws-s3'); // JavaScript // Having imported cdk already as above, this is also valid const s3 = cdk.aws_s3; // Now use s3 to access the S3 types const bucket = s3.Bucket(...); // Selective import of s3.Bucket import { Bucket } from 'aws-cdk-lib/aws-s3'; // TypeScript const { Bucket } = require('aws-cdk-lib/aws-s3'); // JavaScript // Now use Bucket to instantiate an S3 bucket const bucket = Bucket(...);
Python

TypeScript と同様に、Python は名前空間モジュールインポートおよび選択的インポートをサポートしています。Python の名前空間は aws_cdk.xxx に似ており、xxx は Amazon S3 の s3 などの AWS サービス名を表します。(Amazon S3 はこれらの例で使用されます)。

# Import main CDK library as cdk import aws_cdk as cdk # Selective import of specific core classes from aws_cdk import Stack, App # Import entire module as s3 into current namespace import aws_cdk.aws_s3 as s3 # s3 can now be used to access classes it contains bucket = s3.Bucket(...) # Selective import of s3.Bucket into current namespace from aws_cdk.s3 import Bucket # Bucket can now be used to instantiate a bucket bucket = Bucket(...)
Java

Java のインポートは、TypeScript のものとは動作が異なります。各インポートステートメントは、特定のパッケージから 1 つのクラス名、あるいはそのパッケージで定義されているすべてのクラス (* を使用) のいずれかをインポートします。クラス名がインポートされている場合はクラス名の単体、あるいはパッケージを含む修飾クラス名のいずれかを使用し、クラスにアクセスできます。

ライブラリは AWS コンストラクトライブラリ (メインライブラリは software.amazon.awscdk です) に対して software.amazon.awscdk.services.xxx のような名前が付けられます。AWS CDK パッケージの Maven グループ ID は software.amazon.awscdk です。

// Make certain core classes available import software.amazon.awscdk.Stack; import software.amazon.awscdk.App; // Make all Amazon S3 construct library classes available import software.amazon.awscdk.services.s3.*; // Make only Bucket and EventType classes available import software.amazon.awscdk.services.s3.Bucket; import software.amazon.awscdk.services.s3.EventType; // An imported class may now be accessed using the simple class name (assuming that name // does not conflict with another class) Bucket bucket = Bucket.Builder.create(...).build(); // We can always use the qualified name of a class (including its package) even without an // import directive software.amazon.awscdk.services.s3.Bucket bucket = software.amazon.awscdk.services.s3.Bucket.Builder.create(...) .build(); // Java 10 or later can use var keyword to avoid typing the type twice var bucket = software.amazon.awscdk.services.s3.Bucket.Builder.create(...) .build();
C#

C# では、using ディレクティブを使用してタイプをインポートします。2 つの形式があります。1 つはプレーン名を使用し、指定された名前空間のすべてのタイプにアクセスできます。もう 1 つは、エイリアスを使用して名前空間自体を参照できます。

パッケージには、AWS コンストラクトライブラリパッケージに Amazon.CDK.AWS.xxx のような名前が付けられます。(コアモジュールは Amazon.CDK)

// Make CDK base classes available under cdk using cdk = Amazon.CDK; // Make all Amazon S3 construct library classes available using Amazon.CDK.AWS.S3; // Now we can access any S3 type using its name var bucket = new Bucket(...); // Import the S3 namespace under an alias using s3 = Amazon.CDK.AWS.S3; // Now we can access an S3 type through the namespace alias var bucket = new s3.Bucket(...); // We can always use the qualified name of a type (including its namespace) even without a // using directive var bucket = new Amazon.CDK.AWS.S3.Bucket(...)
Go

各 AWS コンストラクトライブラリモジュールは Go パッケージとして提供されます。

import ( "github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module ) // now instantiate a bucket bucket := awss3.NewBucket(...) // use aliases for brevity/clarity import ( cdk "github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module ) bucket := s3.NewBucket(...)

コンストラクトのインスタンス化

AWS CDK コンストラクトクラスの名前は、サポートされているすべての言語で同じです。ほとんどの言語は、new キーワードを使用してクラスをインスタンス化します (Python と Go はしません)。また、ほとんどの言語ではキーワードは this 現在のインスタンスを参照します。(Python は 規則で self を使用します) 作成するすべてのコンストラクトに対し、scope パラメータとして現在のインスタンスに参照を渡す必要があります。

AWS CDK コンストラクトの 3 番目の引数は props であり、コンストラクトの構築に必要な属性を含むオブジェクトです。この引数はオプションですが、必要なときはサポートされている言語が特異な方法で処理します。属性の名前は、言語の標準命名パターンにも適応されています。

TypeScript/JavaScript
// Instantiate default Bucket const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket'); // Instantiate Bucket with bucketName and versioned properties const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { bucketName: 'amzn-s3-demo-bucket', versioned: true, }); // Instantiate Bucket with websiteRedirect, which has its own sub-properties const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', { websiteRedirect: {host: 'aws.amazon.com'}});
Python

Python は、クラスをインスタンス化するときに new キーワードを使用しません。プロパティ引数はキーワード引数を使用して表され、引数は snake_case を使用して名前が付けられます。

props 値自体が属性のバンドルである場合、プロパティの後に名前が付けられたクラスで表され、サブプロパティのキーワード引数を受け入れます。

Python では、現在のインスタンスは最初の引数としてメソッドに渡されます。この引数は、規則によって self という名前が付けられます。

# Instantiate default Bucket bucket = s3.Bucket(self, "amzn-s3-demo-bucket") # Instantiate Bucket with bucket_name and versioned properties bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", versioned=true) # Instantiate Bucket with website_redirect, which has its own sub-properties bucket = s3.Bucket(self, "amzn-s3-demo-bucket", website_redirect=s3.WebsiteRedirect( host_name="aws.amazon.com"))
Java

Java では、props 引数は XxxxProps という名前のクラス (例えば、Bucket コンストラクトの props に BucketProps) で表されます。ビルダーパターンを使用して props 引数を構築します。

XxxxProps クラスにはビルダーがあります。次の例で示すように、1 つのステップで props およびコンストラクトを構築する各コンストラクトに便利なビルダーもあります。

Props は、camelCase を使用して TypeScript と同じように名前が付けられます。

// Instantiate default Bucket Bucket bucket = Bucket(self, "amzn-s3-demo-bucket"); // Instantiate Bucket with bucketName and versioned properties Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket") .bucketName("amzn-s3-demo-bucket").versioned(true) .build(); # Instantiate Bucket with websiteRedirect, which has its own sub-properties Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket") .websiteRedirect(new websiteRedirect.Builder() .hostName("aws.amazon.com").build()) .build();
C#

C# では、XxxxProps という名前のクラスにオブジェクト初期化子を使用して props が指定されます (例えば、Bucket コンストラクトの props に BucketProps)。

Props は TypeScript と同様に名前が付けられますが、PascalCase が使用されます。

コンストラクトをインスタンス化するときに var キーワードを使用するのが便利なため、クラス名を 2 回入力する必要はありません。ただし、ローカルコードのスタイルガイドは異なる場合があります。

// Instantiate default Bucket var bucket = Bucket(self, "amzn-s3-demo-bucket"); // Instantiate Bucket with BucketName and Versioned properties var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps { BucketName = "amzn-s3-demo-bucket", Versioned = true}); // Instantiate Bucket with WebsiteRedirect, which has its own sub-properties var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps { WebsiteRedirect = new WebsiteRedirect { HostName = "aws.amazon.com" }});
Go

Go でコンストラクトを作成するには、Xxxxxxx がコンストラクトの名前である NewXxxxxx 関数を呼び出します。コンストラクトのプロパティは構造として定義されます。

Go では、すべてのコンストラクトパラメータはポインタであり、数値、ブール値、文字列などの値を含みます。jsii.String などの便利な関数を使用してこれらのポインタを作成します。

// Instantiate default Bucket bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), nil) // Instantiate Bucket with BucketName and Versioned properties bucket1 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ BucketName: jsii.String("amzn-s3-demo-bucket"), Versioned: jsii.Bool(true), }) // Instantiate Bucket with WebsiteRedirect, which has its own sub-properties bucket2 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ WebsiteRedirect: &awss3.RedirectTarget{ HostName: jsii.String("aws.amazon.com"), }})

メンバーへのアクセス

コンストラクトおよびその他の AWS CDK クラスの属性やプロパティを参照し、これらの値を (例えば) 入力として使用して他のコンストラクトを構築することは一般的です。メソッドの前述の名前付けによる違いは、ここでも適用されます。さらに、Java ではメンバーに直接アクセスすることはできません。代わりに、ゲッターメソッドが用意されています。

TypeScript/JavaScript

名前は camelCase です。

bucket.bucketArn
Python

名前は snake_case です。

bucket.bucket_arn
Java

各プロパティにはゲッターメソッドが用意されています。これらの名前は camelCase です。

bucket.getBucketArn()
C#

名前は PascalCase です。

bucket.BucketArn
Go

名前は PascalCase です。

bucket.BucketArn

列挙型定数

列挙型定数はクラスにスコープされ、すべての言語で下線が付いた大文字の名前があります (SCREAMING_SNAKE_CASE と呼ばれることもあります)。クラス名は Go を除くサポートされているすべての言語でも同じケーシングを使用するため、修飾された列挙型名はこれらの言語でも同じです。

s3.BucketEncryption.KMS_MANAGED

Go では、列挙型定数はモジュール名前空間の属性であり、次のように記述されます。

awss3.BucketEncryption_KMS_MANAGED

オブジェクトインターフェイス

AWS CDK は TypeScript オブジェクトインターフェイスを使用し、クラスが予想されるメソッドおよびプロパティのセットを実装していることを示します。オブジェクトインターフェイスの名前の頭文字が I であるため、識別できます。具体的なクラスは、implements キーワードを使用して実装するインターフェイスを示します。

TypeScript/JavaScript
注記

JavaScript にはインターフェイス機能はありません。implements キーワードおよびその後に続くクラス名を無視してください。

import { IAspect, IConstruct } from 'aws-cdk-lib'; class MyAspect implements IAspect { public visit(node: IConstruct) { console.log('Visited', node.node.path); } }
Python

Python にはインターフェイス機能はありません。ただし、AWS CDK にはクラスを @jsii.implements(interface) で装飾することでインターフェイスの実装を示すことができます。

from aws_cdk import IAspect, IConstruct import jsii @jsii.implements(IAspect) class MyAspect(): def visit(self, node: IConstruct) -> None: print("Visited", node.node.path)
Java
import software.amazon.awscdk.IAspect; import software.amazon.awscdk.IConstruct; public class MyAspect implements IAspect { public void visit(IConstruct node) { System.out.format("Visited %s", node.getNode().getPath()); } }
C#
using Amazon.CDK; public class MyAspect : IAspect { public void Visit(IConstruct node) { System.Console.WriteLine($"Visited ${node.Node.Path}"); } }
Go

Go 構造は、実装するインターフェイスを明示的に宣言する必要はありません。Go コンパイラは、構造で利用可能なメソッドおよびプロパティに基づいて実装を決定します。例えば、次のコードでは、MyAspect は コンストラクトを取る Visit メソッドを提示するため、IAspect インターフェイスを実装します。

type MyAspect struct { } func (a MyAspect) Visit(node constructs.IConstruct) { fmt.Println("Visited", *node.Node().Path()) }