aws-lambda-swift

Swift 5.1

这个项目的目标是为 Swift 编程语言实现一个自定义的 AWS Lambda 运行时。

步骤 1:实现一个 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()

步骤 2:构建 Lambda

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

步骤 3:构建层

我们现在有了一个 Linux 可执行文件。 但是,此可执行文件动态链接到 Swift 标准库和一堆其他共享库(Foundation,Grand Central Dispatch,Glibc 等)。 这些库在 Amazon Linux 上不可用。 因此,我创建了一个 AWS Lambda 层,其中包含所有这些共享库。 然后,AWS Lambda 可以引用此层。 这样可以确保我们只需上传一次库,而不是每次更新 Lambda 时都上传。 运行以下命令来创建一个包含 bootstrap 文件和层库的 swift-lambda-runtime.zip 文件。

make package_layer

bootstrap 文件是一个简单的 shell 脚本,用于启动可执行文件。

步骤 4:在 AWS 上设置层

在 AWS 管理控制台中使用 swift-lambda-runtime.zip 文件创建一个新的 Lambda 层。

Create a new layer

这可能需要几分钟。 上传完成后,该层的 ARN(Amazon 资源名称)将显示在该页面上。 在下一步中,我们将使用此 ARN 从 Lambda 引用该层。

步骤 5:在 AWS 上设置 Lambda

首先,在 AWS 管理控制台中创建一个新的 Lambda 函数,然后选择 “在函数代码或层中使用自定义运行时”。

Create a new lambda function

接下来,选择 lambda.zip 文件作为要上传的函数包,并将处理程序设置为 "SquareNumber.squareNumber"。 处理程序的第一部分应与可执行文件的名称相同。 处理程序的第二部分应与用于在运行时中注册 Lambda 处理程序的名称相同(请参见步骤 1)。

Upload the function package and set the handler

单击“层”按钮,然后单击“添加层”按钮。 使用其 ARN 引用我们在步骤 4 中创建的层,然后单击“添加”按钮。

Reference the layer from the lambda

最后,单击右上角的“保存”按钮以保存这些更改。

步骤 6:测试 Lambda

现在,Lambda 函数已准备好进行测试。 单击“选择一个测试事件”,然后单击“配置测试事件”。 像这样配置一个新的测试事件。

Create a new test event

然后通过单击“测试”按钮,使用新的测试事件调用 Lambda 函数。 您应该看到以下结果。

Successful lambda execution result