构建Golang Lambda功能
#aws #serverless #go #cdk

使用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功能提供了几个选项。就个人而言,选择归结为:

如果两个是肯定的答案,则只需坚持构造选择的默认运行时即可。那将是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是我在许多地方都没有记录的作品,在部署中取得一些收益是一个容易的事。