これは AWS CDK v2 デベロッパーガイドです。古い CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
サポートされているプログラミング言語で AWS CDK の の操作
を使用して AWS Cloud Development Kit (AWS CDK) 、サポートされているプログラミング言語 で AWS クラウド インフラストラクチャを定義します。
AWS コンストラクトライブラリのインポート
AWS CDK には、 AWS サービス別に整理されたコンストラクトのコレクションであるコンストラクトライブラリが含まれています AWS 。ライブラリの安定したコンストラクトは、TypeScriptパッケージ名 によって呼び出される単一のモジュールで提供されますaws-cdk-lib
。実際のパッケージ名は言語によって異なります。
- TypeScript
-
インストール |
npm インストール aws-cdk-lib |
[Import](インポート) |
const cdk = require('aws-cdk-lib'), |
- JavaScript
-
インストール |
npm インストール aws-cdk-lib |
[Import](インポート) |
const cdk = require('aws-cdk-lib'), |
- Python
-
インストール |
Python -m pip install aws-cdk-lib |
[Import](インポート) |
aws_cdk を cdk としてインポートする |
- Java
-
を に追加する pom.xml |
Group software.amazon.awscdk ; artifact aws-cdk-lib |
[Import](インポート) |
software.amazon.awscdk.App をインポートします。 (for example) |
- C#
-
インストール |
dotnet 追加パッケージ Amazon.CDK.Lib |
[Import](インポート) |
Amazon.CDK の使用 |
construct
基本クラスとサポートコードは constructs
モジュールにあります。API がまだ改良中の実験コンストラクトは、個別のモジュールとして分散されます。
AWS CDK API リファレンス
AWS CDK API リファレンスは、ライブラリ内のコンストラクト (およびその他のコンポーネント) の詳細なドキュメントを提供します。API リファレンスのバージョンは、サポートされているプログラミング言語ごとに提供されます。
各モジュールのリファレンスマテリアルは、次のセクションに分かれています。
-
概要: の概念や例など AWS CDK、 のサービスを使用する際に知っておく必要がある入門資料。
-
構築: 1 つ以上の具体的な AWS リソースを表すライブラリクラス。これらは「キュレーション」(L2) リソースまたはパターン (L3 リソース) で、高レベルのインターフェイスと正常なデフォルトを提供します。
-
クラス: モジュール内のコンストラクトで使用される機能を提供する非コンストラクトクラス。
-
構造体: プロパティ (コンストラクトのprops
引数) やオプションなどの複合値の構造を定義するデータ構造 (属性バンドル)。
-
インターフェイス: 名前がすべて「I」で始まるインターフェイスは、対応するコンストラクトまたは他のクラスの絶対最小機能を定義します。CDK は、コンストラクトインターフェイスを使用して、 AWS CDK アプリの外部で定義され、 などのメソッドによって参照される AWS リソースを表しますBucket.fromBucketArn()
。
-
列挙型: 特定のコンストラクトパラメータの指定に使用する名前付き値のコレクション。列挙値を使用すると、CDK は合成中にこれらの値の有効性を確認できます。
-
CloudFormation リソース: 名前が「Cfn」で始まるこれらの L1 コンストラクトは、 CloudFormation 仕様で定義されているリソースを正確に表します。CDK リリースごとに、その仕様から自動的に生成されます。各 L2 または L3 コンストラクトは、1 つ以上の CloudFormationリソースをカプセル化します。
-
CloudFormation プロパティタイプ: 各 CloudFormation リソースのプロパティを定義する名前付き値のコレクション。
コンストラクトクラスと比較したインターフェイス
では、プログラミングの概念としてインターフェイスに精通していても、明確ではない可能性のある特定の方法でインターフェイス AWS CDK を使用します。
は、 などのメソッドを使用した CDK アプリケーション外部で定義されたリソースの使用 AWS CDK をサポートしますBucket.fromBucketArn()
。外部リソースは変更できず、 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 モジュール |
cdk init
コマンドを使用して新しいプロジェクトを作成すると AWS CDK CLI、CDK コアライブラリと安定したコンストラクトの依存関係が自動的に指定されます。
サポートされているプログラミング言語の依存関係の管理の詳細については、以下を参照してください。
AWS CDKTypeScript と他の言語の比較
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のインポートとは動作が異なります。各インポートステートメントは、特定のパッケージから単一のクラス名、またはそのパッケージで定義されているすべてのクラスをインポートします ( を使用*
)。クラスには、インポートされている場合はクラス名自体、またはそのパッケージを含む修飾クラス名を使用してアクセスできます。
ライブラリは AWS 、 コンストラクトライブラリsoftware.amazon.awscdk.services.xxx
の のように名前が付けられています (メインライブラリは ですsoftware.amazon.awscdk
)。 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 Construct Library モジュールは 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, 'MyBucket');
// Instantiate Bucket with bucketName and versioned properties
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'my-bucket',
versioned: true,
});
// Instantiate Bucket with websiteRedirect, which has its own sub-properties
const bucket = new s3.Bucket(this, 'MyBucket', {
websiteRedirect: {host: 'aws.amazon.com'}});
- Python
-
Python は、クラスのインスタンス化時にnew
キーワードを使用しません。properties 引数はキーワード引数を使用して表され、引数は を使用して名前が付けられますsnake_case
。
props 値がそれ自体が属性のバンドルである場合、サブプロパティのキーワード引数を受け入れる プロパティにちなんだ という名前のクラスによって表されます。
Python では、現在のインスタンスは、規則self
によって名前が付けられた最初の引数として メソッドに渡されます。
# Instantiate default Bucket
bucket = s3.Bucket(self, "MyBucket")
# Instantiate Bucket with bucket_name and versioned properties
bucket = s3.Bucket(self, "MyBucket", bucket_name="my-bucket", versioned=true)
# Instantiate Bucket with website_redirect, which has its own sub-properties
bucket = s3.Bucket(self, "MyBucket", website_redirect=s3.WebsiteRedirect(
host_name="aws.amazon.com"))
- Java
-
Java では、props 引数は という名前のクラスで表されます XxxxProps
(たとえば、Bucket
コンストラクトのprops BucketProps
の場合は )。props 引数は、ビルダーパターンを使用して構築します。
各XxxxProps
クラスにはビルダーがあります。また、次の例に示すように、1 つのステップで props と コンストラクトを構築する各コンストラクトに便利なビルダーもあります。
Props の名前は、 を使用して TypeScriptと同じですcamelCase
。
// Instantiate default Bucket
Bucket bucket = Bucket(self, "MyBucket");
// Instantiate Bucket with bucketName and versioned properties
Bucket bucket = Bucket.Builder.create(self, "MyBucket")
.bucketName("my-bucket").versioned(true)
.build();
# Instantiate Bucket with websiteRedirect, which has its own sub-properties
Bucket bucket = Bucket.Builder.create(self, "MyBucket")
.websiteRedirect(new websiteRedirect.Builder()
.hostName("aws.amazon.com").build())
.build();
- C#
-
C# では、props は という名前のクラスへのオブジェクトイニシャライザを使用して指定されます XxxxProps
(たとえば、Bucket
コンストラクトのprops BucketProps
の場合)。
Props の名前は、 を使用する場合を除き TypeScript、 と似ていますPascalCase
。
コンストラクトをインスタンス化するときに var
キーワードを使用する方が便利なため、クラス名を 2 回入力する必要はありません。ただし、ローカルコードスタイルガイドは異なる場合があります。
// Instantiate default Bucket
var bucket = Bucket(self, "MyBucket");
// Instantiate Bucket with BucketName and Versioned properties
var bucket = Bucket(self, "MyBucket", new BucketProps {
BucketName = "my-bucket",
Versioned = true});
// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
var bucket = Bucket(self, "MyBucket", new BucketProps {
WebsiteRedirect = new WebsiteRedirect {
HostName = "aws.amazon.com"
}});
- Go
-
Go でコンストラクトを作成するには、 関数を呼び出します。NewXxxxxx
ここで、 Xxxxxxx
はコンストラクトの名前です。コンストラクトのプロパティは構造体として定義されます。
Go では、数値、ブール値、文字列などの値を含むすべてのコンストラクトパラメータがポインタです。などの便利な関数jsii.String
を使用して、これらのポインタを作成します。
// Instantiate default Bucket
bucket := awss3.NewBucket(stack, jsii.String("MyBucket"), nil)
// Instantiate Bucket with BucketName and Versioned properties
bucket1 := awss3.NewBucket(stack, jsii.String("MyBucket"), &awss3.BucketProps{
BucketName: jsii.String("my-bucket"),
Versioned: jsii.Bool(true),
})
// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
bucket2 := awss3.NewBucket(stack, jsii.String("MyBucket"), &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
-
プロパティごとに getter メソッドが用意されています。これらの名前は です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 コンパイラは、 構造で使用できるメソッドとプロパティに基づいて実装を決定します。例えば、次のコードでは、 は コンストラクトを使用するVisit
メソッドを提供するため、 IAspect
インターフェイスMyAspect
を実装しています。
type MyAspect struct {
}
func (a MyAspect) Visit(node constructs.IConstruct) {
fmt.Println("Visited", *node.Node().Path())
}