Команды часто тратят месяцы на разработку собственного GraphQL API с WebSocket-подписками и офлайн-синхронизацией. Потом выясняется, что это уже есть в AWS AppSync — managed сервисе, который экономит до 40% времени на интеграцию. AppSync берёт на себя хостинг GraphQL API, подключается к источникам данных: DynamoDB, Lambda, RDS, Elasticsearch. Сервис поддерживает WebSocket для подписок и офлайн-синхронизацию с конфликт-резолюцией. Для мобильных приложений это одна точка входа вместо нескольких REST эндпоинтов, real-time из коробки и встроенная офлайн работа через Amplify DataStore. Наши инженеры с 10-летним опытом в iOS и Android настраивали AppSync в проектах с аудиторией 1 млн+ пользователей, выполнили более 50 проектов. Гарантируем стабильную работу под нагрузкой.
Архитектура: AppSync + Amplify vs голый Amplify SDK
AppSync работает поверх GraphQL. Amplify — AWS SDK для мобильных платформ, который включает клиент для AppSync. Важно понять разницу:
- Amplify API (GraphQL) — тонкая обёртка над AppSync, отправляет запросы напрямую, без локального кеша.
- Amplify DataStore — полноценный офлайн-first слой: синхронизирует данные между локальной базой (SQLite) и AppSync, разрешает конфликты.
Для большинства мобильных приложений DataStore — правильный выбор: приложение работает без интернета, синхронизируется при появлении сети. Для простых сценариев (запрос-ответ без офлайн) — Amplify API проще.
Настройка: amplify.json и codegen
AppSync схема определяется в schema.graphql. Amplify CLI генерирует клиентский код:
amplify init
amplify add api # выбираем GraphQL, AppSync
amplify codegen add --generate-code-settings
amplify push
После amplify push в проект добавляются:
-
amplifyconfiguration.json— конфигурация endpoint, регион, auth mode. - Сгенерированные модели (
ModelPost.swift/ModelPost.kt). - Сгенерированные queries/mutations/subscriptions.
Codegen — один из главных плюсов AppSync: не нужно вручную писать GraphQL запросы и маппинг.
Почему AppSync лучше ручного GraphQL сервера?
Сравним AppSync с самописным GraphQL (например, Apollo Server + AWS Lambda + DynamoDB + WebSocket):
| Критерий | AppSync | Самописный |
|---|---|---|
| Настройка subscriptions | Готовый WebSocket | Нужно реализовать через API Gateway WebSocket |
| Офлайн-синхронизация | DataStore + конфликт-резолюция | Требуется писать свой конфликт-механизм |
| Масштабирование | Автоматическое | Ручная настройка Lambda + DynamoDB auto scaling |
| Обслуживание | 0 — managed сервис | Обновление библиотек, мониторинг Infra |
AppSync в 2–3 раза сокращает время разработки аналогичного функционала. Экономия бюджета на разработку достигает 40%, а операционные расходы снижаются на 30%.
Интеграция на Android и iOS
Android: Amplify SDK
// build.gradle
implementation 'com.amplifyframework:aws-api:2.x.x'
implementation 'com.amplifyframework:aws-datastore:2.x.x'
// Application.onCreate()
try {
Amplify.addPlugin(AWSApiPlugin())
Amplify.addPlugin(AWSDataStorePlugin())
Amplify.configure(applicationContext)
} catch (e: AmplifyException) {
Log.e("App", "Init failed", e)
}
DataStore операции:
// Создание
val post = Post.builder()
.title("Hello")
.content("World")
.build()
Amplify.DataStore.save(post,
{ Log.i("DataStore", "Saved") },
{ Log.e("DataStore", "Error", it) }
)
// Подписка на изменения (real-time)
Amplify.DataStore.observe(Post::class.java,
{ Log.i("DataStore", "Observation started") },
{ change ->
val updatedPost = change.item()
},
{ Log.e("DataStore", "Error", it) },
{ Log.i("DataStore", "Complete") }
)
Coroutines extensions: amplify-kotlin пакет предоставляет Amplify.DataStore.save(post) как suspend функцию — гораздо чище callback-ада.
iOS: Amplify Swift
// Package.swift или Podfile
.package(url: "https://github.com/aws-amplify/amplify-swift", from: "2.x.x")
// AppDelegate / App init
try Amplify.add(plugin: AWSAPIPlugin())
try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: AmplifyModels()))
try Amplify.configure()
// DataStore с async/await
func savePost() async throws {
let post = Post(title: "Hello", content: "World")
try await Amplify.DataStore.save(post)
}
// Подписка через AsyncSequence
func observePosts() async {
let subscription = Amplify.DataStore.observe(Post.self)
do {
for try await change in subscription {
print("Changed: \(change.element.title)")
}
} catch {
print("Observation failed: \(error)")
}
}
Аутентификация и разрешение конфликтов
Аутентификация: несколько режимов
AppSync поддерживает несколько auth mode одновременно:
| Режим | Когда использовать |
|---|---|
| API Key | Публичный контент, прототипы |
| Amazon Cognito User Pools | Авторизованные пользователи |
| AWS IAM | Machine-to-machine, AWS Lambda |
| OpenID Connect | Внешние identity provider (Auth0, Okta) |
Типичная конфигурация: публичные данные через API Key, приватные через Cognito. AppSync resolver'ы используют @auth директиву в схеме:
type Post @model @auth(rules: [
{ allow: public, provider: apiKey, operations: [read] },
{ allow: owner, operations: [create, update, delete] }
]) {
id: ID!
title: String!
content: String!
owner: String
}
@auth(allow: owner) автоматически добавляет owner фильтр — пользователь видит только свои данные.
Конфликт-резолюция в DataStore
Отметим: когда два устройства офлайн изменяют одну запись, при синхронизации возникает конфликт. DataStore поддерживает три стратегии:
-
Auto Merge (по умолчанию для
@modelбез версионирования) — последняя запись побеждает. - Optimistic Concurrency — версионирование через
_versionполе, при конфликте AppSync вызывает Lambda для разрешения. - Custom Lambda Resolver — полный контроль над логикой.
Для большинства задач Auto Merge достаточен. Для финансовых данных или чатов — Custom Lambda с аудит-логом.
Типичные проблемы и их решение
Schema drift. Изменение схемы в AppSync Console без перегенерации клиентских моделей приводит к рассинхронизации. Решение: все изменения схемы — только через amplify push, никогда вручную через консоль в production.
DataStore не синхронизируется. Часто причина — неверный @auth в схеме: DataStore не может сделать sync запрос без прав на list операцию. Проверьте права доступа.
Subscriptions разрываются. AppSync WebSocket соединение разрывается через 2 минуты неактивности по умолчанию. Amplify клиент переподключается автоматически, но подписки нужно создавать заново через Amplify.DataStore.observe — они не восстанавливаются сами.
Устранение проблем синхронизации DataStore
Проверьте @auth — он должен разрешать list операцию для аутентифицированных пользователей. Убедитесь, что amplify push выполнен с актуальной схемой. Любые ручные изменения в консоли AppSync приведут к рассинхронизации. Если проблема остаётся, перегенерируйте клиентские модели через amplify codegen.
Процесс работы
- Анализ требований — определяем схему данных, auth mode, офлайн-сценарии.
- Проектирование GraphQL схемы — используем
@model,@auth, связи, настраиваем конфликт-резолюцию. - Интеграция Amplify SDK — добавляем плагины на Android/iOS, настраиваем DataStore или API.
- Тестирование синхронизации — проверяем офлайн-операции, конфликты, производительность.
- Деплой и мониторинг — публикуем через AppSync Console или CDK, настраиваем CloudWatch.
Дополнительно: проверка перед релизом
- Убедитесь, что
amplify pushвыполнен со схемы, синхронизированной с кодом. - Проверьте, что разрешения @auth не блокируют sync queries.
- Протестируйте reconnection subscriptions в условиях плохого интернета.
Что входит в работу
Проектируем GraphQL схему с @model, @auth и связями. Настраиваем AppSync через Amplify CLI или CDK. Интегрируем Amplify SDK на Android/iOS с нужным auth mode. Настраиваем DataStore или API в зависимости от требований к офлайн-работе. Тестируем конфликт-резолюцию. Сроки — от 2 до 4 недель. Свяжитесь с нами для обсуждения вашего проекта. Получите консультацию по оптимизации API и снижению затрат на инфраструктуру.
GraphQL — спецификация, на которой основан AppSync.







