这是 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 版本使用 G AWS CDK o 风格的标识符。
与其CDK支持的其他语言不同,Go 不是传统的面向对象编程语言。Go 使用其他语言经常利用继承的组合。我们尝试尽可能使用惯用的 Go 方法,但有些地方CDK可能会有所不同。
本主题提供 AWS CDK 在 Go 中使用 Go 的指导。有关一个简单的 Go 项目的演练,请参阅公告博客文章
开始使用 Go
要使用 AWS CDK,您必须拥有 AWS 账户和凭证,并已安装 Node.js 和 AWS CDK Toolkit。请参阅 开始使用 AWS CDK。
的 Go 绑定 AWS CDK 使用标准的 Go 工具链
注意
第三方语言弃用:语言版本仅在供应商或社区共享EOL(生命周期结束)之前才受支持,如有更改,恕不另行通知。
创建项目
您可以通过在空目录cdk init
中调用来创建新 AWS CDK 项目。使用该--language
选项并指定go
:
mkdir my-project cd my-project cdk init app --language go
cdk init
使用项目文件夹的名称来命名项目的各种元素,包括类、子文件夹和文件。文件夹名称中的连字符将转换为下划线。但是,除此之外,名称应遵循 Go 标识符的形式;例如,它不应以数字开头或包含空格。
生成的项目包括对中核心 AWS CDK Go 模块的引用go.mod
。github.com/aws/aws-cdk-go/awscdk/v2
安装go
get此模块和其他必需模块时出现问题。
管理 AWS 构造库模块
在大多数 AWS CDK 文档和示例中,“模块” 一词通常用于指 AWS 构造库模块,每个 AWS 服务一个或多个模块,这与该术语的惯用 Go 用法不同。CDK构造库在一个 Go 模块中提供,其中包含单独的构造库模块,这些模块支持该模块中作为 Go 包提供的各种 AWS 服务。
某些服务的 AWS 构造库支持位于多个构造库模块(Go 包)中。例如,除了名为awsroute53patterns
、和的主awsroute53
包之外,Amazon Route 53 还有三个构造库模块awsroute53targets
。awsroute53resolver
AWS CDK的核心包是你在大多数 AWS CDK 应用程序中都需要的,在 Go 代码中导入为github.com/aws/aws-cdk-go/awscdk/v2
。Construct Library 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 惯例,Pascal 大小写的 () 也是如此。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 中,道具由每个构造的特定结构类型表示。例如,awss3.Bucket
采用类型awss3.BucketProps
为 props 的参数。使用结构体字面量来编写 props 参数。
var bucket = awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{ Versioned: jsii.Bool(true), })
通用结构
在某些地方, AWS CDK 使用 JavaScript 数组或非类型化对象作为方法的输入。(例如, AWS CodeBuild参见BuildSpec.fromObject()
的方法。) 在 Go 中,这些对象分别表示为切片和空接口。
CDK提供了可变参数辅助函数,例如jsii.Strings
用于构建包含原始类型的切片。
jsii.Strings("One", "Two", "Three")
开发自定义结构
在 Go 中,编写新构造通常比扩展现有构造更简单。首先,定义一个新的结构类型,如果需要类似扩展的语义,则匿名嵌入一个或多个现有类型。为您要添加的任何新功能以及保存所需数据所需的字段编写方法。如果你的构造需要一个 props 接口,可以定义一个 props 接口。最后,编写一个工厂函数NewMyConstruct()
来返回构造的实例。
如果你只是在现有构造上更改一些默认值,或者在实例化时添加一个简单的行为,那么你就不需要所有这些管道了。相反,写一个工厂函数来调用你正在 “扩展” 的构造的工厂函数。例如,在其他CDK语言中,您可以创建一个TypedBucket
构造来强制执行 Amazon S3 存储桶中对象的类型,方法是覆盖该s3.Bucket
类型,然后在新类型的初始化器中添加仅允许将指定的文件扩展名添加到存储桶的存储桶策略。在 Go 中,更容易简单地编写一个NewTypedBucket
返回您已向其中添加了相应存储桶策略的s3.Bucket
(使用实例化的s3.NewBucket
)。不需要新的构造类型,因为标准存储桶构造中已经提供了该功能;新的 “构造” 只是提供了一种更简单的配置方式。
构建、合成和部署
在运行您的应用程序之前 AWS CDK 会自动对其进行编译。但是,手动构建应用程序以检查错误和运行测试可能会很有用。你可以通过在项目的根目录go build
下在命令提示符下发出命令来做到这一点。
在命令提示符go test
下运行您编写的所有测试。