Go AWS CDK での の使用 - AWS Cloud Development Kit (AWS CDK) v2

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

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

Go AWS CDK での の使用

Go は、 で完全にサポートされているクライアント言語であり AWS Cloud Development Kit (AWS CDK) 、安定していると見なされます。Go AWS CDK で を操作するには、使い慣れたツールを使用します。Go バージョンの AWS CDK でも、Go スタイルの識別子が使用されます。

CDK がサポートする他の言語とは異なり、Go は従来のオブジェクト指向プログラミング言語ではありません。Go は、他の言語が継承を利用することが多いコンポジションを使用します。可能な限りイディオマティックな Go アプローチを採用しようとしましたが、CDK が異なる場所があります。

このトピックでは、Go AWS CDK で を使用する際のガイダンスを提供します。のシンプルな Go プロジェクトのチュートリアルについては、お知らせブログ記事を参照してください AWS CDK。

Go の開始方法

を使用するには AWS CDK、 AWS アカウントと認証情報が必要であり、Node.js と AWS CDK Toolkit がインストールされている必要があります。の開始方法 AWS CDK を参照してください。

の Go バインディングは、標準の Go ツールチェーン v1.18 以降 AWS CDK を使用します。選択したエディタを使用できます。

注記

サードパーティー言語の廃止: 言語バージョンは、ベンダーまたはコミュニティによって共有される EOL (サポート終了) までのみサポートされ、事前通知により変更される可能性があります。

「プロジェクトの作成」

空のディレクトリcdk initで を呼び出して、新しい AWS CDK プロジェクトを作成します。--language オプションを使用して、 を指定しますgo

mkdir my-project cd my-project cdk init app --language go

cdk init は、プロジェクトフォルダの名前を使用して、クラス、サブフォルダ、ファイルなど、プロジェクトのさまざまな要素に名前を付けます。フォルダ名のハイフンはアンダースコアに変換されます。ただし、名前は Go 識別子の形式に従う必要があります。例えば、数字で開始したり、スペースを含めたりしないでください。

結果として得られるプロジェクトには、 のコア AWS CDK Go モジュール への参照が含まれていますgithub.com/aws/aws-cdk-go/awscdk/v2go.mod。このモジュールやその他の必要なモジュールをインストールgo getする際の問題。

AWS コンストラクトライブラリモジュールの管理

ほとんどの AWS CDK ドキュメントや例では、「モジュール」という単語は、 AWS サービスごとに 1 AWS つ以上の Construct Library モジュールを指すためによく使用されます。これは、用語のイディオマティック Go の使用とは異なります。CDK コンストラクトライブラリは、個々のコンストラクトライブラリモジュールを持つ 1 つの Go モジュールで提供され、そのモジュール内の Go パッケージとして提供されるさまざまな AWS サービスをサポートします。

一部のサービスの AWS 「コンストラクトライブラリのサポートは、複数のコンストラクトライブラリモジュール (Go パッケージ) にあります。例えば、Amazon Route 53 には、、awsroute53patterns、 という名前のメインawsroute53パッケージに加えてawsroute53resolver、3 つの Construct Library モジュールがありますawsroute53targets

ほとんどの AWS CDK アプリで必要となる AWS CDKのコアパッケージは、Go コードに としてインポートされますgithub.com/aws/aws-cdk-go/awscdk/v2。 AWS コンストラクトライブラリ内のさまざまなサービスのパッケージは、 にありますgithub.com/aws/aws-cdk-go/awscdk/v2。例えば、Amazon S3 モジュールの名前空間は ですgithub.com/aws/aws-cdk-go/awscdk/v2/awss3

import ( "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // ... )

アプリで使用するサービスの 構成ライブラリモジュール (Go パッケージ) をインポートしたら、 などを使用してそのモジュールの構成にアクセスしますawss3.Bucket

での依存関係の管理 Go

Go では、依存関係のバージョンは で定義されますgo.mod。デフォルトgo.modは、ここに示すようなものです。

module my-package go 1.16 require ( github.com/aws/aws-cdk-go/awscdk/v2 v2.16.0 github.com/aws/constructs-go/constructs/v10 v10.0.5 github.com/aws/jsii-runtime-go v1.29.0 )

パッケージ名 (Go 並列のモジュール) は URL によって指定され、必要なバージョン番号が追加されます。Go のモジュールシステムはバージョン範囲をサポートしていません。

必要なモジュールをすべてインストールして を更新するには、 go get コマンドを発行しますgo.mod。依存関係で利用可能な更新のリストを表示するには、 を発行しますgo list -m -u all

AWS CDK Go のイディオム

フィールド名とメソッド名

フィールド名とメソッド名は TypeScript、CDK のオリジン言語である でキャメルケース (likeThis) を使用します。Go では、これらは Go の規則に従います。また、パスカル文字 () も使用しますLikeThis

クリーンアップ

main メソッドで、 を使用して CDK アプリがそれ自体の後にクリーンアップするdefer jsii.Close()ことを確認します。

欠損値とポインタ変換

Go では、プロパティバンドルなどの AWS CDK オブジェクトの欠損値は で表されますnil。Go には NULL 可能な型がありません。含めることができる型nilはポインタのみです。値をオプションにするには、プリミティブ型であっても、すべての CDK プロパティ、引数、戻り値はポインターです。これは必須の値にもオプションの値にも適用されるため、後で必須値がオプションになった場合、タイプに重大な変更を加える必要はありません。

リテラル値または式を渡すときは、次のヘルパー関数を使用して値へのポインタを作成します。

  • jsii.String

  • jsii.Number

  • jsii.Bool

  • jsii.Time

一貫性を保つため、独自のコンストラクトを定義する場合も同様にポインターを使用することをお勧めします。例えば、コンストラクトの を文字列へのポインターではなく文字列idとして受け取る方が便利です。

プリミティブ AWS CDK 値や複合型などのオプションの値を扱う場合は、ポインターを明示的にテストして、それらを使用するnil前にポインターがないことを確認する必要があります。Go には、他の言語と同様に、空または欠落した値を処理するのに役立つ「構文的な欠陥」はありません。ただし、プロパティバンドルや同様の構造で必須の値が存在することが保証されているため (それ以外の場合は構成が失敗します)、これらの値を nilでチェックする必要はありません。

コンストラクトと Props

1 つ以上の AWS リソースとそれに関連する属性を表すコンストラクトは、インターフェイスとして Go で表されます。例えば、 awss3.Bucketはインターフェイスです。すべてのコンストラクトには、対応するインターフェイスを実装する構造体awss3.NewBucketを返す などのファクトリ関数があります。

すべてのファクトリ関数は 3 つの引数を取ります。コンストラクトscopeが定義されている (コンストラクトツリー内の親)id、、および propsは、コンストラクトが作成するリソースの設定に使用するキーと値のペアのバンドルです。「属性のバンドル」パターンは、 の他の場所でも使用されます AWS CDK。

Go では、props はコンストラクトごとに特定の構造体タイプで表されます。例えば、 は 型の props 引数awss3.Bucketを取りますawss3.BucketProps。構造体リテラルを使用して props 引数を書き込みます。

var bucket = awss3.NewBucket(stack, jsii.String("MyBucket"), &awss3.BucketProps{ Versioned: jsii.Bool(true), })

一般的な構造

場合によっては、 AWS CDK は JavaScript 配列または型指定されていないオブジェクトをメソッドへの入力として使用します。(例えば、 AWS CodeBuildの BuildSpec.fromObject()メソッドを参照してください。) Go では、これらのオブジェクトはそれぞれスライスと空のインターフェイスとして表されます。

CDK には、プリミティブ型を含むスライスを構築jsii.Stringsするための などの変分ヘルパー関数が用意されています。

jsii.Strings("One", "Two", "Three")

カスタムコンストラクトの開発

Go では、通常、既存のコンストラクトを拡張するよりも、新しいコンストラクトを作成する方が簡単です。まず、新しい構造体タイプを定義し、拡張のようなセマンティクスが必要な場合は、1 つ以上の既存のタイプを匿名で埋め込みます。追加する新機能のメソッドと、必要なデータを保持するために必要なフィールドを記述します。コンストラクトに必要な場合は、props インターフェイスを定義します。最後に、ファクトリー関数を作成してNewMyConstruct()、コンストラクトのインスタンスを返します。

既存のコンストラクトのデフォルト値を変更したり、インスタンス化時に単純な動作を追加したりするだけでは、そのすべては必要ありません。代わりに、「拡張」するコンストラクトのファクトリ関数を呼び出すファクトリ関数を記述します。例えば、他の CDK 言語では、タイプを上書きして Amazon S3 バケット内のオブジェクトのタイプを強制するTypedBucketコンストラクトを作成しs3.Bucket、新しいタイプのイニシャライザで、指定されたファイル名拡張子のみをバケットに追加することを許可するバケットポリシーを追加できます。Go では、適切なバケットポリシーを追加NewTypedBucketした s3.Bucket ( を使用してインスタンス化されたs3.NewBucket) を返す を簡単に記述する方が簡単です。機能はすでに標準バケットコンストラクトで利用できるため、新しいコンストラクトタイプは必要ありません。新しい「コンストラクト」は、より簡単に設定することができます。

構築、合成、デプロイ

は、アプリケーションを実行する前に AWS CDK 自動的にコンパイルします。ただし、エラーをチェックしてテストを実行するために、アプリケーションを手動で構築すると便利です。これを行うには、プロジェクトのルートディレクトリにあるコマンドプロンプトgo buildで を発行します。

コマンドプロンプトgo testで を実行して、作成したテストを実行します。

AWS CDK アプリケーションで定義されたスタックは、合成して個別にデプロイすることも、以下のコマンドを使用してまとめてデプロイすることもできます。通常、プロジェクトを発行するときは、プロジェクトのメインディレクトリにいる必要があります。

  • cdk synth: AWS CDK アプリケーションの 1 つ以上のスタックから AWS CloudFormation テンプレートを合成します。

  • cdk deploy: AWS CDK アプリケーション内の 1 つ以上のスタックによって定義されたリソースを にデプロイします AWS。

1 つのコマンドで合成またはデプロイする複数のスタックの名前を指定できます。アプリケーションが 1 つのスタックのみを定義している場合は、指定する必要はありません。

cdk synth # app defines single stack cdk deploy Happy Grumpy # app defines two or more stacks; two are deployed

また、ワイルドカード * (任意の文字数) と ? (任意の 1 文字) を使用して、パターンでスタックを識別することもできます。ワイルドカードを使用する場合は、パターンを引用符で囲みます。そうしないと、シェルは AWS CDK Toolkit に渡す前に、現在のディレクトリ内のファイルの名前に拡張しようとする可能性があります。

cdk synth "Stack?" # Stack1, StackA, etc. cdk deploy "*Stack" # PipeStack, LambdaStack, etc.
ヒント

デプロイする前にスタックを明示的に合成する必要はありません。 はこのステップcdk deployを実行して、最新のコードがデプロイされることを確認します。

cdk コマンドの完全なドキュメントについては、「」を参照してくださいAWS CDK ツールキット (cdk コマンド)