【Cloud Automator】Lambda関数を呼び出しアクションを実行してSlackへ定期的に天気予報を伝えてくれるボットを作成した話

記事タイトルとURLをコピーする

サービス開発課の刈谷です。

Cloud Automator(CA)の開発に携わり、約10ヶ月程度経ちました。
※私のCAの使用方法(自動)は、開発環境で使用しているEC2を起動・停止させたりAMIのバックアップを取得しています。 ※AWSコンソールへログインしないので便利です。

https://cloudautomator.com/

話は逸れるのですが、サーバーワークスは、全社員リモートワークをすることにも力を入れており、2022年9月には、RubyKaigi 2022に参加した際の三重のホテルから、サービス開発課の朝ミーティング等に参加したり、この10ヶ月の間に自宅では無く他県で仕事したことも有りました。
サーバーワークスのその取り組みや考え方が非常に有難いです。

https://blog.serverworks.co.jp/2022/09/20/213811

話を戻し、「Lambda: 関数を呼び出し」アクションが2023/02/07にリリースされました。 オンラインセミナーでセミナー参加して下さる方々へ、Lambda関数を呼び出しアクションについてお話するスピーカーに、私が選ばれまして、何を話そうか考えておりました。 単にCAからLambda関数を呼び出しアクションを手動実行するご説明のみだと、皆様には伝わりにくいと考えておりました。

そんな時に、別課の方へLambda関数を呼び出しアクションの使用方法をヒアリング後、ふと思いついたのが、「そういえば、朝、絶対天気予報ググるなー」「仕事が終わりかけで、尚且つ、外出時に絶対天気予報ググるなー」「Lambda関数を呼び出しアクションがリリースされたし、折角やし、自動化してSlackのgeneralチャンネル(※ワークスペースはオカンと僕のみで使用)へ通知させるか!セミナーでの事例紹介に丁度良いだろう!」と思いつき実際にやってみました。

結果、ある程度上手く行ったので、母親には、親孝行風に「お母さんのために天気予報通知してくれるアプリ作ったで。」と言っておきました。

EventBridgeの利用によるLambdaの定期実行も可能ですが、CAを利用することで、日本の祝日対応等のより柔軟なスケジュールの設定や、後処理による実行結果の通知など、より便利にご利用頂くことが可能です。

https://blog.serverworks.co.jp/ca-invoke-lambda-function

前置きが長くなってしまいましたが、Cloud Automator/Lambda/Slackを連携するための調査した流れを記載し、それぞれ簡単に紹介致します。 ※あまりにも長文になってしまうため、今回は、天気予報通知では無くメッセージ通知手順を記載します。

Lambda関数作成実行(Node.js 12.x)

  • 関数の作成から一番左の一から作成を選択、Node.js 12.xを選択後、右下にある【関数を作成】ボタンをクリック

  • テストイベントで右上にある【テスト】ボタンをクリック - 成功確認

Slackアプリ作成

  • アプリをインストールするワークスペースにログイン後以下のURLにアクセス https://api.slack.com/apps

  • 【create new app】ボタンをクリック

  • 【From scratch】を選択

  • 名前を入力&ワークスペースを選択し【Create App】をクリック

  • Incoming Webhookをクリック

  • ワークスペースと連携(通知したいチャンネルを選択し【許可する】ボタンをクリック)

  • curlをコマンド実行(※Slackへメッセージが通知されるかテスト)

Lambda + Slack通知

Slackの設定の続き

  • Slackアプリ作成画面に戻り【chat:write】を追加

  • 上部のリンクから再度インストールする

  • Slackを開きチャンネル名をクリックしチャンネルIDを取得(実装コードに追加)

  • インテグレーションタブに切り替えてアプリを追加

  • Bot User OAuth Tokenをコピーする(実装コードに追加)

  • 実装コードをLambda関数のコードへ貼り付け

  • Lambda:テストボタンをクリック

  • メッセージ【from lambda】がSlackへ通知されるか確認

実装コード(Node.js 12.x)

※今回は以下のようなコードを実装しました。

// AWS API
const HTTPS       = require('https');
const QUERYSTRING = require('querystring');

//Slack API
const SLACK_HOST     = 'slack.com';
const SLACK_PATH     = '/api/chat.postMessage';
const SLACK_TOKEN    = 'xoxb-XXXXXXXXXXXX'; // 取得したSlackのトークンを設定
const SLACK_CHANNEL  = 'XXXXXXXX'; // 通知するSlackのチャンネルIDを設定

/*** 実行 ***/
exports.handler = (event, context, callback) => {
    let message = "form lambda";
    sendSlack(message, context);
};


/*** Slack情報 ***/
const sendSlack =(message, context)=> {
    let formData = {
        token     : SLACK_TOKEN,
        channel   : SLACK_CHANNEL,
        text      : message,
    };

    let options = {
        hostname: SLACK_HOST,
        path    : SLACK_PATH,
        method  : 'POST',
        headers : {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
    };

    const req = HTTPS.request(options, (res) => {
        res.on('data', (d) => {
            console.log(d + "\n");
        });
    });

    req.write(QUERYSTRING.stringify(formData));
    req.end();
};

CA:Lambda関数を呼び出しアクションのジョブ作成

  • CAのサインインURLにアクセス manager.cloudautomator.com

  • ジョブ追加画面からタイマートリガーでジョブを作成

CA + Lambda + Slack通知

  • 指定時間になると通知されるか確認・完了(スマホのロック画面で確認しました。)

【Lambda関数を呼び出す際はAWSコンソールへログインして実行】【自動でバックアップする際はCAでジョブを作成】という運用をされていたお客様もいらっしゃるかと思いますが、CAのみで完了出来るようになりましたので、是非、CAをご活用下さい。

またサービス開発課では、「●●機能開発して欲しいです。」とお客様からのご要望も随時募集しております。 ご要望御座いましたら、UserVoice等でお気軽にご連絡下さい。

https://feedback.cloudautomator.com/