Slackを利用して、ChatOps on Alibaba Cloudをやってみました !

はじめに

皆さん、こんにちは。Alibaba Cloud ソリューションアーキテクトのQ(@joe_qiubinbin)です。

ChatOpsでECSインスタンスの起動や停止をすこし楽にしたいので、SlackからSlash CommandsでECSインスタンスを操作できるようにしてみました。

 

アーキテクチャとフロー

chatops_on_alibaba_cloud

chatops_on_alibaba_cloud

 

利用する主なサービス

利用フロー

  1. ユーザーは指定されたSlackとSlackのチャンネルにて、/ecs start <instance-id> のようなSlash Commandを実行します。

  2. Slackはユーザーが発行したSlash Commandを指定されたURL(FCのHTTPトリガー)に送信します。

  3. Front FCがSlackから送信された情報を受け取り、正当性確認を行います。確認した後、Slash Commandの情報を設定し、Execution FCを起動します。

  4. Execution FCはFront FCから渡された情報を元に、指定されたECSインスタンスに対して操作し、その操作結果をSlackに送信します。

デモ

下記、1分18秒のYouTube動画にて、ご確認ください。

www.youtube.com

 

アーキテクチャについて

細かい設定作業は割愛しますが、Slack、Function Compute、RAMの重要なところだけ説明させていただきます。

 

Slack

  • ① Slash CommandsのTimeout時間は3000ms
    一連の処理(特にFCの実行)が少し時間がかかりますので、Slash CommandsがTimeoutしないように、Front FCで一旦Slackからの情報を受け取り、Slackに返信すると同時に、受け取った情報をExecution FC に渡すようにしています。これが2つのFCを利用している理由です。

  • ② Slackから送信される情報
    以下のような情報がSlackからFCに送られます。

      1. textの内容にspaceが入っている場合,space は + に置き換えられます
      2. response_urlはエンコードされるので、FCでデコードする必要があります

    token=3mVXdAC5EFNbsXYGNk0sah3M

    team_id=T0001

    team_domain=example

    channel_id=C2147483705

    channel_name=test

    user_id=U2147483697

    user_name=Steve

    command=/weather

    text=94070 response_url=https://hooks.slack.com/commands/1234/5678

Function Compute

FCには HTTPトリガー という便利な機能があります。
HTTPトリガーを利用して、発行されたhttpsのURLにリクエストを送れば、FCが起動します。

Slackのタイムアウト時間は3sですので、今回下記2つのFunction Computeを作成しました。

  • Front FC
    • 主な役割としては、Slackからの情報の確認とECSインスタンスを操作するExecution FCの起動です。
    • HTTPトリガーを設定しています。
    • 非同期方式(Async)でExecution FCを呼び出します。
  • Execution FC
    • Front FCにてチェックされたコマンド情報を受け取り、ECSインスタンスを操作してから、その操作結果をSlackの特定のチャンネルに返します。

RAM

FCはAlibaba Cloudのリソースを操作する権限が必要ですので、FCを作成する際に、予めその権限をFCに付与します。

今回はRoleとAccessKeyを利用します。

  • RAM Role

    • プロダクト単位で設定します。
    • FCが実行される際には、設定されたRAM Roleから一時的な認証情報を取得して利用しています。
  • AccessKey

    • Execution FCが利用するものです。
      元々設定されているRAM Roleからの一時的は認証情報を利用したかったですが、一時的な認証情報を利用したECS clientの作成方法がわからなかったので、一旦AccessKey利用の方式にしました。ちなみに利用しているPythonSDK は aliyun-python-sdk-coreです。

ソースコードについて

FCのソースコードはGitHubのレポジトリ chatops_on_alibaba_cloud においてあります。あくまでもサンプルコードで、実運用の際にはエラー処理とかも必要ですので、ご注意ください。

Front FC

ソースコードは front_fc.py になります。
下記Front FCの変数に必要な情報を設定して、FC Functionに渡しています。

  • 1: FUNCTION_COMPUTE_ENDPOINT
    Execution FCを呼び出す際に利用します。Function Computeの管理画面に記載されていて、Internet Endpoint / Intranet Endpoint があります。Intranet Endpointの利用を推奨します。
  • 2: INVOKE_FC
    Execution FCの名前になります。
  • 3: SLACK_CHANNEL
    文字列形式で、正当性確認用の情報で、指定されたSlack ChannelからのみSlash Commandのみ対応します。
  • 4: SLACK_TOKEN
    文字列形式で、正当性確認用の情報で、指定されたSlackからのみSlash Commandのみ対応します。
  • 5: ECS_CMD_CODE
    配列形式で、正当性確認用の情報で、指定されたSlash Commandのみ対応します。

Execution FC

ソースコードは execution_fc.py になります。
下記、認証情報を変数に設定して、FCに渡しています。

  • ACCESS_KEY_ID
  • ACCESS_KEY_SECRET

その他

FCを開発する際には、fcli や fun というツールもありますので、ご興味ある方は是非一度触ってみてください。

 

最後

今回はAlibaba CLoud上でのChatOpsについて簡単にご紹介させていただきました。ご覧の通り、多少コーディングと利用ルールの整備が必要ですが、SlackとFCを利用すればAlibaba CloudのChatOpsも簡単にできてしまいます。皆さんの開発に少し役に立てると幸いです。