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

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

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

AWS CDK in Go の使用

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

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

このトピックでは、 AWS CDK in Go で を操作する際のガイダンスを提供します。のシンプルな Go プロジェクトのチュートリアルについては、「発表ブログ記事」を参照してください AWS CDK。

の使用を開始する Go

を使用するには AWS CDK、 AWS アカウントと認証情報があり、Node.js と Toolkit AWS CDK がインストールされている必要があります。「の開始方法 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/v2への参照が含まれていますgo.mod。このモジュールと他の必要なモジュールをインストールgo getするための問題。

AWS 構築ライブラリモジュールの管理

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

一部の サービス AWS 「構築ライブラリのサポート」は、複数の構築ライブラリモジュール (Go パッケージ) に含まれています。例えば、Amazon Route 53 には、、awsroute53patterns、 という名前のメインawsroute53パッケージに加えて awsroute53resolver3 つのコンストラクトライブラリモジュールがあります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 メソッドでは、 defer jsii.Close()を使用して、CDKアプリケーションがそれ自体の後にクリーンアップされるようにします。

欠損値とポインタ変換

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、対応するインターフェイスを実装する構造体を返します。

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

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

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

汎用構造

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

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

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

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

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

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

構築、合成、デプロイ

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

コマンドプロンプトgo testで を実行して、書き込んだテストを実行します。