AWS CDK 在 Go 中使用 - AWS Cloud Development Kit (AWS CDK) V2

這是 AWS CDK v2 開發人員指南。較舊的 CDK V1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS CDK 在 Go 中使用

Go 是完全支援的用戶端語言, AWS Cloud Development Kit (AWS CDK) 且被認為是穩定的。 AWS CDK 在 Go 中使用使用熟悉的工具。Go 版本的 AWS CDK 甚至使用 GO 風格的標識符。

與CDK支持的其他語言不同,Go 不是傳統的面向對象編程語言。Go 使用其他語言經常利用繼承的組合。我們試圖盡可能地採用慣用的 Go 方法,但有些地方可能CDK會有所不同。

本主題 AWS CDK 在 Go 中使用時提供指導。請參閱公告部落格文章,瞭解 AWS CDK.

開始使用 Go

若要使用 AWS CDK,您必須擁有 AWS 帳戶和認證,並已安裝 Node.js 和工 AWS CDK 具組。請參閱 開始使用 AWS CDK

Go 綁定 AWS CDK 使用標準 Go 工具鏈,v1.18 或更高版本。您可以使用您選擇的編輯器。

注意

第三方語言棄用:語言版本僅在供應商或社區共享其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 文檔和示例中,「module」一詞通常用於指向 AWS 構造庫模塊,每個 AWS 服務一個或多個,這與術語的慣用 Go 用法不同。CDK構造庫在一個 Go 模塊中提供,其中包含各個構造庫模塊,該模塊支持各種 AWS 服務,以該模塊內的 Go 包形式提供。

某些服務的「 AWS 建構程式庫」支援位於多個「建構程式庫」模組 (Go 套件) 中。例如,Amazon Route 53 除了主awsroute53套件之外,還有三個「建構程式庫」模組 (名為awsroute53patternsawsroute53resolver、和) 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 )

Package 名稱(模塊,在 Go 語言中)由附加所需URL的版本號指定。Go 的模塊系統不支持版本範圍。

發出命go get令以安裝所有必需的模組並進行更新go.mod。若要查看相依性的可用更新清單,請問題go list -m -u all

AWS CDK 在圍棋成語

欄位和方法名稱

欄位和方法名稱在原始語言中 TypeScript使用駱駝大小寫 (likeThis)。CDK在 Go 中,這些遵循 Go 約定,帕斯卡套管()也是如此。LikeThis

清除

在您的main方法中,使用defer jsii.Close()以確保您的CDK應用程序自行清理。

缺少值和指針轉換

在 Go 中, AWS CDK 對象(如屬性包)中缺少的值由表示nil。Go 沒有可為空的類型; 可以包含的唯一類型nil是一個指針。為了允許值是可選的,那麼所有CDK屬性,參數和返回值都是指針,即使對於原始類型也是如此。這適用於必要值以及可選值,因此,如果稍後的必要值變為可選值,則不需要中斷類型變更。

傳遞常值或運算式時,請使用下列輔助函式來建立值的指標。

  • jsii.String

  • jsii.Number

  • jsii.Bool

  • jsii.Time

為了保持一致性,我們建議您在定義自己的構造時使用類似的指針,即使例如,將構造id作為字符串接收而不是指向字符串的指針似乎更方便。

在處理可選 AWS CDK 值(包括原始值和複雜類型)時,您應該明確測試指針以確保它們在對它們執行任何操作nil之前不會出現。Go 沒有「語法糖」來幫助處理空值或缺失的值,就像其他語言一樣。但是,保證屬性包和類似結構中的所需值存在(否則構建失敗),因此不需要nil檢查這些值。

構造和道具

構造,它代表一個或多個 AWS 資源及其相關屬性,在 Go 中表示為接口。例如,awss3.Bucket是一個接口。每個構造都有一個工廠函數,例如awss3.NewBucket,返回一個實現相應接口的結構體。

所有的工廠函數都有三個參數:scope在其中定義構造(它在構造樹中的父項),一個id,和props,構造用於配置它創建的資源的鍵/值對的捆綁。「屬性包」模式也在中的其他地方使用 AWS CDK。

在 Go 中,prop 由每個構造的特定結構類型表示。例如,一個awss3.Bucket需要類型的 prop 引數awss3.BucketProps。使用結構常值來編寫 prop 參數。

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 中,編寫一個新的構造比擴展現有構造更直接。首先,定義一個新的結構類型,如果需要類似擴展的語義,匿名嵌入一個或多個現有類型。為您要新增的任何新功能撰寫方法,以及保存所需資料所需的欄位。如果您的構造需要,請定義道具接口。最後,編寫一個工廠函數NewMyConstruct()來返回構造的一個實例。

如果您只是在現有構造上更改某些默認值或在實例化時添加簡單的行為,則不需要所有管道。相反,編寫一個工廠函數來調用您正在「擴展」的構造的工廠函數。例如,在其他CDK語言中,您可以建立一個建TypedBucket構,藉由覆寫類型強制執行 Amazon S3 儲存貯體中的物件類型,並在新s3.Bucket類型的初始化設定式中新增儲存貯體政策,該政策只允許將指定的副檔名新增至儲存貯體。在 Go 中,簡單地編寫一個返回NewTypedBucket已添加適當存儲桶策略的s3.Bucket(實例化使用s3.NewBucket)更容易。沒有新的建構類型是必要的,因為這項功能已經在標準值區建構中可用;新的「建構」只是提供了一種更簡單的配置方式。

建置、合成和部署

在運行之前 AWS CDK 會自動編譯您的應用程序。但是,手動構建應用程序以檢查錯誤並運行測試可能很有用。您可以通過在項目根目錄中的命令提示符下發go build出來執行此操作。

go test在命令提示字元中執行您撰寫的任何測試。