Развертывание бессерверного бэкенда для Slack с помощью инфраструктуры как кода (IaaC)
В одной из моих предыдущих статей в блоге рассказывалось о том, как создать бессерверный бэкенд для Slack с помощью URL-адреса лямбда-функции в качестве веб-крючка. Поскольку я хотел сосредоточиться на самом приложении, часть настройки инфраструктуры была упрощена – с помощью AWS CLI функция была упакована в zip-файл, настроена и, наконец, был создан URL функции вместе с необходимыми разрешениями.
В этом блоге вы закончите развертыванием того же решения, но на этот раз с использованием IaaC (Infrastructure-as-code) с AWS Cloud Development Kit (CDK), который является основой для определения облачной инфраструктуры в коде и предоставления ее через AWS CloudFormation. Вы можете выбрать один из поддерживаемых языков программирования (на момент написания статьи – TypeScript, JavaScript, Python, Java, C#/.Net и Go (в предварительной версии для разработчиков)) для определения компонентов инфраструктуры в коде, как и для любого другого приложения!
Вы узнаете, как использовать библиотеку Go CDK для работы с компонентами инфраструктуры:
- Определить лямбда-функцию,
- Добавить URL-адрес функции Lambda, и,
- Развернуть функцию как контейнер Docker (не zip-файл).
К концу этой статьи у вас должна быть такая же настройка, как описана в предыдущем блоге.
Код, как всегда, доступен на GitHub!
Предварительные условия
- Создайте учетную запись AWS (если у вас ее еще нет) и войдите в нее. Пользователь IAM, которого вы используете, должен иметь достаточно прав для выполнения необходимых вызовов служб AWS и управления ресурсами AWS.
- Установите AWS CDK
- Установите Docker
- Установите Go
- Установите Git
- Создайте рабочее пространство Slack, если у вас его нет.
- Создайте аккаунт GIHPY (это бесплатно!) и создайте приложение. Каждое созданное вами приложение будет иметь свой собственный API-ключ.
CDK для IaaC – краткое описание
Код CDK довольно лаконичен, но он делает свою работу! Давайте быстро пройдемся по нему.
Сначала мы определим функцию и формат ее упаковки (в виде контейнера Docker):
// environment variable for Lambda function
lambdaEnvVars := &map[string]*string{slackSecretEnvVar: jsii.String(slackSecret), giphyAPIKeyEnvVar: jsii.String(giphyAPIKey)}
function := awslambda.NewDockerImageFunction(stack, jsii.String("awsome-func-docker"), &awslambda.DockerImageFunctionProps{FunctionName: jsii.String(functionName), Environment: lambdaEnvVars, Code: awslambda.DockerImageCode_FromImageAsset(jsii.String("../function"), nil)})
Обратите внимание, как использована функция NewDockerImageFunction (традиционно используется NewFunction и ссылка на zip-файл для развертывания). В данном случае мы указываем на папку, в которой находится код нашей функции (используя DockerImageCode_FromImageAsset).
Чтобы упаковать функцию как образ Docker, я использовал базовый образ Go:1.x (см. Dockerfile). Но вы можете использовать и другие варианты. Во время развертывания образ Docker собирается локально, размещается в частном реестре ECR и, наконец, создается функция Lambda – и все это с помощью нескольких строк кода!
URL-адрес функции легко определяется с помощью NewFunctionUrl:
funcURL := awslambda.NewFunctionUrl(stack, jsii.String("awsome-func-url"), &awslambda.FunctionUrlProps{AuthType: awslambda.FunctionUrlAuthType_NONE, Function: function})
Для целей этого примера приложения мы используем
NONE
в качестве типа аутентификации. Это означает, что URL-адрес лямбда-функции будет общедоступен.
Создание/настройка команды в Slack
Начните с входа в рабочее пространство Slack и создания нового приложения Slack.
После этого создайте Slash-команду – перейдите на страницу настроек вашего приложения, а затем нажмите на функцию Slash Commands в навигационном меню. Перед вами появится кнопка Create New Command (Создать новую команду), нажав на которую, вы увидите окно, где вам будет предложено определить новую команду Slash Command, указав необходимую информацию.
Введите необходимую информацию:
- В разделе Запрос URL введите пока фиктивный URL, например, https://comingsoon.com.
Он является временным и будет заменен на URL лямбда-функции после развертывания.
Наконец, установите приложение на рабочую область – нажмите на функцию Basic Information в навигационном меню, выберите Install your app to your workspace и нажмите Install App to Workspace. Это позволит установить приложение в рабочую область Slack для тестирования вашего приложения и генерации токенов, необходимых для взаимодействия с API Slack.
Как только вы закончите установку приложения, на той же странице появится App Credentials. Оттуда вам нужно взять свой Slack Signing Secret.
Запишите секрет подписи вашего приложения, так как вы будете использовать его позже.
Разверните функцию с помощью CDK и обновите конфигурацию Slack
Клонируйте репозиторий Github и переместите в нужную директорию:
git clone https://github.com/abhirockzz/awsome-slack-backend
cd awsome-slack-backend/function
Соберите функцию Go:
GOOS=linux go build -o awsome
Разверните функцию:
export SLACK_SIGNING_SECRET=<enter the slack signing secret>
export GIPHY_API_KEY=<enter the giphy API key>
cd ../cdk && cdk deploy
Запишите URL-адрес лямбда-функции, который вы получите на выходе.
Вернитесь в Slack и обновите конфигурацию, чтобы отразить URL-адрес Lambda-функции.
Все было установлено и настроено. Теперь перейдите в рабочее пространство Slack и вызовите команду Slack, которую вы только что настроили! Попробуйте это:
/awsome serverless
Очистка
Как только вы закончите, вы можете удалить функцию и связанные с ней ресурсы:
cdk destroy
Завершите работу!
В этой статье блога мы рассказали о том, как облегчить процесс развертывания нашего бэкенда Serverless с помощью AWS CDK!