Бессерверные функции — отличное решение, особенно когда они используются в качестве бэкенда для мобильных приложений. Некоторое время назад я написал статью о том, как отправить SMS-сообщение с Android, и всегда хотел изменить бэкенд этого приложения, чтобы он не только использовал Kotlin, но и был бессерверной функцией.
Наличие бэкенда важно, потому что мы используем API, и хотя Twilio — это REST API, к которому можно сделать HTTP-запрос напрямую, вам пришлось бы хранить учетные данные Twilio внутри приложения. Это небезопасно, так как злоумышленник может легко извлечь ваши учетные данные из приложения.
Давайте посмотрим, как изменить наш бэкенд на бессерверную функцию, размещенную на IBM Cloud Functions.
— Я буду использовать IntelliJ IDEA с плагином Gradle для кода, но вы можете использовать любую предпочитаемую IDE, если она хорошо работает с Gradle.
— Учетная запись Twilio и номер телефона Twilio — зарегистрируйтесь бесплатно!
— Учетная запись IBM Bluemix — зарегистрируйтесь бесплатно. Также убедитесь, что вы следуете их инструкциям по установке и настройке CLI.
Если вы хотите сразу перейти к коду, клонируйте этот репозиторий и просто следуйте процедуре развертывания.
Откройте IntelliJ IDEA и выберите Файл → Новый.. → Проект → Gradle → Kotlin (Java). Нажмите «Далее» и укажите `Group ID` и `Artifact ID`. Group ID обычно представляет собой домен в обратном порядке, например, `com.twilio`, но вы можете использовать любое значение. Artifact ID — это название проекта, назовем его `ServerlessSMS`.
На следующем экране убедитесь, что вы отметили опцию «использовать автоимпорт», снова нажмите «Далее» и выберите место для вашего проекта. Я сохранил свой в `~/Projects/Kotlin/ServerlessSMS` и нажал «Готово».
Когда проект завершит первую сборку, откройте `build.gradle` и добавьте следующие дополнительные зависимости:
Далее, под задачей `dependencies` создайте новую задачу с именем `jar` следующим образом:
Задача выше упаковывает весь наш код в толстый jar-файл после компиляции, который содержит все наши зависимости. Таким образом, мы можем удобно загрузить этот jar-файл в IBM Cloud, и он позаботится обо всем развертывании за нас.
В директории `src/main/kotlin` создайте новый Kotlin-файл с именем `Main.kt` и вставьте в него следующее:
Код выше принимает аргумент и отвечает приветствием в формате JSON. Мы будем использовать это, чтобы проверить, что наша настройка работает правильно, прежде чем изменить его для использования API Twilio.
Откройте новое окно терминала и выполните команду `gradle jar`. Если вы только что установили Gradle, посмотрите эту ссылку, чтобы узнать, как добавить его в PATH. Это вызовет задачу создания толстого jar-файла, которую мы создали ранее, и упакует наш код для развертывания.
Для развертывания выполните следующую команду в терминале, и вы должны получить подтверждение, что действие было создано:
Команда выше создаст веб-функцию с именем `serverlessSMS`, которую она загрузит из папки `build/libs/` внутри вашего проекта. Мы также используем наш файл `Main` в качестве точки входа для этой функции.
После завершения вы можете вызвать эту функцию, выполнив следующую команду из терминала:
И вы должны получить ответ в формате JSON, который выглядит следующим образом:
Мы уже добавили зависимость от Twilio SDK в наш проект ранее, поэтому можем сразу начать кодирование с использованием библиотеки. Откройте файл `Main.kt` снова и измените его так, чтобы вместо возврата приветственного сообщения он возвращал Message SID для SMS-сообщения, которое мы только что отправили.
Код выше принимает несколько дополнительных аргументов, чтобы мы могли передать `to`, `from` и текст сообщения `body` в нашу функцию. Затем он инициализирует Twilio с `Account SID` и `Authentication Token`, которые вы можете получить здесь.
Далее он создает новое сообщение и по завершении возвращает JSON-пакет с `Message SID`.
Вернитесь в терминал и выполните следующие две команды, чтобы повторно создать jar-файл и загрузить его:
Теперь вы можете вызвать эту функцию через тот же терминал следующим образом:
Поскольку я сказал, что мы будем использовать эту функцию из нашего приложения, а пока вызывали ее только из CLI, перейдите в IBM Cloud Management Console и щелкните на только что созданную функцию.
Скопируйте URL веб-действия и используйте его в своем приложении вместо URL, который мы использовали ранее. Здесь вы можете найти пример Android-приложения, использующего бессерверную функцию.
Теперь, когда наша функция развернута, мы можем расслабиться и быть уверены, что нам не придется беспокоиться о ее масштабировании в ближайшее время. Без значительных изменений в нашем приложении мы смогли перейти от полноценного работающего приложения к бессерверной функции, которая выполняет те же требования, но масштабируется и, самое главное, безопасна.
Вы можете иметь несколько функций под одним пространством имен, чтобы упростить развертывание и обслуживание, и большая часть этого БЕСПЛАТНА.
Мне было бы интересно узнать, как вы создаете бессерверные функции для удаления логики из ваших приложений. Свяжитесь со мной в Twitter @marcos_placona или отправьте мне письмо на marcos@twilio.com, чтобы рассказать об этом подробнее.