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 boîte à 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

Comment évalueriez-vous votre expérience avec Google Cloud ?

<ph type="x-smartling-placeholder"></ph> 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 la 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, vous allez utiliser dans ce tutoriel Cloud Shell, 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 vous explique de quoi il s'agit. Si un écran intermédiaire vous s'est présenté, cliquez sur Continue (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 dans Google Cloud, ce qui améliore considérablement les performances du réseau et l'authentification. Une grande partie, voire la totalité, de votre travail dans cet atelier de programmation peut être effectué dans un navigateur.

Une fois connecté à Cloud Shell, vous êtes authentifié et le projet est défini sur 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 réussite 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 serez autorisé à créer des intégrations personnalisées. Vous pouvez créer un espace de travail sans frais si vous n'en avez pas encore 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 message d'accueil simple.

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.
  • Donnez un nom à 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 à la page d'accueil de l'application dans le panneau de gauche, sous Fonctionnalités.

414213b184fcc992.png

  • Attribuez un niveau d'accès à votre jeton de bot en cliquant sur Examiner les niveaux d'accès à ajouter
  • Faites défiler la page jusqu'à Champs d'application du jeton 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 et cliquez sur le bouton Install App to your Workspace (Installer l'application dans votre espace de travail).
  • L'application est alors installée pour votre équipe, l'utilisateur de bot que vous venez de créer est ajouté et un jeton de bot est généré.
  • 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 la signature secrète du client

  • Accédez à Informations générales sous Paramètres.
  • Faites défiler la page jusqu'à Signing Secret (Code secret de signature), cliquez sur Show (Afficher), puis copiez le code 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 à la page OAuth & 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 à partir de la page de gestion des applications si vous avez besoin de récupérer à nouveau ces jetons.

6. Un secret, c'est sacré

Nous voulons nous assurer que votre jeton de bot et votre signature secrète client sont stockés de manière sécurisée. Si vous les codez en dur dans le code source, vous risquez d'exposer accidentellement ces secrets en les publiant dans le système de contrôle des versions ou en les intégrant à une image Docker.

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

Créer vos secrets

Enregistrez votre signature secrète 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

Changez de répertoire en 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 à l'aide de la commande suivante pour ouvrir directement le dossier actuel dans l'éditeur Cloud Shell:

cloudshell workspace .

Le code de kittenbot a deux fonctions principales. l'une pour récupérer les secrets et l'autre pour exécuter le bot.

Tout d'abord, nous importons 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 le Botkit et permettent au bot de traduire facilement des messages vers et depuis l'API Slack. Le client Secret Manager vous permet d'accéder aux secrets que vous avez enregistrés précédemment.

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. Ensuite, une fois le contrôleur activé, le bot répond à tous les messages contenant "hello", "hi" ou "hey". par "Miaou. résume".

Consultez ces parties spécifiques 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 depuis la source avec Cloud Run. Voici ce qui se passe en arrière-plan:

  • Cloud Run appelle Cloud Build pour créer une image de conteneur (consultez la section Déployer depuis le code source).
  • Si le répertoire du code source contient un élément Dockerfile, 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.
  • Buildpacks détecte le fichier manifeste package.json et crée une image Node.js.
  • Le champ scripts.start détermine le mode de démarrage de l'application.
  • Le champ engines.node détermine la version Node.js de l'image de base du conteneur.
  • Au moment 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 des événements. Lorsque vous configurez l'application Slack, vous devez fournir une URL accessible publiquement pour que l'API Slack lui envoie un ping.

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

Récupérer l'ID de votre 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 depuis Secret Manager, le compte de service Cloud Run doit disposer du rôle roles/secretmanager.secretAccessor.

Commencez par enregistrer 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 a bien été enregistrée:

echo $SERVICE_ACCOUNT

Le compte de service a le format suivant: PROJECT_NUMBER-compute@developer.gserviceaccount.com.

Une fois que vous disposez de 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
  • Un service appelé kittenbot est alors créé.
  • L'option --source utilise le dossier actuel pour créer 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 à l'aide de cette commande: gcloud config set run/region $REGION
  • Vous pouvez également rendre Cloud Run géré par défaut à l'aide de cette commande: 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 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)?

Cette opération 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 ...

Attendez ensuite 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 a le format suivant:

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

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

Votre service est désormais actif et public. Pour en savoir plus, accédez à la console Cloud Run. fee46ea7c8483d56.png

Vous pouvez voir quand la dernière révision a été créée, le volume de trafic qu'elle reçoit et consulter 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 à envoyer des messages depuis notre canal Slack.

9. Activer les événements Slack

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

kittenbot.js

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

Cela signifie que notre URL complète correspondra à 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 rapidité à laquelle vous saisissez l'URL, la validation peut être effectuée avant que vous ayez terminé. S'il n'y parvient pas, cliquez sur "Réessayer".

S'abonner

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

1e8f200390908a9b.png

Cliquez sur Enregistrer les modifications en bas de la page. Vous êtes alors invité à réinstaller votre application. Suivez les instructions, puis cliquez sur Autoriser.

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

10. Tester votre bot

Envoyer un message privé à Kittenbot:

1f442dd7fd7b5773.png

Ajoutez kittenbot à votre chaîne en saisissant "@kittenbot". puis cliquez sur "Inviter".

9788d2167ce47167.png

Désormais, tous les membres de votre chaîne peuvent 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 consultez les journaux du service Cloud Run, vous constaterez que chaque message correspond à une entrée POST dans le journal.

1ff0c2347bf464e8.png

Le kittenbot répond à chaque message par "Miaou. résume".

11. Bonus : Mettre à jour votre bot

Cette section facultative devrait prendre quelques minutes. N'hésitez pas à passer directement au nettoyage.

Fils de discussion

Nous aimerions 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 offre la possibilité de 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 de conversation 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 "chaton", il passe au message intitulé "no_kittens", qui constitue la fin du fil de discussion.

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(() => {
    // ...
  });
}

Afficher la boîte de dialogue

Maintenant que le contrôleur peut utiliser la boîte de dialogue, découvrez 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 voulez pas avoir de conversation avec l'utilisateur ? Que faire si vous préférez déclencher une action à l'aide d'une simple commande ?

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

Activer les commandes Slack Slash

  • Accédez à la section Commandes à barre oblique sous Fonctionnalités sur la page 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 utilisé pour activer l'API Events. Il s'agit de votre URL, plus '/api/messages'.

e34d393c14308f28.png

  • Suivez les instructions pour mettre à jour votre application et les autorisations.

Ajouter des commandes à barre oblique à votre manette

Découvrez comment un gestionnaire pour les commandes à barre oblique a été ajouté dans 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 /cats et 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 ! Un bot Slack s'exécute désormais dans 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 dans 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 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 code secret de votre jeton de 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 répertorier 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/

À présent, supprimez 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 maintenant exécuter un bot Slack dans 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