使用 AWS Lambda 的 Swift Serverless 简介
Serverless 架构正成为现代云开发的标准。借助 AWS Lambda,开发者可以在无需管理服务器的情况下运行代码,仅按实际执行时间付费。直到最近,Swift 一直游离在 serverless 世界之外,但随着 AWS Lambda 对 Swift 的官方支持出现,情况发生了根本性变化。
在本文中,我们将介绍使用 Swift 开发 serverless 函数的完整工作流程:从环境设置到生产环境部署。您将学习如何利用您的 iOS/macOS 开发经验来构建高效的云解决方案。
为什么选择 Swift 用于 Serverless?
Swift 不仅仅是用于移动应用的语言。其优势使其成为 serverless 的绝佳选择:
- 类型安全 — 编译器在构建阶段捕获错误
- 高性能 — 原生代码比解释型语言运行更快
- 现代语法 — 代码易于阅读和维护
- 共享代码库 — 可以重用 iOS/macOS 项目中的模型和逻辑
为了在 AWS Lambda 上运行 Swift,使用了预装 Swift 5.10 的官方 Amazon Linux 2 镜像。这保证了完全兼容性和最小的冷启动时间。
环境设置和创建第一个函数
安装必要的工具
在开始之前,请确保您已安装:
- Swift 5.10 或更新版本
- Docker(用于在 Linux 环境中构建)
- 已配置凭据的 AWS CLI
- Homebrew(适用于 macOS)
# 通过 Homebrew 安装 Swiftbrew install swift
# 检查版本swift --version
# 安装 AWS CLIbrew install awscli
# 配置 AWSaws configure创建 Swift Package 项目
让我们创建一个新的可执行 Swift 包:
mkdir MyLambdaFunctioncd MyLambdaFunctionswift package init --type executable现在更新 Package.swift 以使用 AWS Lambda Runtime:
// swift-tools-version:5.10import PackageDescription
let package = Package( name: "MyLambdaFunction", platforms: [.macOS(.v13)], dependencies: [ .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0") ], targets: [ .executableTarget( name: "MyLambdaFunction", dependencies: [ .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime") ]), .testTarget( name: "MyLambdaFunctionTests", dependencies: ["MyLambdaFunction"]), ])处理函数代码
替换 Sources/MyLambdaFunction/main.swift 的内容:
import AWSLambdaRuntime
// 定义请求结构体struct Request: Codable { let name: String let age: Int}
// 定义响应结构体struct Response: Codable { let message: String let isAdult: Bool}
// 主处理器@mainstruct MyHandler: SimpleLambdaHandler { typealias Event = Request typealias Output = Response
func handle(_ event: Request, context: LambdaContext) async throws -> Response { let isAdult = event.age >= 18 return Response( message: "你好,\\(event.name)!", isAdult: isAdult ) }}构建并部署到 AWS Lambda
为 Linux 构建
由于 macOS 上的 Swift 会为 macOS 构建二进制文件,我们需要使用 Docker:
# 创建 Dockerfilecat << EOF > DockerfileFROM swift:5.10-amazonlinux2 AS buildWORKDIR /appCOPY . .RUN swift build -c release --