Интеграция AWS Lambda для серверной логики мобильного приложения
AWS Lambda — serverless-функции, которые исполняются по запросу и не требуют управления серверами. Для мобильного приложения Lambda закрывает серверную логику, которую нельзя вынести на клиент: верификация платежей, генерация подписанных URL для S3, пуш-уведомления, обработка вебхуков от Stripe/Apple IAP, тяжёлые вычисления.
Архитектура мобильный клиент → Lambda
Мобильное приложение вызывает Lambda через один из путей:
API Gateway + Lambda — самый распространённый. REST или HTTP API Gateway принимает запрос, проксирует в Lambda. Lambda отвечает — Gateway отдаёт клиенту. Авторизация через Cognito Authorizer или JWT Authorizer.
AppSync + Lambda resolver — для GraphQL. Lambda выступает resolver-ом для конкретных полей схемы.
Lambda Function URL — прямой HTTPS-эндпоинт для функции без API Gateway. Дешевле и проще, но меньше возможностей (нет throttling, нет кастомных доменов без CloudFront).
Практический пример: верификация Apple IAP
Валидация покупок App Store нельзя делать на клиенте — чек легко подделать. Lambda:
// handler.mjs (Node.js 20.x)
import { AppleVerifyReceiptResponse } from './types.js';
export const handler = async (event) => {
const { receiptData, userId } = JSON.parse(event.body);
const verifyUrl = process.env.APPLE_ENV === 'production'
? 'https://buy.itunes.apple.com/verifyReceipt'
: 'https://sandbox.itunes.apple.com/verifyReceipt';
const response = await fetch(verifyUrl, {
method: 'POST',
body: JSON.stringify({
'receipt-data': receiptData,
password: process.env.APPLE_SHARED_SECRET,
'exclude-old-transactions': true,
}),
});
const data = await response.json();
if (data.status !== 0) {
return { statusCode: 400, body: JSON.stringify({ error: 'Invalid receipt' }) };
}
// Сохраняем purchase в DynamoDB
await savePurchase(userId, data.latest_receipt_info);
return { statusCode: 200, body: JSON.stringify({ success: true }) };
};
Секреты (APPLE_SHARED_SECRET) — в AWS Secrets Manager или Parameter Store, не в переменных окружения напрямую в консоли (они видны в логах при неосторожности).
Cold Start — главная проблема Lambda для мобильных клиентов
Cold start на Node.js 20.x с SnapStart — 200–400мс. Для Java без SnapStart — 1–3 секунды. Это критично для API, которые пользователь ждёт.
Митигации:
- Provisioned Concurrency — Lambda всегда разогрета, но платите за простой
- AWS Lambda SnapStart (Java) — снапшот инициализированной среды
-
Минимальные зависимости —
aws-sdk v3с модульными импортами вместо всего SDK - Node.js / Python для latency-чувствительных функций вместо Java/Kotlin
// Плохо: импортируем весь SDK
import AWS from 'aws-sdk';
// Хорошо: только нужный клиент
import { DynamoDBClient, PutItemCommand } from '@aws-sdk/client-dynamodb';
Разница в размере бандла: 30MB vs 150KB. Разница в cold start: ощутимая.
Авторизация через Cognito
// React Native: добавляем токен к запросам
const session = await fetchAuthSession();
const token = session.tokens?.idToken?.toString();
const response = await fetch('https://api.myapp.com/purchase/verify', {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ receiptData }),
});
API Gateway с Cognito JWT Authorizer автоматически верифицирует токен. Lambda получает event.requestContext.authorizer.jwt.claims с userId — не нужно валидировать токен в коде функции.
IaC: Lambda через CDK или Terraform
Кнопочки в AWS Console — не для продакшена. Lambda описывается кодом:
// AWS CDK (TypeScript)
const verifyPurchaseFn = new NodejsFunction(this, 'VerifyPurchase', {
entry: 'src/functions/verify-purchase/handler.ts',
runtime: Runtime.NODEJS_20_X,
timeout: Duration.seconds(10),
memorySize: 256,
environment: {
APPLE_ENV: 'production',
},
bundling: { minify: true, sourceMap: true },
});
const api = new RestApi(this, 'MobileApi');
api.root.addResource('purchase').addResource('verify')
.addMethod('POST', new LambdaIntegration(verifyPurchaseFn), {
authorizer: cognitoAuthorizer,
});
CDK собирает и бандлит TypeScript-функции через esbuild, деплоит через CloudFormation.
Что входит в интеграцию
Настройка Lambda функций под конкретную серверную логику. API Gateway или Function URL с авторизацией. IaC через CDK или Terraform. Настройка окружений (dev/staging/prod). Мониторинг через CloudWatch + X-Ray трейсинг. Интеграция с мобильным клиентом (SDK или fetch).
Сроки
Одна Lambda-функция с API Gateway: 1–2 дня. Полный serverless-бэкенд (5–10 функций + DynamoDB + Auth): 1–3 недели. Стоимость — по объёму.







