Bekerja dengan AWS CDK di Go - AWS Cloud Development Kit (AWS CDK) v2

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

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 untuk panduan proyek Go sederhana untuk CDK. AWS

Memulai dengan Go

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.

GoBinding untuk AWS CDK menggunakan toolchain Go standar, v1.18 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

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

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

cdk initmenggunakan 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, digo.mod. Masalah go get untuk menginstal ini dan modul lain yang diperlukan.

Mengelola AWS modul Construct Library

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 awsroute53patternsawsroute53resolver, danawsroute53targets.

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 bawahgithub.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

DalamGo, versi dependensi didefinisikan dalam. go.mod go.modDefaultnya 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 diperlukango.mod. Untuk melihat daftar pembaruan yang tersedia untuk dependensi Anda, masalah. go list -m -u all

AWS Idiom CDK di Go

Nama bidang dan metode

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

Membersihkan

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

Nilai dan konversi pointer yang hilang

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 diperiksanil.

Konstruksi dan Alat Peraga

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, sepertiawss3.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 idprops, 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 tipeawss3.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

Di beberapa tempat, AWS CDK menggunakan JavaScript array atau objek yang tidak diketik sebagai input ke metode. (Lihat, misalnya, AWS CodeBuild BuildSpec.fromObject()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

Konstruksi tertentu mengharapkan properti yang merupakan daftar beberapa jenis (tipe gabungan di TypeScript). DalamGo, ini adalah sebagai sepotong dari any (*[]any). anyMemastikan bahwa kompiler akan memungkinkan penugasan berbagai jenis di sana. Lihat dokumentasi AWS CDK Go package 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

Misalnya:

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 kustom

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 instantiateds3.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

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 telah Anda tulis dengan menjalankan go test pada prompt perintah.

Penyelesaian Masalah

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() denganjsii.AnyStrings(). Lihat ini CDK GitHub issue untuk konteks lebih lanjut dan solusi tambahan.