

Ini adalah Panduan Pengembang AWS CDK v2. CDK v1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Bekerja dengan AWS CDK di Go
<a name="work-with-cdk-go"></a>

 Goadalah bahasa klien yang didukung penuh untuk AWS Cloud Development Kit (AWS CDK) dan dianggap stabil. Bekerja dengan AWS CDK di Go menggunakan alat yang sudah dikenal. Versi Go dari AWS CDK bahkan menggunakan pengidentifikasi gaya GO.

Berbeda dengan bahasa lain yang didukung CDK, Go bukan bahasa pemrograman berorientasi objek tradisional. Gomenggunakan komposisi di mana bahasa lain sering memanfaatkan pewarisan. Kami telah mencoba menggunakan Go pendekatan idiomatik sebanyak mungkin, tetapi ada tempat di mana CDK mungkin berbeda.

Topik ini memberikan panduan saat bekerja dengan AWS CDK diGo. Lihat [posting blog pengumuman](https://aws.amazon.com/blogs/developer/getting-started-with-the-aws-cloud-development-kit-and-go/) untuk panduan proyek Go sederhana untuk CDK. AWS 

## Memulai dengan Go
<a name="go-prerequisites"></a>

Untuk bekerja dengan AWS CDK, Anda harus memiliki AWS akun dan kredensil dan telah menginstal Node.js dan CDK Toolkit. AWS Lihat [Memulai dengan AWS CDK](getting-started.md).

GoBinding untuk AWS CDK menggunakan [toolchain Go](https://golang.org/dl/) standar, v1.23 atau yang lebih baru. Anda dapat menggunakan editor pilihan Anda.

**catatan**  
Pengakhiran bahasa pihak ketiga: versi bahasa hanya didukung hingga EOL (End Of Life) dibagikan oleh vendor atau komunitas dan dapat berubah sewaktu-waktu dengan pemberitahuan sebelumnya.

## Membuat proyek
<a name="go-newproject"></a>

Anda membuat proyek AWS CDK baru dengan memanggil `cdk init` di direktori kosong. Gunakan `--language` opsi dan tentukan`go`:

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

 `cdk init`menggunakan nama folder proyek untuk memberi nama berbagai elemen proyek, termasuk kelas, subfolder, dan file. Tanda hubung dalam nama folder diubah menjadi garis bawah. Namun, nama tersebut harus mengikuti bentuk Go pengenal; misalnya, tidak boleh dimulai dengan angka atau berisi spasi.

Proyek yang dihasilkan mencakup referensi ke Go modul AWS CDK inti,`github.com/aws/aws-cdk-go/awscdk/v2`, di`go.mod`. Masalah `go get` untuk menginstal ini dan modul lain yang diperlukan.

## Mengelola AWS modul Construct Library
<a name="go-managemodules"></a>

Dalam kebanyakan dokumentasi dan contoh AWS CDK, kata “modul” sering digunakan untuk merujuk pada modul AWS Construct Library, satu atau lebih per AWS layanan, yang berbeda dari Go penggunaan idiomatik istilah tersebut. CDK Construct Library disediakan dalam satu Go modul dengan modul Construct Library individual, yang mendukung berbagai AWS layanan, disediakan sebagai Go paket dalam modul itu.

Dukungan AWS Construct Library beberapa layanan ada di lebih dari satu modul Construct Library (paket)Go. Misalnya, Amazon Route 53 memiliki tiga modul Construct Library selain `awsroute53` paket utama, bernama `awsroute53patterns``awsroute53resolver`, dan`awsroute53targets`.

Paket inti AWS CDK, yang Anda perlukan di sebagian besar aplikasi AWS CDK, diimpor dalam Go kode sebagai. `github.com/aws/aws-cdk-go/awscdk/v2` Paket untuk berbagai layanan di Perpustakaan AWS Konstruksi hidup di bawah`github.com/aws/aws-cdk-go/awscdk/v2`. Misalnya, namespace modul Amazon S3 adalah. `github.com/aws/aws-cdk-go/awscdk/v2/awss3`

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

Setelah Anda mengimpor modul (Gopaket) Construct Library untuk layanan yang ingin Anda gunakan di aplikasi, Anda mengakses konstruksi dalam modul tersebut menggunakan, misalnya,. `awss3.Bucket`

## Mengelola dependensi di Go
<a name="work-with-cdk-go-dependencies"></a>

DalamGo, versi dependensi didefinisikan dalam. `go.mod` `go.mod`Defaultnya mirip dengan yang ditampilkan di sini.

```
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
)
```

Nama Package (modul, dalam bahasa Go) ditentukan oleh URL dengan nomor versi yang diperlukan ditambahkan. Gosistem modul tidak mendukung rentang versi.

Keluarkan `go get` perintah untuk menginstal semua modul dan pembaruan yang diperlukan`go.mod`. Untuk melihat daftar pembaruan yang tersedia untuk dependensi Anda, masalah. `go list -m -u all`

## AWS Idiom CDK di Go
<a name="go-cdk-idioms"></a>

### Nama bidang dan metode
<a name="go-naming"></a>

Nama bidang dan metode menggunakan selubung unta (`likeThis`) di TypeScript, bahasa asal CDK. DalamGo, ini mengikuti Go konvensi, begitu juga Pascal-cased (). `LikeThis`

### Membersihkan
<a name="go-cdk-jsii-close"></a>

Dalam `main` metode Anda, gunakan `defer jsii.Close()` untuk memastikan aplikasi CDK Anda membersihkan setelahnya sendiri.

### Nilai dan konversi pointer yang hilang
<a name="go-missing-values"></a>

DalamGo, nilai yang hilang dalam objek AWS CDK seperti bundel properti diwakili oleh. `nil` Gotidak memiliki tipe nullable; satu-satunya tipe yang dapat berisi `nil` adalah pointer. Untuk memungkinkan nilai menjadi opsional, maka, semua properti CDK, argumen, dan nilai pengembalian adalah pointer, bahkan untuk tipe primitif. Ini berlaku untuk nilai yang diperlukan serta nilai opsional, jadi jika nilai yang diperlukan nanti menjadi opsional, tidak diperlukan perubahan tipe yang melanggar.

Saat melewati nilai atau ekspresi literal, gunakan fungsi pembantu berikut untuk membuat pointer ke nilai.
+  `jsii.String` 
+  `jsii.Number` 
+  `jsii.Bool` 
+  `jsii.Time` 

Untuk konsistensi, kami menyarankan Anda menggunakan pointer yang sama saat mendefinisikan konstruksi Anda sendiri, meskipun mungkin tampak lebih nyaman untuk, misalnya, menerima konstruksi Anda `id` sebagai string daripada penunjuk ke string.

Saat berhadapan dengan nilai AWS CDK opsional, termasuk nilai primitif serta tipe kompleks, Anda harus menguji pointer secara eksplisit untuk memastikannya tidak `nil` sebelum melakukan apa pun dengannya. Go tidak memiliki “gula sintaksis” untuk membantu menangani nilai kosong atau hilang seperti yang dilakukan beberapa bahasa lain. Namun, nilai yang diperlukan dalam bundel properti dan struktur serupa dijamin ada (konstruksi gagal jika tidak), jadi nilai ini tidak perlu diperiksa`nil`.

### Konstruksi dan Alat Peraga
<a name="go-props"></a>

Konstruksi, yang mewakili satu atau lebih AWS sumber daya dan atribut terkait, direpresentasikan Go sebagai antarmuka. Misalnya, `awss3.Bucket` adalah antarmuka. Setiap konstruksi memiliki fungsi pabrik, seperti`awss3.NewBucket`, untuk mengembalikan struct yang mengimplementasikan antarmuka yang sesuai.

Semua fungsi pabrik mengambil tiga argumen: `scope` di mana konstruksi sedang didefinisikan (induknya di pohon konstruksi), sebuah, dan `id``props`, bundel key/value pasangan yang digunakan konstruksi untuk mengkonfigurasi sumber daya yang dibuatnya. Pola “bundel atribut” juga digunakan di tempat lain di AWS CDK.

DalamGo, alat peraga diwakili oleh tipe struct tertentu untuk setiap konstruksi. Misalnya, `awss3.Bucket` mengambil argumen props tipe`awss3.BucketProps`. Gunakan struct literal untuk menulis argumen props.

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

### Struktur generik
<a name="go-generic-structures"></a>

Di beberapa tempat, AWS CDK menggunakan JavaScript array atau objek yang tidak diketik sebagai input ke metode. (Lihat, misalnya, 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)metode.) Di Go, objek-objek ini direpresentasikan sebagai irisan dan antarmuka kosong, masing-masing.

CDK menyediakan fungsi pembantu variadik seperti `jsii.Strings` untuk membangun irisan yang mengandung tipe primitif.

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

### Bekerja dengan irisan apa pun
<a name="go-any-slice"></a>

Konstruksi tertentu mengharapkan properti yang merupakan daftar beberapa jenis (tipe gabungan di TypeScript). DalamGo, ini adalah sebagai sepotong dari any (`*[]any`). `any`Memastikan bahwa kompiler akan memungkinkan penugasan berbagai jenis di sana. Lihat dokumentasi ` [AWS CDK Go package](https://pkg.go.dev/github.com/aws/aws-cdk-go/awscdk/v2) ` untuk mengetahui jenis apa yang diizinkan.

Untuk bekerja dengan properti tersebut, gunakan fungsi pembantu yang disediakan oleh `jsii` untuk membuat irisan dari berbagai jenis:
+  `jsii.AnySlice` 
+  `jsii.AnyStrings` 
+  `jsii.AnyNumbers` 

Contoh:

```
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"),
  }
})
```

Pendekatan ini memastikan bahwa irisan Anda ditafsirkan dengan benar oleh CDK, menghindari kesalahan deserialisasi saat menerapkan atau mensintesis tumpukan Anda.

### Mengembangkan konstruksi khusus
<a name="go-writing-constructs"></a>

DalamGo, biasanya lebih mudah untuk menulis konstruksi baru daripada memperluas yang sudah ada. Pertama, tentukan tipe struct baru, sematkan secara anonim satu atau lebih tipe yang ada jika semantik seperti ekstensi diinginkan. Tulis metode untuk fungsionalitas baru apa pun yang Anda tambahkan dan bidang yang diperlukan untuk menyimpan data yang mereka butuhkan. Tentukan antarmuka alat peraga jika konstruksi Anda membutuhkannya. Akhirnya, tulis fungsi pabrik `NewMyConstruct()` untuk mengembalikan instance konstruksi Anda.

Jika Anda hanya mengubah beberapa nilai default pada konstruksi yang ada atau menambahkan perilaku sederhana di instantiation, Anda tidak memerlukan semua pipa ledeng itu. Sebagai gantinya, tulis fungsi pabrik yang memanggil fungsi pabrik dari konstruksi yang Anda “perluas.” Dalam bahasa CDK lainnya, misalnya, Anda dapat membuat `TypedBucket` konstruksi yang menerapkan tipe objek di bucket Amazon S3 dengan mengganti tipe dan, di penginisialisasi `s3.Bucket` tipe baru Anda, menambahkan kebijakan bucket yang hanya mengizinkan ekstensi nama file tertentu untuk ditambahkan ke bucket. DiGo, lebih mudah untuk hanya menulis `NewTypedBucket` yang mengembalikan `s3.Bucket` (menggunakan instantiated`s3.NewBucket`) yang telah Anda tambahkan kebijakan bucket yang sesuai. Tidak ada jenis konstruksi baru yang diperlukan karena fungsionalitas sudah tersedia dalam konstruksi bucket standar; “konstruksi” baru hanya menyediakan cara yang lebih sederhana untuk mengonfigurasinya.

## Membangun, mensintesis, dan menyebarkan
<a name="go-running"></a>

 AWS CDK secara otomatis mengompilasi aplikasi Anda sebelum menjalankannya. Namun, membangun aplikasi Anda secara manual dapat berguna untuk memeriksa kesalahan dan menjalankan pengujian. Anda dapat melakukan ini dengan mengeluarkan `go build` pada prompt perintah saat berada di direktori root proyek Anda.

Jalankan pengujian apa pun yang Anda tulis dengan menjalankan `go test` pada prompt perintah.

## Pemecahan masalah
<a name="go-troubleshooting"></a>

Jika Anda menemukan kesalahan kompiler seperti berikut ini, itu berarti irisan string diteruskan langsung ke properti yang mengharapkan sepotong apa pun.

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

Untuk mengatasi kesalahan ini, ganti `jsii.Strings()` dengan`jsii.AnyStrings()`. Lihat ini ` [CDK GitHub issue](https://github.com/aws/aws-cdk/issues/35630) ` untuk konteks lebih lanjut dan solusi tambahan.