Інтеграція 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 підтримує кілька режимів аутентифікації одночасно:
| Режим | Коли використовувати |
|---|---|
| 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 з audit-логом.
Типові проблеми при інтеграції
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 тижні залежно від складності схеми даних та вимог до оффлайн-функціональності.







