fu3ak1's tech days

何事もシンプルに。主にAWS関連の記事を書いています

ChatOpsの第一歩、Slack(Chatbot)経由でLambda関数を実行する

ChatOps=チャットで運用を行う という解釈のもと、その第一弾として、私もよく利用するSlack経由でLambda関数の実行をしてみたいと思います。 AWSにはChatbotというSlackとAWSを連携する機能があるので、それを利用してまずは単純なLambda関数の実行を実装してみます。

元々は通知機能がメインのChatbotでしたが、最近ではLambdaやEC2の操作も行えるようになっています。

AWSのbuilders.flashにもChatOpsの記事がありましたので参考までに貼っておきます。 aws.amazon.com

Chatbotのセットアップ

Chatbotのページに行き、クライアントを設定します。

f:id:fu3ak1:20201110225034p:plain

ブラウザでSlackにログインしていない場合は以下のようにSign in のページが表示されるので、ログインします。

f:id:fu3ak1:20201110225253p:plain

ログインしている場合は最初から以下のように連携のページが表示されるので許可します。

f:id:fu3ak1:20201110225439p:plain

ワークスペースが追加されるので、Chatbotを使用したいSlackのチャネルを設定します。

f:id:fu3ak1:20201110225653p:plain

今回私はchatbot-lambdaというSlackチャネルでChatbotを利用していきます。

f:id:fu3ak1:20201110225753p:plain

IAMロールはテンプレートから作成し、Lambda実行予定のため「Lambda呼び出しコマンドのアクセス許可」を追加しておきます。

f:id:fu3ak1:20201110225856p:plain

チャネルが設定できました。

f:id:fu3ak1:20201110235124p:plain

Slack側で動作確認してみます。まずは下記をSlack上で実行し、@awsユーザーをinviteします。

/invite @aws

invite後、以下のようにhelpを実行するとChatbotの色々な使い方が表示されます。

@aws help

lambdaのinvoke(呼び出し)もありますね。

f:id:fu3ak1:20201110230313p:plain

ここまででChatbotおよびSlackの準備は完了です。

Lambda関数の作成

今回はChatbotの実行を試すのがメインなので、関数の内容はとてもシンプルなものにしました。

ランタイムはPython3.8です。IAMロールはデフォルトでOK。

f:id:fu3ak1:20201110230618p:plain

関数のコードは以下のとおり。メッセージをreturnするだけです。

def lambda_handler(event, context):
    return {
        'message': 'Hello from Chatbot!'
    }

Chatbot(Slack)経由でLambda実行

Lambda関数ができたのでSlackから実行してみます。以下の通りメッセージを打ち込みます。初回はリージョン名を入力する必要がありました。

@aws lambda invoke --function-name ChatbotFunction --region ap-northeast-1

実行するかどうか聞かれるのでYesをポチっと押します。

f:id:fu3ak1:20201110234100p:plain

実行されたようです。Lambda関数に書いた「Hello from Chatbot!」もSlack上に表示されています。

f:id:fu3ak1:20201110235542p:plain

ちなみに2回目以降はリージョン指定が不要なことに加え、--function-nameは省略できたので以下でも実行できました。

@aws lambda invoke ChatbotFunction

まとめ

Slackから気軽にLambda実行、良いですね。この他にもChatbotの機能は多くありそうなので、本格的にChatbotを使用した運用も検討できそうです。 Chatbotに強い権限を渡して何でもできてしまうとそれはそれでセキュリティ的な問題にもなりそうなので、どこまでやるかは要検討ですね。

もうちょっと実際の運用で使えそうなChatbotのネタが無いか考えてみます。