これは 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())
}