Интеграция AWS AppSync в мобильное приложение
AWS AppSync — managed GraphQL сервис от Amazon. Он берёт на себя хостинг GraphQL API, подключение к источникам данных (DynamoDB, Lambda, RDS, Elasticsearch), WebSocket-подключения для subscriptions и оффлайн-синхронизацию через конфликт-резолюцию. Для мобильных приложений это значит: одна точка входа вместо нескольких REST эндпоинтов, real-time из коробки и встроенная оффлайн работа через Amplify DataStore.
Архитектура: 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 запросы и маппинг.
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 — они не восстанавливаются сами.
Что входит в работу
Проектируем GraphQL схему с @model, @auth и связями, настраиваем AppSync через Amplify CLI или CDK, интегрируем Amplify SDK на Android/iOS с нужным auth mode, настраиваем DataStore или API в зависимости от требований к оффлайн-работе, тестируем конфликт-резолюцию.
Срок: 2–4 недели в зависимости от сложности схемы данных и требований к оффлайн-функциональности.







