サポートされているプログラミング言語で AWS CDK の の操作 - AWS Cloud Development Kit (AWS CDK) v2

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