使用CDK来构建Golang Lambda功能是一个超级简单的过程,很容易使用。它是well documented,是aws-cdk-lib/aws-lambda
中定义的Function
类的子类。不确定CDK或它可以为您做什么? Have a read here开始开始,看看所有大惊小怪。
我最近写了很多文章,其中包含CDK,其中包含打字稿示例,强调了基于Golang的Lambdas的构建。但是我意识到我没有显示Construct
暴露的其他其他功能。我想浏览以下选项。
- 入口点
- 选择的运行时
- 超时
- 功能名称
- lambda环境定义
- 建立包括构建标志的论点
在本文的其余部分中漫步的一个例子。
new GoFunction(scope, "ExampleFuncHandler", {
entry: path.join(__dirname, "./example-func"),
functionName: "example-func",
timeout: Duration.seconds(30),
bundling: {
goBuildFlags: ['-ldflags "-s -w"'],
},
environment: {
LOG_LEVEL: "INFO",
TABLE_NAME: "ExampleTable",
},
});
入口点
entry: path.join(__dirname, "./example-func");
GoFunction
上的输入属性告诉构造在哪里可以找到您的main.go
或“条目”点。
运行
在选择该运行时环境时,在构建后部署Golang Lambda功能提供了几个选项。就个人而言,选择归结为:
- 您要运行默认值吗?
- 您是否想有能力运行Lambda Extensions?
如果两个是肯定的答案,则只需坚持构造选择的默认运行时即可。那将是AL2(Amazon Linux 2)。如果要从控制台中选择它,它将在自定义运行时选项中。请记住,当使用AL2时,您需要将二进制命名为bootstrap
。
功能名称
functionName: "example-func",
这个很简单。我唯一的建议是在适合常见的“应用程序”或分组时以类似前缀的名字命名。
暂停
timeout: Duration.seconds(30),
也很简单。但是,当构建Golang Lambda的功能时,请仔细考虑超时。这是您希望函数在代码中等待响应的Duration
。不要太低,但也不要太高。在您的代码中,始终在知道可以的时候返回。
Lambda环境定义
environment: {
LOG_LEVEL: "INFO",
TABLE_NAME: "ExampleTable",
},
尽力包含可能改变环境变量的参数。如果您有敏感的类型信息,偏爱SSM或Secrets Manager,但是对于表名称或日志级别等内容,则变量是完美的。使用CDK,您可以用功能填写这些功能,以获取表名称的表构造上的log latver或属性。
一个简单的日志级函数可能看起来像这样
export const getLogLevel = (stage: StageEnvironment): string => {
switch (stage) {
case StageEnvironment.DEV:
case StageEnvironment.QA:
return "debug";
}
return "error";
};
建立参数
我错过的所有文章中都错过的一件事是gofunction构造的这一部分。构建Golang Lambda功能时,您可以选择使用本地Golang安装或强迫构建在Docker容器中发生。由于我的Mac上的本地构建速度,我倾向于不在Docker中建造(这是记录在案的慢速事物)。
我确实想建议使用goBuildFlags
来修剪可执行文件的大小。你这样做:
bundling: {
goBuildFlags: ['-ldflags "-s -w"'],
},
使用Golang,“ LDFlags”代表Linker Flags,并指示Golang构建工具如何将二进制组合在一起。我建议的两个旗帜是-s
和-w
。 golang:
> go tool link
-s disable symbol table
-w disable DWARF generation
这两个选项应缩小您的可执行文件20-25%,这会对以下影响产生一定的影响。
- 二进制较小,发射越快和冷启动
- 较小的二进制
包起来
CDK改变了我在AWS中构建和部署解决方案的方式。它在我全面采用Golang作为我的无服务器应用程序的主要语言中发挥了重要作用。我希望您能挑选一些技巧。 ldflags
是我在许多地方都没有记录的作品,在部署中取得一些收益是一个容易的事。