Serverless функции на Swift: AWS Lambda для iOS/macOS разработчиков

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в Serverless функции на Swift с AWS Lambda

Мир мобильной и серверной разработки стремительно меняется. Если вы iOS/macOS разработчик, привыкший работать с Swift, то, возможно, задумывались о том, как перенести свои навыки на серверную сторону. Serverless архитектура и AWS Lambda открывают перед вами эту возможность. Больше не нужно управлять серверами — вы просто пишете код, который запускается в ответ на события.

В этой статье мы разберем, как создавать serverless функции на Swift для AWS Lambda. Вы узнаете, как настроить окружение, написать простую функцию и развернуть её в облаке. Это руководство идеально подойдет для разработчиков, которые хотят расширить свои компетенции и начать использовать Swift не только для создания интерфейсов, но и для бэкенда.

Почему Swift для Serverless?

Swift давно перестал быть языком только для iOS. Благодаря таким проектам, как Swift AWS Lambda Runtime, вы можете использовать знакомый синтаксис и экосистему для написания серверного кода. Вот ключевые преимущества:

  • Производительность: Swift компилируется в нативный код, что дает высокую скорость выполнения и низкое потребление памяти.
  • Безопасность типов: Строгая типизация Swift помогает избежать множества ошибок на этапе компиляции, что критично для серверного кода.
  • Единый стек: Используя Swift на клиенте и сервере, вы сокращаете контекстное переключение и можете переиспользовать общие модели данных.
  • Активное сообщество: Серверный Swift активно развивается, появляются новые библиотеки и инструменты.

Настройка окружения и создание проекта

Прежде чем писать код, необходимо установить необходимые инструменты. Вам понадобится macOS с Xcode (или командная строка) и Docker для сборки под Linux (так как AWS Lambda работает на Amazon Linux).

Шаг 1: Установка Swift и Docker

Убедитесь, что у вас установлен Swift 5.5 или новее. Проверить версию можно командой:

swift --version

Также установите Docker Desktop для macOS. Он понадобится для компиляции под целевую архитектуру Lambda.

Шаг 2: Создание нового проекта

Мы будем использовать менеджер пакетов Swift (SPM). Создайте новый исполняемый пакет:

mkdir MyLambdaFunction
cd MyLambdaFunction
swift package init --type executable

Шаг 3: Добавление зависимости AWS Lambda Runtime

Откройте файл Package.swift и добавьте зависимость:

// swift-tools-version:5.5
import PackageDescription

let package = Package(
    name: "MyLambdaFunction",
    platforms: [.macOS(.v12)],
    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")
            ]
        )
    ]
)

Написание первой Serverless функции на Swift

Теперь перейдем к самому интересному — написанию кода. Откройте файл main.swift в папке Sources/MyLambdaFunction/.

Базовая структура Lambda-функции

Вот минимальный пример функции, которая принимает имя и возвращает приветствие:

import AWSLambdaRuntime
import AWSLambdaEvents

// Определяем структуру входящего запроса
struct GreetingRequest: Codable {
    let name: String
}

// Определяем структуру ответа
struct GreetingResponse: Codable {
    let message: String
}

// Главная точка входа
@main
struct MyLambdaHandler: SimpleLambdaHandler {
    typealias Event = GreetingRequest
    typealias Output = GreetingResponse

    func handle(_ event: GreetingRequest, context: LambdaContext) async throws -> GreetingResponse {
        let message = "Привет, \(event.name)! Добро пожаловать в мир Serverless на Swift."
        return GreetingResponse(message: message)
    }
}

Объяснение кода

  • SimpleLambdaHandler — протокол, который реализует ваша функция. Он требует определить типы входящего события (Event) и ответа (Output).
  • Codable структуры используются для автоматической сериализации/десериализации JSON.
  • handle — основная функция, которая вызывается при каждом запросе. Она асинхронная (async throws), что позволяет работать с сетью или базой данных.

Локальное тестирование

Перед развертыванием стоит протестировать функцию локально. Для этого можно использовать встроенный HTTP сервер из библиотеки AWSLambdaTesting или просто запустить бинарник и отправить ему JSON через curl.

Добавьте в Package.swift зависимость для тестирования:

// В секцию dependencies
.package(url: "https://github.com/swift-server/swift-aws-lambda-testing.git", from: "1.0.0")

Затем напишите простой тест в отдельном файле:

import XCTest
@testable import MyLambdaFunction

final class MyLambdaTests: XCTestCase {
    func testGreeting() async throws {
        let handler = MyLambdaHandler()
        let request = GreetingRequest(name: "Алексей")
        let response = try await handler.handle(request, context: .mock())
        XCTAssertEqual(response.message, "Привет, Алексей! Добро пожаловать в мир Serverless на Swift.")
    }
}

Сборка и развертывание на AWS Lambda

Ключевой момент — сборка под Linux. AWS Lambda работает на Amazon Linux 2, поэтому наш бинарник должен быть скомпилирован для этой платформы.

Шаг 1: Сборка с помощью Docker

Используйте официальный образ Swift для сборки:

docker run --rm \
  -v "$PWD":/workspace \
  -w /workspace \
  swift:5.5-amazonlinux2 \
  swift build --product MyLambdaFunction -c release

После завершения сборки бинарник будет лежать в папке .build/release/MyLambdaFunction.

Шаг 2: Упаковка в ZIP

Lambda ожидает получить ZIP-архив с бинарником. Создайте архив:

zip -j lambda.zip .build/release/MyLambdaFunction                

Блоги

Рекомендаций по книгам