Use Swift on AWS Lambda with Xcode
Developer Tools 进阶 20m

在 AWS Lambda 上使用 Swift 与 Xcode

Use Swift on AWS Lambda with Xcode

2020年6月26日

在 Apple 官方观看视频

一句话判断

Swift 不只是 Apple 平台的语言——这场 Session 展示了如何用 Swift 编写 AWS Lambda 函数,用 Xcode 开发和调试,然后部署到云端。

这场 Session 讲了什么

这场 Session 介绍了一个有趣的方向:使用 Swift 作为 AWS Lambda 的运行时语言。AWS Lambda 是 Amazon 的无服务器计算服务,传统上支持 Python、Node.js、Java 等语言。Apple 在 2020 年展示了如何用 Swift 编写 Lambda 函数,并利用 Swift 的编译型语言优势获得更好的冷启动性能。

演讲者首先介绍了 Swift AWS Lambda Runtime——一个开源的 Swift 包,提供了 Lambda 运行时的协议和基础设施。你只需要实现一个处理函数,接收事件输入、返回处理结果。Swift 的编译型特性意味着 Lambda 函数的冷启动时间比解释型语言短得多——通常在毫秒级别。

Session 的核心部分演示了完整的开发流程。在 Xcode 中创建一个 Swift Executable 项目,添加 SwiftAWSLambdaRuntime 依赖,编写处理逻辑,然后在本地调试。部署时使用 Swift Docker 镜像编译为 Linux 可执行文件,打包成 Lambda 部署包上传到 AWS。

演讲者还展示了几个实际用例:处理 API Gateway 请求的 HTTP API、处理 S3 事件的图片处理管道、以及 DynamoDB 数据变更触发的事件处理。

值得深挖的点

  • 冷启动性能的优势:Serverless 架构的一个痛点是冷启动——Lambda 函数在闲置后被回收,下次请求需要重新启动运行时和加载代码。Python/Node.js 的冷启动通常需要几百毫秒到几秒。Swift 编译为原生二进制,不需要 VM 或解释器,冷启动可以做到几十毫秒。对于延迟敏感的 API 场景,这个差异很关键。
  • Swift 跨平台能力的演进:Swift 5.3 在 Linux 上的支持越来越完善。利用 Docker 编译意味着你不需要在 Mac 上交叉编译——可以在 CI 中使用 Linux Docker 镜像直接构建 Lambda 二进制。

代码片段

// 最简单的 Lambda 函数
import AWSLambdaRuntime

// 定义输入输出结构
struct Event: Codable {
    let name: String
    let count: Int
}

struct Response: Codable {
    let message: String
    let total: Int
}

// Lambda 处理函数
Lambda.run { (context, event: Event, callback: @escaping (Result<Response, Error>) -> Void) in
    let response = Response(
        message: "Hello, \(event.name)!",
        total: event.count * 2
    )
    callback(.success(response))
}
// 处理 API Gateway 请求
import AWSLambdaRuntime
import AWSLambdaEvents

Lambda.run { (
    context: Lambda.Context,
    event: APIGateway.V2.Request,
    callback: @escaping (Result<APIGateway.V2.Response, Error>) -> Void
) in
    // 解析请求路径和方法
    let path = event.rawPath
    let method = event.requestContext.http.method

    switch (method, path) {
    case ("GET", "/users"):
        let users = fetchUsers()
        let body = try? JSONEncoder().encode(users)
        callback(.success(APIGateway.V2.Response(
            statusCode: .ok,
            body: body.flatMap { String(data: $0, encoding: .utf8) }
        )))
    default:
        callback(.success(APIGateway.V2.Response(statusCode: .notFound)))
    }
}
# 构建和部署流程
# 1. 使用 Docker 编译为 Linux 二进制
docker run --rm -v "$PWD:/workspace" -w /workspace \
  swift:5.3-amazonlinux2 \
  swift build --product MyLambda -c release

# 2. 打包部署文件
cp .build/release/MyLambda /tmp/lambda/bootstrap
cd /tmp/lambda && zip function.zip bootstrap

# 3. 部署到 AWS Lambda
aws lambda create-function \
  --function-name MySwiftFunction \
  --runtime provided.al2 \
  --handler bootstrap \
  --zip-file fileb://function.zip \
  --role arn:aws:iam::123456789:role/lambda-role

最佳实践

  • 使用 Swift 的 Codable 协议处理 JSON 输入输出,类型安全且自动序列化
  • 在 Xcode 中本地调试时使用 Lambda.local() 模拟 Lambda 运行时环境
  • CI 中使用 Amazon Linux 2 Docker 镜像编译,确保二进制与 Lambda 环境兼容
  • 对于计算密集型任务,Swift 的性能优势更明显——图片处理、数据转换等场景优先考虑
  • 监控 Lambda 的执行时间和内存消耗,Swift 的低开销特性可以帮你节省 AWS 费用

还有什么值得关注

  • Swift Server Work Group 在持续推动 Swift 的服务端生态,包括 async/await 在服务端的应用
  • Vapor 和 Perfect 等 Swift 服务端框架也可以部署到 AWS Lambda
  • 搭配 “Explore numerical computing in Swift” 一起看,可以了解 Swift 在非 Apple 平台上的更多可能性
WWDC 2020