Создание бессерверного приложения для iOS с использованием реляционных данных на AWS

Зачем использовать Aurora Serverless?

Если вы только начинаете или предпочитаете использовать базы данных NoSQL, в AWS Amplify есть руководства и несколько примеров приложений, использующих их базу данных NoSQL DynamoDB.

Однако в зависимости от того, с кем вы работаете, вам может потребоваться использовать реляционную базу данных. Старый подход заключался в создании сервера с использованием предпочитаемого вами внутреннего языка, который бы подключался к реляционной базе данных с помощью AWS RDS, но с Amplify вы можете сократить время, используя Aurora Serverless и Amplify, исключив работу по созданию и обслуживанию сервер.

Создание экземпляра Amazon Aurora

Если у вас нет учетной записи AWS, вам нужно будет ее создать. Сначала войдите в Консоль RDS. На панели управления выберите Создать базу данных.

Здесь по умолчанию должна быть выбрана Amazon Aurora:

В разделе «Возможности базы данных» выберите «Бессерверный»:

В разделе Параметры и идентификатор кластера БД вы можете изменить идентификатор кластера БД по умолчанию, если хотите. Вам также следует позволить RDS автоматически сгенерировать пароль или ввести пароль самостоятельно.

В настройках емкости вы можете установить для максимальной емкости Aurora значение 1, чтобы случайно не потратить слишком много денег на этот проект. По той же причине в разделе «Дополнительная конфигурация масштабирования» выберите «Приостановить вычислительную мощность после нескольких минут бездействия».

Теперь вы можете нажать «Создать базу данных».

Разрешение специальных символов в базе данных

Если вы планируете использовать в своей базе данных специальные символы, такие как имена с китайскими символами, вы можете изменить набор символов по умолчанию для базы данных. Если на данный момент вас не интересуют специальные символы, вы можете пропустить это и перейти к следующему разделу «Создание таблиц».

Для этого нажмите «Группы параметров» слева. Здесь нажмите «Создать группу параметров». Выберите aurora5.6 в разделе «Семейство групп параметров» и «Группа параметров кластера БД» в разделе «Тип», дайте имя и описание и нажмите «Создать».

Теперь щелкните по вновь созданной группе параметров. В строке поиска введите character_set_server, выберите его и нажмите «Изменить параметры». В значениях выберите utf8mb4, а затем нажмите «Сохранить изменения».

Теперь, пожалуйста, щелкните по вновь созданной базе данных в списке и нажмите «Изменить».

Там в разделе «Сеть и безопасность» нажмите «API данных», а в разделе «Дополнительная конфигурация и группа параметров кластера БД» выберите группу, которую вы только что создали.

Нажмите «Продолжить». Затем в разделе «Планирование изменений» выберите «Применить немедленно» и нажмите «Изменить кластер».

Теперь, когда мы создали базу данных, мы можем приступить к созданию таблиц, которые собираемся использовать.

Создание таблиц

Для этого проекта давайте создадим простое приложение, в котором пользователи могут создавать свои профили, а затем создавать блоги, которые, в свою очередь, могут содержать несколько сообщений.

Теперь нам нужно подключить базу данных для создания таблиц. На панели управления базой данных нажмите Actions, а затем выберите Query. Здесь вас попросят ввести пароль, который вы ввели ранее, чтобы подключиться к базе данных.

После подключения вы должны увидеть редактор запросов ниже:

Чтобы создать базу данных для нашего проекта, выполните следующую команду:

CREATE DATABASE BLOGDB;

После этого нажмите «Изменить базу данных». В разделе «Введите имя базы данных или схемы» введите BLOGDB или имя, которое вы только что ввели, и нажмите «Подключиться к базе данных».

Теперь, чтобы создать таблицы, запустите следующее:

Обратите внимание, что поля createdAt были созданы как varchar, поэтому мы можем использовать временные метки Unix.

Теперь, чтобы проверить, все ли работает, вы можете создать новый User в редакторе запросов:

INSERT INTO User (userId, name, email, picture, createdAt) VALUES ("fake_uuid_specialchars","名字😄", "[email protected]", "picture.png", "1588269238");

Или, если вы не включили специальные символы, вы можете создать User с именем, состоящим из простых символов:

INSERT INTO User (userId, name, email, picture, createdAt) VALUES ("fake_uuid_john","John Doe", "[email protected]", "picture.png", "1588269239");

Чтобы увидеть список пользователей, выполните следующую команду:

Select * from User;

Вы должны увидеть вновь созданного пользователя, использующего специальные символы:

Теперь, когда мы убедились, что наша база данных работает, мы можем приступить к настройке нашего проекта Xcode.

Настройка вашего проекта

Перед началом работы вам необходимо выполнить руководство по началу работы, если вы не знакомы с интерфейсом командной строки AWS Amplify. Шаги в основном заключаются в регистрации учетной записи AWS, ее установке и настройке интерфейса командной строки.

Начнем с перехода в Xcode и создания нового проекта. Выберите «Приложение для одного просмотра». В поле "Язык" выберите Swift, а в пользовательском интерфейсе выберите SwiftUI. Дайте ему название продукта и название организации, которые вы хотите.

После настройки Amplify на вашем компьютере и создания проекта Xcode нам нужно сгенерировать GraphQL API для базы данных Aurora, которую мы создали ранее. Перейдите в папку проекта Xcode на терминале и выполните следующую команду, чтобы добавить API:

$ amplify add api

Выберите GraphQL и оставьте параметры по умолчанию. Когда вас спросят, есть ли у вас аннотированная схема GraphQL, введите No и введите No для управляемого создания схемы. Терминал напечатает путь к сгенерированному schema.graphql. Также будет создан пользовательский тип MyType. Не удаляйте его сейчас, потому что, если файл .graphql пуст, у вас могут возникнуть проблемы на следующем шаге.

После добавления API мы можем добавить базу данных Aurora в качестве источника данных:

$ amplify api add-graphql-datasource

Выберите регион, в котором находится ваша база данных, а затем выберите только что созданную базу данных (BLOGDB или любое другое имя, которое вы ей дали).

Теперь вы можете удалить автоматически созданный тип MyType в файле .graphql и сохранить файл. После этого вы можете протолкнуть изменения:

$ amplify push

Вас спросят, хотите ли вы сгенерировать код для нового API. Выберите «Да» и оставьте параметры по умолчанию.

Нам нужно добавить CocoaPods, поэтому в папке нашего проекта выполните следующую команду:

$ pod init

Добавьте в файл следующие модули:

После запуска pod install на терминале мы закончили настройку, теперь мы можем открыть Xcode.

Скопируйте файлы конфигурации AWS в Xcode

Прежде чем мы сможем использовать установленные модули, нам нужно скопировать некоторые файлы в Xcode: awsconfiguration.json, amplifyconfiguration.json и API.swift. Вы можете поместить их в корневую папку или создать папку, чтобы лучше организовать свой проект.

Нам может потребоваться обновить конфигурации Amplify, поэтому, чтобы сохранить только ссылку на исходные файлы, снимите флажок «Копировать элементы при необходимости» при перетаскивании файлов в проект.

Ваш проект должен выглядеть так:

Инициализация мобильного клиента AWS

Файл AppDelegate должен выглядеть так:

Я расскажу о некоторых деталях. Во-первых, нам нужно импортировать AWSAppSync. Затем мы объявляем переменную AWSAppSyncClient. Мы также создадим initializeAWSAppSync функцию для инициализации AWSAppSyncClient.

Обратите внимание на строки, в которых мы вызываем AWSAppSyncCacheConfiguration - нам нужно сделать это, чтобы сохранять операции с базой данных, когда у нас нет подключения к Интернету, чтобы они выполнялись всякий раз, когда подключение восстанавливается.

И, наконец, не забудьте позвонить initializeAWSAppSync внутри didFinishLaunchingWithOptions.

Создание наших моделей

Когда был сгенерирован код API, Amplify также сгенерировал различные структуры для представления наших пользователей, блогов и сообщений.

Существуют разные структуры, которые представляют пользователя в каждой операции: ListUser, CreateUser, UpdateUser и DeleteUser. То же самое происходит с блогами и сообщениями. Чтобы обеспечить единообразие и использовать только одну модель во всем приложении, мы создадим нашу собственную User модель, которую при необходимости преобразуем в ListUser или CreateUser.

Создайте файл с именем ThisUser.swift и добавьте следующее:

Нам нужно сделать то же самое для блогов, поэтому давайте создадим файл с именем ThisBlog.swift:

И, наконец, для сообщений создадим файл с именем ThisPosts.swift:

Создание нашего класса хранилища данных

Для операций с нашей базой данных мы создадим класс, который будет содержать массивы для наших пользователей, блогов и сообщений и наследовать от ObservableObject, чтобы мы могли публиковать изменения в этих массивах. Мы также создадим методы для извлечения пользователей, блогов и сообщений из базы данных, а также для создания новых.

Создайте новый файл с именем AWSAppSyncDataStore.swift и добавьте следующее:

Передача хранилища данных как переменной среды

Чтобы использовать наш DataStore, нам нужно передать его нашему ContentView. В SceneDelegate.swift добавьте следующую строку:

let dataStore = AWSAppSyncDataStore()

Если вы хотите протестировать новый DataStore, вы можете добавить следующие строки:

dataStore.addUser(create: thisUser(name: "Tony Stark", email: "[email protected]", picture: "no_picture", createdAt: "1588606785", lastLoginAt: "1588606785"))
        
print("datastore.users ", dataStore.users)

После тестирования удалите эти строки и измените строку, создающую наш ContentView, чтобы мы передали DataStore как объект среды.

let contentView = ContentView().environmentObject(dataStore)

Список пользователей

Теперь давайте напишем код, чтобы привлечь пользователей и отобразить их. Прежде всего, нам нужно добавить EnvironmentObject в наш ContentView вверху.

После добавления EnvironmentObject давайте создадим List и ForEach с пользователями хранилища данных в нашем теле.

Если мы запустим приложение, мы должны увидеть список с пользователями, которых мы создали на консоли AWS или в рамках нашего предыдущего теста в SceneDelegate. Список должен выглядеть примерно так:

Теперь перейдем к следующему шагу - созданию нового пользователя.

Создание пользователей

Чтобы создать новый User, мы будем использовать Form внутри Sheet. Сначала нам нужно создать новый файл CreateUserView.swift и добавить следующее:

Как видите, мы создали Form с тремя TextField для ввода свойств User: одно для name, одно для email и одно для pictureURL.

Чтобы отобразить это Form, нам нужно добавить следующее State внутри ContentView:

@State var presentingSheet = false

Также в ContentView, в NavigationBarItem, после оператора print("Create User"), нам нужно установить presentingSheet на true:

self.presentingSheet = true

И нам нужно прикрепить sheet к List в ContentView:

.sheet(isPresented: $presentingSheet, content: {
     CreateUserView()
 })

Если мы снова запустим наше приложение, при нажатии кнопки + на панели навигации мы должны увидеть нашу недавно созданную форму:

Мы должны заполнить как минимум name и email, чтобы активировать кнопку сохранения. После этого, если мы нажмем сохранить, лист должен исчезнуть, и мы должны увидеть вновь созданного пользователя в списке:

Если вы хотите перепроверить, вы можете перейти в консоль AWS и выполнить Select запрос к своей базе данных:

Select * from User;

Пользователь, которого вы только что добавили с помощью приложения SwiftUI, должен быть там.

Заключение

Если вы хотите взглянуть на проект целиком, загляните в репозиторий GitHub.

Если вы хотите добавить аутентификацию в свое приложение SwiftUI с помощью AWS Amplify, вы можете прочитать мои руководства о том, как Войти через Google, Facebook, Apple или Электронная почта.