Créer un bot Slack avec Node.js dans Cloud Run

1. Présentation

5f529fb87abc11c9.png

Dans cet atelier de programmation, vous allez apprendre à créer un bot Slack à l'aide de la suite d'outils Botkit et à l'exécuter sur Google Cloud. Vous pourrez ensuite interagir avec le bot dans une chaîne Slack en direct.

Points abordés

  • Créer une intégration personnalisée de bot dans Slack
  • Sécuriser vos secrets Slack avec Secret Manager
  • Déployer un bot Slack sur Cloud Run, une plate-forme de calcul entièrement gérée qui effectue un scaling automatique de vos conteneurs sans état

Prérequis

  • Un projet Google Cloud
  • Un navigateur tel que Chrome ou Firefox

Comment allez-vous utiliser ce tutoriel ?

Je vais le lire uniquement Je vais le lire et effectuer les exercices

Quel est votre niveau d'expérience avec Google Cloud ?

Débutant Intermédiaire Expert

2. Préparation

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

98e4187c97cf2e0e.png

37d264871000675d.png

c20a9642aaa18d11.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pourrez toujours le modifier.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Démarrer Cloud Shell

Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, nous allons nous servir de Cloud Shell pour ce tutoriel, un environnement de ligne de commande exécuté dans le cloud.

Activer Cloud Shell

  1. Dans Cloud Console, cliquez sur Activer Cloud Shell d1264ca30785e435.png.

84688aa223b1c3a2.png

Si vous démarrez Cloud Shell pour la première fois, un écran intermédiaire s'affiche pour vous expliquer de quoi il s'agit. Si cet écran s'est affiché, cliquez sur Continuer.

d95252b003979716.png

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

7833d5e1c5d18f54.png

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier de programmation dans un navigateur.

Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est défini avec votre ID de projet.

  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list

Résultat de la commande

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud connaît votre projet :
gcloud config list project

Résultat de la commande

[core]
project = <PROJECT_ID>

Si vous obtenez un résultat différent, exécutez cette commande :

gcloud config set project <PROJECT_ID>

Résultat de la commande

Updated property [core/project].

3. Activer les API

Dans Cloud Shell, activez les API Artifact Registry, Cloud Build, Cloud Run et Secret Manager :

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  secretmanager.googleapis.com

Un message de confirmation semblable à celui-ci s'affiche :

Operation "operations/..." finished successfully.

Vous êtes maintenant prêt à préparer et à déployer votre application.

4. Créer un espace de travail Slack

Vous aurez besoin d'un espace de travail Slack dans lequel vous êtes autorisé à créer des intégrations personnalisées. Vous pouvez créer un espace de travail sans frais si vous n'en avez pas déjà un que vous souhaitez utiliser pour ce tutoriel.

aa1f0fda82263bf8.png

5. Créer un utilisateur de bot Slack

Un utilisateur bot peut consulter et publier des messages, ainsi qu'importer des fichiers dans Slack. Dans cet atelier de programmation, vous allez créer un bot pour publier un simple message d'accueil.

Créer une application Slack

  • Accédez à la page de gestion des applications Slack.
  • Cliquez sur le bouton Create new app (Créer une application) en haut à droite.
  • Nommez l'application, par exemple "Kittenbot".
  • Choisissez l'espace de travail Slack où elle sera installée pour votre équipe.

Créer un utilisateur de bot

  • Accédez à App Home (Accueil de l'application) dans le panneau de gauche, sous Fonctionnalités.

414213b184fcc992.png

  • Attribuez un champ d'application à votre jeton de bot en cliquant sur Examiner les champs d'application à ajouter.
  • Faites défiler la page jusqu'à Champs d'application des jetons de bot, puis cliquez sur Ajouter un champ d'application OAuth. Sélectionnez chat:write pour "Envoyer des messages en tant que Kittenbot".

74a6fa87c64c2b23.png

  • Faites défiler la page vers le haut, puis cliquez sur le bouton Install App to your Workspace (Installer l'application dans votre espace de travail).
  • Cela installera l'application dans votre équipe, ajoutera l'utilisateur bot que vous venez de créer et générera un jeton de bot.
  • Lorsque vous y êtes invité, cliquez sur Autoriser pour autoriser le bot à discuter dans votre espace de travail.

Activer les messages et les commandes

  • Faites défiler la page jusqu'à Afficher les onglets et assurez-vous que les deux options sont activées :

5ca52f7abbdc15c.png

Obtenir le code secret de signature du client

  • Accédez à Informations de base sous Paramètres.
  • Faites défiler la page jusqu'à Signing Secret (Secret de signature), cliquez sur Show (Afficher), puis copiez le secret dans le presse-papiers :

74cfd6616fa71dc4.png

  • Enregistrez le secret dans une variable d'environnement :
CLIENT_SIGNING_SECRET=PASTE_THE_SIGNING_SECRET

Obtenir le jeton du bot

  • Accédez à OAuth et autorisations sous Fonctionnalités.
  • Cliquez sur le bouton Copy (Copier) pour copier le texte du champ Bot user OAuth access token (Jeton d'accès OAuth de l'utilisateur bot) dans votre presse-papiers.

6f5a18069471101.png

  • Enregistrez le jeton du bot dans une variable d'environnement :
BOT_TOKEN=PASTE_THE_BOT_TOKEN

Ne vous inquiétez pas. Vous pouvez revenir sur cette page de configuration depuis la page de gestion des applications si vous avez besoin de retrouver ces jetons.

6. Sécuriser vos secrets

Nous souhaitons nous assurer que votre jeton de bot et votre code secret de signature client sont stockés de manière sécurisée. Si vous les codez en dur dans le code source, vous risquez de les exposer sans le vouloir en les transmettant au système de contrôle des versions ou en les intégrant à une image Docker.

Secret Manager fournit une méthode sécurisée et pratique pour stocker les clés API, les mots de passe, les certificats et d'autres données sensibles. Il fournit un emplacement centralisé et un référentiel unique pour la gestion, la consultation et l'audit des secrets sur Google Cloud.

Créer vos secrets

Enregistrez votre code secret de signature client et votre jeton de bot à l'aide des commandes suivantes :

  • Signature secrète du client
echo -n $CLIENT_SIGNING_SECRET | gcloud secrets create client-signing-secret \
  --replication-policy automatic \
  --data-file -
  • Jeton de bot
echo -n $BOT_TOKEN | gcloud secrets create bot-token \
  --replication-policy automatic \
  --data-file -

Accéder à vos secrets

Vérifions que vos secrets ont été créés correctement et que vos autorisations fonctionnent. Accédez à vos secrets à l'aide des commandes suivantes :

echo $(gcloud secrets versions access 1 --secret client-signing-secret)
echo $(gcloud secrets versions access 1 --secret bot-token)

Vous pouvez également afficher et gérer vos secrets dans la console Google Cloud.

7. Obtenir l'exemple de code

Dans Cloud Shell, exécutez la commande suivante pour cloner le dépôt GitHub :

git clone https://github.com/googlecodelabs/cloud-slack-bot.git

Remplacez le répertoire par cloud-slack-bot/start.

cd cloud-slack-bot/start

Comprendre le code

Ouvrez le fichier kittenbot.js avec l'éditeur de ligne de commande de votre choix (nano, vim, emacs, etc.) ou avec la commande suivante pour ouvrir directement le dossier actuel dans l'éditeur Cloud Shell :

cloudshell workspace .

Le code Kittenbot a deux fonctions principales. L'un sert à récupérer les secrets et l'autre à exécuter le robot.

Commençons par importer les dépendances :

kittenbot.js

const { Botkit } = require('botkit');
const {
  SlackAdapter,
  SlackEventMiddleware,
} = require('botbuilder-adapter-slack');
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');

SlackAdapter et SlackEventMiddleware sont des packages qui étendent Botkit et permettent au bot de traduire facilement les messages vers et depuis l'API Slack. Le client Secret Manager vous permettra d'accéder aux secrets que vous avez enregistrés à une étape précédente.

Ensuite, nous avons notre fonction pour récupérer les secrets :

/**
 * Returns the secret string from Google Cloud Secret Manager
 * @param {string} name The name of the secret.
 * @return {Promise<string>} The string value of the secret.
 */
async function accessSecretVersion(name) {
  const client = new SecretManagerServiceClient();
  const projectId = process.env.PROJECT_ID;
  const [version] = await client.accessSecretVersion({
    name: `projects/${projectId}/secrets/${name}/versions/1`,
  });

  // Extract the payload as a string.
  const payload = version.payload.data.toString('utf8');

  return payload;
}

Cette fonction renvoie les valeurs de chaîne des secrets nécessaires pour authentifier le bot.

La fonction suivante initialise le bot :

/**
 * Function to initialize kittenbot.
 */
async function kittenbotInit() {
  const adapter = new SlackAdapter({
    clientSigningSecret: await accessSecretVersion('client-signing-secret'),
    botToken: await accessSecretVersion('bot-token'),
  });

  adapter.use(new SlackEventMiddleware());

  const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

  controller.ready(() => {
    controller.hears(
      ['hello', 'hi', 'hey'],
      ['message', 'direct_message'],
      async (bot, message) => {
        await bot.reply(message, 'Meow. :smile_cat:');
      }
    );
  });
}

La première partie de la fonction configure SlackAdapter avec les secrets, puis spécifie un point de terminaison pour la réception des messages. Une fois la manette allumée, le bot répondra à tout message contenant "bonjour", "salut" ou "coucou" par "Miaou. 😺".

Consultez les parties spécifiques suivantes dans le fichier manifeste de l'application :

package.json

{
  // ...
  "scripts": {
    "start": "node kittenbot.js",
    // ...
  },
  "engines": {
    "node": "16"
  },
  // ...
}

Vous pouvez déployer une application Node.js directement à partir de la source avec Cloud Run. Voici ce qui se passe en coulisses :

  • Cloud Run appelle Cloud Build pour créer une image de conteneur (voir Déployer à partir du code source).
  • Si un Dockerfile est présent dans le répertoire du code source, Cloud Build l'utilise pour créer une image de conteneur.
  • Comme ce n'est pas le cas, Cloud Build appelle Buildpacks pour analyser la source et générer automatiquement une image prête pour la production.
  • Les buildpacks détectent le fichier manifeste package.json et créent une image Node.js.
  • Le champ scripts.start détermine comment l'application est lancée.
  • Le champ engines.node détermine la version Node.js de l'image de base du conteneur.
  • Lors du déploiement, les correctifs de sécurité connus sont automatiquement appliqués.

Vous êtes prêt à déployer l'application.

8. Déployer l'application

L'API Slack Events utilise des webhooks pour envoyer des messages sortants concernant les événements. Lorsque vous configurez l'application Slack, vous devez fournir une URL accessible au public pour que l'API Slack puisse l'envoyer.

Cloud Run est une bonne solution pour héberger des cibles de webhook. Il vous permet d'utiliser le langage ou l'environnement d'exécution de votre choix et offre la simultanéité, ce qui signifie que votre application pourra gérer un volume beaucoup plus élevé.

Récupérer votre ID de projet

Définissez la variable d'environnement PROJECT_ID :

PROJECT_ID=$(gcloud config get-value core/project)

Définir votre région Cloud Run

Cloud Run est régional, ce qui signifie que l'infrastructure qui exécute votre service Cloud Run est située dans une région spécifique et gérée par Google pour être disponible de manière redondante dans toutes les zones de cette région. Définissez la région que vous utiliserez pour votre déploiement, par exemple :

REGION="us-central1"

Modifier les autorisations

Pour pouvoir accéder aux secrets de Secret Manager, le compte de service Cloud Run doit disposer du rôle roles/secretmanager.secretAccessor.

Tout d'abord, enregistrez le compte de service par défaut dans une variable d'environnement :

SERVICE_ACCOUNT=$(gcloud iam service-accounts list \
  --format "value(email)" \
  --filter "displayName:Compute Engine default service account")

Vérifiez que l'adresse e-mail est enregistrée :

echo $SERVICE_ACCOUNT

Le compte de service est au format suivant : PROJECT_NUMBER-compute@developer.gserviceaccount.com.

Une fois que vous avez l'adresse e-mail, activez le rôle pour le compte de service :

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/secretmanager.secretAccessor

Déployer l'application

Un service Cloud Run expose un point de terminaison unique et adapte automatiquement l'infrastructure sous-jacente pour gérer les requêtes entrantes.

Déployez l'application sur Cloud Run :

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated
  • Cette opération crée un service appelé kittenbot.
  • L'option --source utilise le dossier actuel pour compiler l'application avec Cloud Build. Cloud Build détecte automatiquement la présence du fichier package.json.
  • Vous pouvez également définir une région par défaut avec la commande suivante : gcloud config set run/region $REGION
  • Vous pouvez également définir Cloud Run comme plate-forme gérée par défaut à l'aide de la commande suivante : gcloud config set run/platform managed
  • L'option --set-env-vars définit les variables d'environnement du service.
  • L'option --allow-unauthenticated rend le service accessible au public.

La première fois, vous serez invité à créer un dépôt Artifact Registry. Appuyez sur Entrée pour valider :

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

Cela lance l'importation de votre code source dans le dépôt Artifact Registry et la compilation de votre image de conteneur :

Building using Dockerfile and deploying container ...
* Building and deploying new service... Building Container.
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

Patientez ensuite quelques instants jusqu'à la fin de la compilation et du déploiement. En cas de réussite, la ligne de commande affiche l'URL du service :

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

Vous pouvez obtenir l'URL du service à l'aide de la commande suivante :

SERVICE_URL=$( \
  gcloud run services describe kittenbot \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

L'URL se présente au format suivant :

https://kittenbot-PROJECTHASH-REGIONID.a.run.app

Cette URL servira de base pour activer l'API Slack Events. Copiez-le dans votre presse-papiers pour l'utiliser à l'étape suivante.

Votre service est désormais actif et accessible au public. Pour en savoir plus, consultez la console Cloud Run. fee46ea7c8483d56.png

Vous pouvez consulter la date de création de la dernière révision, le volume de trafic qu'elle génère et les journaux. Si nous cliquons sur les journaux, nous pouvons voir que le contrôleur Botkit est activé et prêt à recevoir des messages.

Commençons maintenant à envoyer des messages depuis notre canal Slack.

9. Activer les événements Slack

Comme nous l'avons vu précédemment, notre code kittenbot spécifie un point de terminaison relatif pour notre cible de webhook.

kittenbot.js

 const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

Cela signifie que notre URL complète sera la partie de base du service Cloud Run, plus /api/messages.

Activer les événements

Sur la page de gestion des applications, accédez à la section Abonnements aux événements dans la barre latérale, puis activez l'option Activer les événements. Saisissez l'URL de votre service :

PASTE_THE_SERVICE_URL/api/messages

5179a99339839999.png

Selon la vitesse à laquelle vous saisissez l'URL, il est possible que le système tente de la valider avant que vous ayez terminé. Si l'opération échoue, cliquez sur "Réessayer".

S'abonner

S'abonner à tous les événements du bot de messages

1e8f200390908a9b.png

Cliquez sur Enregistrer les modifications en bas de la page. Vous serez invité à réinstaller votre application. Suivez les instructions et cliquez sur Autoriser.

À ce stade, votre bot est entièrement intégré. Les messages dans l'espace de travail déclenchent l'envoi de messages de Slack à votre service Cloud Run, qui répond à son tour par un simple message d'accueil.

10. Tester votre bot

Envoyez un message privé à Kittenbot :

1f442dd7fd7b5773.png

Ajoutez kittenbot à votre chaîne en saisissant "@kittenbot", puis en cliquant sur "Invite Them" (Inviter).

9788d2167ce47167.png

Tous les membres de votre chaîne peuvent désormais interagir avec Kittenbot.

9c0d1d7907a51767.png

Chaque message dans Slack déclenche un événement et envoie un message HTTP POST à notre service Cloud Run. Si vous examinez les journaux du service Cloud Run, vous verrez que chaque message correspond à une entrée POST dans le journal.

1ff0c2347bf464e8.png

Le chatonbot répond à chaque message par "Miaou. 😺".

11. Bonus : Mettre à jour votre bot

Cette section facultative ne devrait prendre que quelques minutes. N'hésitez pas à passer directement à la section "Nettoyage".

Fils de discussion

Nous souhaitons que le bot fasse plus que miauler. Mais comment déployer une nouvelle version d'un élément exécuté sur Cloud Run ?

Remplacez le répertoire par cloud-slack-bot/extra-credit:

cd ../extra-credit/

Ouvrez le dossier actuel dans l'éditeur Cloud Shell :

cloudshell workspace .

Botkit peut gérer les conversations. Grâce à cet outil, le bot peut demander plus d'informations et répondre aux messages avec plus d'un seul mot.

Définir la boîte de dialogue

Tout d'abord, découvrez comment les fonctions conversationnelles sont définies à la fin du fichier :

// ...
const maxCats = 20;
const catEmojis = [
  ':smile_cat:',
  ':smiley_cat:',
  ':joy_cat:',
  ':heart_eyes_cat:',
  ':smirk_cat:',
  ':kissing_cat:',
  ':scream_cat:',
  ':crying_cat_face:',
  ':pouting_cat:',
  ':cat:',
  ':cat2:',
  ':leopard:',
  ':lion_face:',
  ':tiger:',
  ':tiger2:',
];

/**
 * Function to concatenate cat emojis
 * @param {number} numCats Number of cat emojis.
 * @return {string} The string message of cat emojis.
 */
function makeCatMessage(numCats) {
  let catMessage = '';
  for (let i = 0; i < numCats; i++) {
    // Append a random cat from the list
    catMessage += catEmojis[Math.floor(Math.random() * catEmojis.length)];
  }
  return catMessage;
}

/**
 * Function to create the kitten conversation
 * @param {Object} controller The botkit controller.
 * @return {Object} The BotkitConversation object.
 */
function createKittenDialog(controller) {
  const convo = new BotkitConversation('kitten-delivery', controller);

  convo.ask('Does someone need a kitten delivery?', [
    {
      pattern: 'yes',
      handler: async (response, convo, bot) => {
        await convo.gotoThread('yes_kittens');
      },
    },
    {
      pattern: 'no',
      handler: async (response, convo, bot) => {
        await convo.gotoThread('no_kittens');
      },
    },
    {
      default: true,
      handler: async (response, convo, bot) => {
        await convo.gotoThread('default');
      },
    },
  ]);

  convo.addQuestion(
    'How many would you like?',
    [
      {
        pattern: '^[0-9]+?',
        handler: async (response, convo, bot, message) => {
          const numCats = parseInt(response);
          if (numCats > maxCats) {
            await convo.gotoThread('too_many');
          } else {
            convo.setVar('full_cat_message', makeCatMessage(numCats));
            await convo.gotoThread('cat_message');
          }
        },
      },
      {
        default: true,
        handler: async (response, convo, bot, message) => {
          if (response) {
            await convo.gotoThread('ask_again');
          } else {
            // The response '0' is interpreted as null
            await convo.gotoThread('zero_kittens');
          }
        },
      },
    ],
    'num_kittens',
    'yes_kittens'
  );

  // If numCats is too large, jump to start of the yes_kittens thread
  convo.addMessage(
    'Sorry, {{vars.num_kittens}} is too many cats. Pick a smaller number.',
    'too_many'
  );
  convo.addAction('yes_kittens', 'too_many');

  // If response is not a number, jump to start of the yes_kittens thread
  convo.addMessage("Sorry I didn't understand that", 'ask_again');
  convo.addAction('yes_kittens', 'ask_again');

  // If numCats is 0, send a dog instead
  convo.addMessage(
    {
      text:
        'Sorry to hear you want zero kittens. ' +
        'Here is a dog, instead. :dog:',
      attachments: [
        {
          fallback: 'Chihuahua Bubbles - https://youtu.be/s84dBopsIe4',
          text: '<https://youtu.be/s84dBopsIe4|' + 'Chihuahua Bubbles>!',
        },
      ],
    },
    'zero_kittens'
  );

  // Send cat message
  convo.addMessage('{{vars.full_cat_message}}', 'cat_message');

  convo.addMessage('Perhaps later.', 'no_kittens');

  return convo;
}

Cette nouvelle conversation oriente le fil de discussion en fonction des réponses. Par exemple, si l'utilisateur répond "non" à la question sur les chatons, il passe au message intitulé "no_kittens", qui marque la fin de ce fil de conversation.

Ajouter la boîte de dialogue au contrôleur

Maintenant que la conversation est définie, découvrez comment l'ajouter au contrôleur :

async function kittenbotInit() {
  // ...
  const controller = new Botkit({
    webhook_uri: '/api/messages',
    adapter: adapter,
  });

  // Add Kitten Dialog
  const convo = createKittenDialog(controller);
  controller.addDialog(convo);

  // Controller is ready
  controller.ready(() => {
    // ...
  });
}

Déclencher la boîte de dialogue

Maintenant que la boîte de dialogue est disponible pour le contrôleur, voyons comment la conversation démarre lorsque le chatbot entend "chaton", "chatons", "chat" ou "chats" :

  // ...

  controller.ready(() => {
    controller.hears(
      ['hello', 'hi', 'hey'],
      ['message', 'direct_message'],
      async (bot, message) => {
        await bot.reply(message, 'Meow. :smile_cat:');
        return;
      }
    );

    // START: listen for cat emoji delivery
    controller.hears(
      ['cat', 'cats', 'kitten', 'kittens'],
      ['message', 'direct_message'],
      async (bot, message) => {
        // Don't respond to self
        if (message.bot_id !== message.user) {
          await bot.startConversationInChannel(message.channel, message.user);
          await bot.beginDialog('kitten-delivery');
          return;
        }
      }
    );
    // END: listen for cat emoji delivery

    // ...
  });

  // ...

Mettre à jour l'application

Redéployez l'application sur Cloud Run :

gcloud run deploy kittenbot \
  --source . \
  --platform managed \
  --region $REGION \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --allow-unauthenticated

Essayer

eca12b3463850d52.png

Félicitations ! Vous venez de mettre à jour un bot Slack exécuté dans Cloud Run.

Commandes à barre oblique

Que faire si vous ne souhaitez pas avoir de conversation avec l'utilisateur ? Et si vous préférez simplement déclencher une action avec une simple commande ?

Slack propose cette fonctionnalité via les commandes Slash, qui permettent aux utilisateurs d'appeler votre application en saisissant la commande dans la zone de message.

Activer les commandes à barre oblique Slack

  • Accédez à la section Commandes slash sous Fonctionnalités sur la page de gestion des applications.
  • Cliquez sur Créer une commande.
  • Configurez une commande /cats avec l'URL de votre service kittenbot. N'oubliez pas d'utiliser le même point de terminaison que celui que vous avez utilisé pour activer l'API Events. Il s'agit de votre URL, plus '/api/messages'.

e34d393c14308f28.png

  • Suivez l'invite pour mettre à jour votre application et vos autorisations.

Ajouter des commandes à barre oblique à votre contrôleur

Découvrez comment un gestionnaire de commandes à barre oblique a été ajouté à la fonction controller.ready :

  // ...

  // Controller is ready
  controller.ready(() => {
    // ...

    // START: slash commands
    controller.on('slash_command', async (bot, message) => {
      const numCats = parseInt(message.text);
      const response = makeCatMessage(numCats);
      bot.httpBody({ text: response });
    });
    // END: slash commands
  });

  // ...

Essayer

Saisissez /chats suivi d'un nombre pour envoyer la commande à barre oblique. Ex. : /cats 8

c67f6fe1ffcafec8.png

Le bot répondra avec huit chats, que vous seul pourrez voir :

9c1b256987fd379a.png

12. Nettoyage

Félicitations ! Vous disposez désormais d'un bot Slack exécuté sur Cloud Run. Vous devez désormais nettoyer les ressources utilisées pour limiter vos dépenses et avoir un comportement responsable dans le cloud.

Supprimer le projet

Vous pouvez supprimer l'intégralité du projet directement depuis Cloud Shell :

gcloud projects delete $PROJECT_ID

Si vous préférez supprimer les différentes ressources une par une, passez à la section suivante.

Supprimer le déploiement

gcloud run services delete kittenbot --region $REGION

Résultat de la commande

Service [kittenbot] will be deleted.
Do you want to continue (Y/n)?  y
Deleted service [kittenbot].

Supprimer votre signature secrète du client

gcloud secrets delete client-signing-secret

Résultat de la commande

You are about to destroy the secret [client-signing-secret] and its
[1] version(s). This action cannot be reversed.
Do you want to continue (Y/n)?  y
Deleted secret [client-signing-secret].

Supprimer le secret du jeton de votre bot

gcloud secrets delete bot-token

Résultat de la commande

You are about to destroy the secret [bot-token] and its [1]
version(s). This action cannot be reversed.
Do you want to continue (Y/n)?  y
Deleted secret [bot-token].

Supprimer les buckets de stockage

Commencez par lister les buckets Google Cloud Storage pour obtenir le chemin d'accès au bucket :

gsutil ls

Résultat de la commande

gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/
gs://<PROJECT_ID>_cloudbuild/

Supprimez maintenant le bucket d'artefacts :

gsutil rm -r gs://[REGION.]artifacts.${PROJECT_ID}.appspot.com/

Résultat de la commande

Removing gs://[REGION.]artifacts.<PROJECT_ID>.appspot.com/...

Enfin, supprimez le bucket cloudbuild :

gsutil rm -r gs://${PROJECT_ID}_cloudbuild/

Résultat de la commande

Removing gs://<PROJECT_ID>_cloudbuild/...

13. Félicitations !

528302981979de90.png

Vous savez désormais exécuter un bot Slack sur Cloud Run.

Nous n'avons fait qu'effleurer les possibilités offertes par cette technologie. Nous vous encourageons à l'explorer davantage avec vos propres déploiements Cloud Run.

Points abordés

  • Créer une intégration personnalisée de bot dans Slack
  • Sécuriser vos secrets Slack avec Secret Manager
  • Déployer votre bot Slack sur Cloud Run

Étapes suivantes

En savoir plus