

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

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

# での AWS CDK の使用 Go
<a name="work-with-cdk-go"></a>

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

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

このトピックでは、 で AWS CDK を使用する際のガイダンスを提供しますGo。 AWS CDK のシンプルな Go プロジェクトのチュートリアルについては、[発表ブログ記事](https://aws.amazon.com/blogs/developer/getting-started-with-the-aws-cloud-development-kit-and-go/)を参照してください。

## Go の開始方法
<a name="go-prerequisites"></a>

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

 AWS CDK のGoバインディングは、標準の [Go ツールチェーン](https://golang.org/dl/) v1.23 以降を使用します。任意のエディタを使用できます。

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

## プロジェクトの作成
<a name="go-newproject"></a>

空のディレクトリ`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 コンストラクトライブラリモジュールの管理
<a name="go-managemodules"></a>

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

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

ほとんどの 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 の依存関係の管理
<a name="work-with-cdk-go-dependencies"></a>

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
<a name="go-cdk-idioms"></a>

### フィールド名とメソッド名
<a name="go-naming"></a>

フィールド名およびメソッド名は、CDK の元となる言語である TypeScript でキャメルケース (`likeThis`) を使用します。Go では、これらは Go の規則に従っているため、Pascal ケース (`LikeThis`) 仕様になっています。

### クリーンアップ
<a name="go-cdk-jsii-close"></a>

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

### 欠落値とポインタ変換
<a name="go-missing-values"></a>

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

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

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

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

### コンストラクトと props
<a name="go-props"></a>

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

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

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

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

### 汎用構造
<a name="go-generic-structures"></a>

場合によっては、 AWS CDK はメソッドへの入力として JavaScript 配列または型のないオブジェクトを使用します。( AWS CodeBuild の [https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_codebuild.BuildSpec.html#static-fromwbrobjectvalue)メソッドなどを参照してください）。Go では、これらのオブジェクトはそれぞれスライスおよび空のインターフェイスとして表されます。

CDK は、プリミティブ型を含むスライスを構築する `jsii.Strings` などの可変ヘルパー関数を提供します。

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

### スライスの操作
<a name="go-any-slice"></a>

特定のコンストラクトでは、複数のタイプ (TypeScript のユニオンタイプ) のリストであるプロパティを想定しています。Go では、これらは任意 (`*[]any`) のスライスです。`any` により、コンパイラでさまざまなタイプの割り当てが許可されます。許可されるタイプを確認するには、` [AWS CDK Go package](https://pkg.go.dev/github.com/aws/aws-cdk-go/awscdk/v2) ` のドキュメントを参照してください。

このようなプロパティを使用するには、`jsii` が提供するヘルパー関数を使用して、さまざまなタイプから任意のスライスを作成します。
+  `jsii.AnySlice` 
+  `jsii.AnyStrings` 
+  `jsii.AnyNumbers` 

例えば、次のようになります。

```
func Arns() *[]*string {
a := "arn:aws:s3:::bucket1"
b := "arn:aws:s3:::bucket2"
return &[]*string{&a, &b}
}

awsiam.NewCfnUser(stack, jsii.String("User"), &awsiam.CfnUserProps{
	ManagedPolicyArns: jsii.AnySlice(Arns())
  // or
	ManagedPolicyArns: jsii.AnyStrings("arn:aws:s3:::bucket1", "arn:aws:s3:::bucket2")
  // or
  ManagedPolicyArns: &[]interface{}{
    jsii.String("arn:aws:s3:::bucket1"),
    jsii.String("arn:aws:s3:::bucket2"),
  }
})
```

このアプローチにより、スライスが CDK によって正しく解釈され、スタックをデプロイまたは合成する際の逆シリアル化エラーを回避できます。

### カスタムコンストラクトの開発
<a name="go-writing-constructs"></a>

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

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

## 構築、合成、デプロイ
<a name="go-running"></a>

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

コマンドプロンプトで `go test` を実行し、記述したテストを実行します。

## トラブルシューティング
<a name="go-troubleshooting"></a>

次のようなコンパイラエラーが発生した場合は、文字列スライスが any 型のスライスを想定するプロパティに直接渡されたことを意味します。

```
Cannot use 'jsii.Strings("arn:aws:s3:::bucket1", "arn:aws:s3:::bucket2")' (type *[]*string) as the type *[]interface{}
```

このエラーを解決するには、`jsii.Strings()` を `jsii.AnyStrings()` に置き換えます。その他のコンテキストや追加のソリューションについては、こちらの ` [CDK GitHub issue](https://github.com/aws/aws-cdk/issues/35630) ` を参照してください。