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 版本使用 G AWS CDK o 风格的标识符。

与其CDK支持的其他语言不同,Go 不是传统的面向对象编程语言。Go 使用其他语言经常利用继承的组合。我们尝试尽可能使用惯用的 Go 方法,但有些地方CDK可能会有所不同。

本主题提供 AWS CDK 在 Go 中使用 Go 的指导。有关一个简单的 Go 项目的演练,请参阅公告博客文章。 AWS CDK

开始使用 Go

要使用 AWS CDK,您必须拥有 AWS 账户和凭证,并已安装 Node.js 和 AWS CDK Toolkit。请参阅 开始使用 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 模块的引用go.modgithub.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 还有三个构造库模块awsroute53targetsawsroute53resolver

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在其中定义构造的(构造树中的父项)、一个idprops、以及构造用来配置其创建的资源的键/值对的捆绑包。其他地方也使用了 “属性包” 模式 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下运行您编写的所有测试。