LoginSignup
1

More than 3 years have passed since last update.

posted at

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

はじめに

本投稿は SBCloud Engineers' Blog にも投稿しています。SBCloud Engineers' Blogには日中間接続をはじめ、Alibaba Cloud関連のソリューションや技術ネタを記載していますので、よかったら是非一度アクセスみてください。

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

アーキテクチャとフロー

image.png

利用する主なサービス

利用フロー

  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に送信します。

デモ

YouTubeの動画 ChatOps on Alibaba Cloud (1分18秒)にて、ご確認ください。

アーキテクチャの解説

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

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の特定のチャンネルに返します。

ソースコードについて

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

  • Front FC

    • ソースコードは front_fc.py になります。
    • 下記Front FCの変数に必要な情報を設定して、FC Functionに渡しています。
      • FUNCTION_COMPUTE_ENDPOINT
        Execution FCを呼び出す際に利用します。Function Computeの管理画面に記載されていて、Internet Endpoint / Intranet Endpoint があります。Intranet Endpointの利用を推奨します。
      • INVOKE_FC
        Execution FCの名前になります。
      • SLACK_CHANNEL
        文字列形式で、正当性確認用の情報で、指定されたSlack ChannelからのみSlash Commandのみ対応します。
      • SLACK_TOKEN
        文字列形式で、正当性確認用の情報で、指定されたSlackからのみSlash Commandのみ対応します。
      • ECS_CMD_CODE
        配列形式で、正当性確認用の情報で、指定されたSlash Commandのみ対応します。
  • Execution FC

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

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を開発する際には、fclifun というツールもありますので、ご興味ある方は是非一度触ってみてください。

最後

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1