Команди часто витрачають місяці на розробку власного GraphQL API з WebSocket-підписками та офлайн-синхронізацією. Потім з'ясовується, що це вже є в AWS AppSync — managed сервісі, який економить до 40% часу на інтеграцію. AppSync бере на себе хостинг GraphQL API, підключається до джерел даних: DynamoDB, Lambda, RDS, Elasticsearch. Сервіс підтримує WebSocket для підписок і офлайн-синхронізацію з конфлікт-резолюцією. Для мобільних додатків це одна точка входу замість кількох REST ендпоінтів, real-time з коробки та вбудована офлайн робота через Amplify DataStore. Наприклад, у проекті електронної комерції з аудиторією 2 млн користувачів ми налаштували AppSync з DataStore, що дозволило скоротити час завантаження каталогу на 35% та забезпечити повну офлайн-доступність товарів. Наші інженери з 10-річним досвідом у iOS та Android налаштовували AppSync у проектах з аудиторією 1 млн+ користувачів, виконали понад 50 проектів. Гарантуємо стабільну роботу під навантаженням. Завдяки AppSync ми скорочуємо час виходу на ринок на 50% та зменшуємо витрати на інфраструктуру на 30%.
Інтеграція AWS AppSync: архітектура та компоненти
AppSync працює поверх GraphQL. Amplify — AWS SDK для мобільних платформ, який включає клієнт для AppSync. Важливо зрозуміти різницю:
- Amplify API (GraphQL) — тонка обгортка над AppSync, відправляє запити напряму, без локального кешу.
- Amplify DataStore — повноцінний офлайн-first шар: синхронізує дані між локальною базою (SQLite) та AppSync, вирішує конфлікти.
Для більшості мобільних додатків DataStore — правильний вибір: додаток працює без інтернету, синхронізується при появі мережі. Для простих сценаріїв (запит-відповідь без офлайн) — Amplify API простіше.
Як налаштувати AppSync за допомогою Amplify CLI?
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 краще за самописний GraphQL у 3 рази за швидкістю розробки аналогічного функціоналу. Економія бюджету на розробку сягає 40%, а операційні витрати знижуються на 30%.
Інтеграція AppSync на Android та iOS
AppSync 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-ад.
AppSync 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.







