Интеграция AWS Amplify в мобильное приложение
AWS Amplify — набор библиотек и CLI для подключения мобильного приложения к облачным сервисам AWS: аутентификация через Cognito, API через AppSync (GraphQL) или REST Gateway, хранилище через S3, push-уведомления через Pinpoint. Amplify Gen 2 (2024) перешёл на TypeScript-based конфигурацию вместо JSON, что упростило типизацию и CI/CD-интеграцию.
Аутентификация через Cognito + Amplify Auth
Самая частая точка входа — Auth. Настройка занимает 20 минут, но скрывает нюансы.
React Native:
import { Amplify } from 'aws-amplify';
import { signIn, signUp, confirmSignUp, fetchAuthSession } from 'aws-amplify/auth';
import outputs from './amplify_outputs.json';
Amplify.configure(outputs);
// Вход
const { isSignedIn } = await signIn({ username: email, password });
// JWT токен для API-запросов
const session = await fetchAuthSession();
const token = session.tokens?.idToken?.toString();
Amplify UI Components (@aws-amplify/ui-react-native) даёт готовый Authenticator-компонент — LoginForm + SignUp + MFA за одну строку. Выглядит по-дефолтному, но кастомизируется через components prop.
Flutter:
await Amplify.addPlugins([AmplifyAuthCognito()]);
await Amplify.configure(amplifyconfig);
final result = await Amplify.Auth.signIn(
username: email,
password: password,
);
AppSync GraphQL: где легко стать не там
AppSync — управляемый GraphQL с подпиской на изменения через WebSocket. Amplify генерирует типизированный клиент из схемы:
import { generateClient } from 'aws-amplify/data';
import type { Schema } from './amplify/data/resource';
const client = generateClient<Schema>();
// Запрос с реальным временем
const sub = client.models.Post.observeQuery().subscribe({
next: ({ items }) => setPosts(items),
});
Проблема N+1 в AppSync. Если resolver не настроен с batch resolver или DynamoDB Single Table Design, каждый элемент списка делает отдельный запрос к базе. На 50 постах — 51 запрос. Решение: BatchInvoke в AppSync resolver или переход на Pipeline resolvers.
Offline-режим. Amplify DataStore синхронизирует данные с AppSync и хранит локально в SQLite. При потере соединения мутации попадают в очередь и отправляются при восстановлении. Настройка требует @model директив в GraphQL схеме и DataStore.configure(). Конфликты разрешаются через ConflictResolutionStrategy (Auto Merge, Optimistic Concurrency, Custom Lambda).
S3: загрузка файлов
import { uploadData, getUrl } from 'aws-amplify/storage';
const result = await uploadData({
key: `avatars/${userId}.jpg`,
data: fileBlob,
options: {
accessLevel: 'protected',
contentType: 'image/jpeg',
onProgress: ({ loaded, total }) => setProgress(loaded / total),
},
}).result;
const { url } = await getUrl({ key: result.key, options: { accessLevel: 'protected' } });
accessLevel: 'protected' — файл доступен только владельцу (через Cognito Identity ID в пути). 'public' — всем. 'private' — только владельцу без публичного URL. Неправильный accessLevel — частая причина 403 при попытке получить чужой файл.
Типичные грабли при интеграции
Размер бандла React Native. aws-amplify с полной конфигурацией добавляет ~500KB к JS-бандлу. Используем модульные импорты: import { signIn } from 'aws-amplify/auth' вместо import Amplify from 'aws-amplify'.
CORS при REST API. Amplify CLI создаёт API Gateway с CORS, но если добавлять ресурсы вручную — CORS нужно настраивать отдельно для каждого метода + preflight OPTIONS.
Refresh tokens на iOS. Amplify хранит токены в Keychain. При обновлении через TestFlight без удаления приложения старые токены остаются. signOut({ global: true }) инвалидирует все сессии на бэкенде.
Что входит в интеграцию
Настройка Amplify CLI / Gen 2 конфигурации. Подключение Auth (Cognito) с нужными флоу (email/Google/Apple Sign In). Настройка API (AppSync или REST). Offline-режим через DataStore (если требуется). Storage для файлов. Настройка Amplify в CI/CD.
Сроки
Базовая интеграция Auth + API: 3–4 дня. Полная интеграция с DataStore + Storage + Push: 1–2 недели. Стоимость — после анализа требований и выбора сервисов.







