Інтеграція AWS Lambda для серверної логіки мобільного додатку
AWS Lambda — serverless-функції, які виконуються за запитом та не вимагають управління серверами. Для мобільного додатку Lambda закриває серверну логіку, яку неможливо вивести на клієнт: верифікація платежів, генерація підписаних URL для S3, push-сповіщення, обробка вебхуків від 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 — не для production. 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 тижні. Вартість — по обсягу.







