这个项目的目标是为 Swift 编程语言实现一个自定义的 AWS Lambda 运行时。
Examples/SquareNumber
是一个 SPM 包,带有一个单独的可执行目标,该目标实现了 Lambda 处理函数。 这个包依赖于 AWSLambdaSwift
包,该包生成一个包含实际运行时的库。 在 SquareNumber
可执行文件的 main.swift 文件中,我们导入 AWSLambdaSwift 库,实例化 Runtime
类,然后注册我们的处理函数。 最后,我们启动运行时。
import AWSLambdaSwift
struct Input: Codable {
let number: Double
}
struct Output: Codable {
let result: Double
}
func squareNumber(input: Input, context: Context) -> Output {
let squaredNumber = input.number * input.number
return Output(result: squaredNumber)
}
let runtime = try Runtime()
runtime.registerLambda("squareNumber", handlerFunction: squareNumber)
try runtime.start()
处理函数接受两个参数:input
对象,它可以是任何符合 Decodable
协议的类型,以及 context
对象。 然后它处理输入并返回一个输出。 输出可以是任何符合 Encodable
协议的类型。
或者,您也可以定义一个处理函数,该函数接受和返回一个 JSONDictionary
。 此类型只是 Dictionary<String, Any>
类型的类型别名。
import AWSLambdaSwift
extension String: Error {}
func squareNumber(input: JSONDictionary, context: Context) throws -> JSONDictionary {
guard let number = input["number"] as? Double else {
throw "invalid input data"
}
let squaredNumber = number * number
return ["result": squaredNumber]
}
let runtime = try Runtime()
runtime.registerLambda("squareNumber", handlerFunction: squareNumber)
try runtime.start()
AWS Lambda 在 Amazon Linux 上运行 (参见 https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)。 这意味着我们不能直接在 macOS 上运行 swift build
,因为这会生成一个在 Linux 上无法运行的 macOS 可执行文件。 相反,我使用 Docker 来构建 SquareNumber
包。 执行以下命令来构建 SquareNumber
包并将可执行文件打包到 lambda.zip
文件中。
make package_lambda
我们现在有了一个 Linux 可执行文件。 但是,此可执行文件动态链接到 Swift 标准库和一堆其他共享库(Foundation,Grand Central Dispatch,Glibc 等)。 这些库在 Amazon Linux 上不可用。 因此,我创建了一个 AWS Lambda 层,其中包含所有这些共享库。 然后,AWS Lambda 可以引用此层。 这样可以确保我们只需上传一次库,而不是每次更新 Lambda 时都上传。 运行以下命令来创建一个包含 bootstrap
文件和层库的 swift-lambda-runtime.zip
文件。
make package_layer
bootstrap
文件是一个简单的 shell 脚本,用于启动可执行文件。
在 AWS 管理控制台中使用 swift-lambda-runtime.zip
文件创建一个新的 Lambda 层。
这可能需要几分钟。 上传完成后,该层的 ARN(Amazon 资源名称)将显示在该页面上。 在下一步中,我们将使用此 ARN 从 Lambda 引用该层。
首先,在 AWS 管理控制台中创建一个新的 Lambda 函数,然后选择 “在函数代码或层中使用自定义运行时”。
接下来,选择 lambda.zip
文件作为要上传的函数包,并将处理程序设置为 "SquareNumber.squareNumber"。 处理程序的第一部分应与可执行文件的名称相同。 处理程序的第二部分应与用于在运行时中注册 Lambda 处理程序的名称相同(请参见步骤 1)。
单击“层”按钮,然后单击“添加层”按钮。 使用其 ARN 引用我们在步骤 4 中创建的层,然后单击“添加”按钮。
最后,单击右上角的“保存”按钮以保存这些更改。
现在,Lambda 函数已准备好进行测试。 单击“选择一个测试事件”,然后单击“配置测试事件”。 像这样配置一个新的测试事件。
然后通过单击“测试”按钮,使用新的测试事件调用 Lambda 函数。 您应该看到以下结果。