使用 AWS Lambda 的 Swift 无服务器函数简介
\n\n无服务器架构在开发者中持续流行,现在 Swift 也不例外。得益于 AWS Lambda 平台对 Swift 的支持,iOS 和 macOS 开发者可以使用原生语言编写云函数,充分利用 Swift 生态系统的全部功能。在本文中,我们将从头开始讲解如何创建、配置和部署一个 Swift 无服务器函数。
\n\n无服务器函数允许您无需管理服务器即可运行代码。您只需为执行时间付费,并且扩展是自动进行的。AWS Lambda 通过官方运行时镜像支持 Swift,这使其成为 Apple 生态系统中后端任务的绝佳选择。
\n\n为在 AWS Lambda 上开发 Swift 准备环境
\n\n安装必要的工具
\n\n开始之前,请确保您已安装以下工具:
\n\n- \n
- Swift 5.9+ — 可从 swift.org 下载 \n
- Docker — 用于在 Linux 环境中构建 \n
- AWS CLI — 用于部署 \n
- Xcode 15+(可选,适用于 macOS) \n
创建 Swift Package 项目
\n\n创建一个支持 AWS Lambda 的新 Swift Package:
\n\nmkdir MyLambdaFunction\ncd MyLambdaFunction\nswift package init --type executable\n\n打开 Package.swift 并添加对 AWSLambdaRuntime 的依赖:
// swift-tools-version: 5.9\nimport PackageDescription\n\nlet package = Package(\n name: "MyLambdaFunction",\n platforms: [.macOS(.v13)],\n dependencies: [\n .package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", from: "1.0.0")\n ],\n targets: [\n .executableTarget(\n name: "MyLambdaFunction",\n dependencies: [\n .product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime")\n ]\n )\n ]\n)\n\n编写第一个 Swift 无服务器函数
\n\nLambda 函数的基本结构
\n\n创建文件 Sources/MyLambdaFunction/main.swift,内容如下:
import AWSLambdaRuntime\nimport AWSLambdaEvents\n\n// 定义请求结构体\nstruct GreetingRequest: Codable {\n let name: String\n}\n\n// 定义响应结构体\nstruct GreetingResponse: Codable {\n let message: String\n let timestamp: String\n}\n\n// 主处理器\n@main\nstruct MyLambdaHandler: SimpleLambdaHandler {\n typealias Event = GreetingRequest\n typealias Output = GreetingResponse\n \n func handle(_ event: GreetingRequest, context: LambdaContext) async throws -> GreetingResponse {\n let dateFormatter = DateFormatter()\n dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"\n \n return GreetingResponse(\n message: "你好,\\(event.name)! 欢迎来到 Swift 无服务器世界。",\n timestamp: dateFormatter.string(from: Date())\n )\n }\n}\n\n处理 HTTP 请求(API Gateway)
\n\n要使用 API Gateway,请使用 APIGatewayV2Request:
import AWSLambdaRuntime\nimport AWSLambdaEvents\n\n@main\nstruct HTTPHandler: SimpleLambdaHandler {\n typealias Event = APIGatewayV2Request\n typealias Output = APIGatewayV2Response\n \n func handle(_ event: APIGatewayV2Request, context: LambdaContext) async throws -> APIGatewayV2Response {\n // 从查询参数中获取数据\n let name = event.queryStringParameters?["name"] ?? "访客"\n \n let responseBody = """\n {\n "message": "Hello, \\(name)!",\n "path": "\\(event.rawPath)"\n }\n """\n \n return APIGatewayV2Response(\n statusCode: .ok,\n