SlackでAWS Lambdaを実行してみた

2021.06.05

こんにちは、ジョン・ヒョンジェです。

今回はAWS LambdaをSlackで実行する方法について説明します。

はじめに

AWS ChatbotはSlackやAmazon ChimeとAWSサービスを連携することができるサービスです。

AWS Chatbotを使うことで

  • CloudWatchやBudgets等からのアラートの受信
  • AWS Lambda関数の呼び出し
  • AWS サポートケースの作成
  • 診断情報の取得

などの作業をSlackチャンネルやAmazon Chimeチャットルームですることができます。

以下ではSlackでAWS Lambda関数を呼び出す方法についてご紹介します。

SlackでLambda関数を実行してみよう

EC2インスタンスを起動・停止するLambda関数をSlackで実行してみます。

AWS ChatbotにSlackチャンネルを設定する

まず、AWS ChatbotにSlackのチャンネルを設定する必要があります。

AWS ChatbotのコンソールでSlackのワークスペースを登録して、「新しいチャンネルを設定」をクリックします。

設定名と設定するSlackチャンネルのIDを入力します。

そして、IAMロールを作成します。ポリシーテンプレートは現時点(2021/06)では以下があります。

  • 通知のアクセス許可
  • 読み取り専用コマンドのアクセス許可
  • Lambda呼び出しコマンドのアクセス許可
  • AWSサポートコマンドのアクセス許可
  • Incident Managerのアクセス権限

ここで読み取り専用コマンドのアクセス許可Lambda呼び出しコマンドのアクセス許可を選択します。

そして、「設定」ボタンをクリックします。

ここまですると、設定したSlackのチャンネルでAWS Chatbotを使うことができます。

設定したSlackのチャンネルで/invite @awsと入力してAWS Chatbotを招待します。

AWS Chatbotへの命令は全て@awsで始めます。@aws helpコマンドでChatbotで可能な機能を確認してください!

Lambda関数作成

今、実行中のEC2インスタンスが一つあります。

じゃ、このインスタンスを起動・停止するLambda関数を作成しましょう。

Lambdaコンソールに移動して、start-ec2-instancestop-ec2-insatnce二つの関数を作成します。 関数のランタイムは「Python3.6」で設定します。

そして、IAMコンソールに移動して、二つのLambda関数のIAMロールにAmazonEC2FullAccessポリシーを追加します。

では、各Lambda関数にコードを入力しましょう。

start-ec2-instance
import boto3

region = 'your-region'
instances = ['ec2 instance id']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)   # start instance
    print('started your instances: ' + str(instances))
stop-ec2-instance
import boto3

region = 'your-region'
instances = ['ec2 instance id']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)    # stop instance
    print('stopped your instances: ' + str(instances))

boto3はPythonでAmazon S3, Amazon EC2, Amazon DynamoDBなどのAWSサービスを使うことができるライブラリです。 regioninstances変数には自分のEC2インスタンスがあるリージョンとインスタンスIDを入力してください。

入力が終わったら、「Test」ボタンをクリックしてEC2インスタンスの起動・停止がちゃんとできるかを確認します。そして、「Deploy」ボタンをクリックします。

では、全ての準備は完了です。SlackでこのLambda関数を実行してみましょう。

SlackでLambda関数を実行する

先ほど実行中のEC2インスタンスを停止してみます。

まず、Chatbotに設定したSlackチャンネルに@aws lambda --helpコマンドを入力して、可能なコマンドを確認します。その中で、invokeコマンドを使ってLambda関数を実行することができます。

@aws lambda invoke stop-ec2-instance --region your-region

このようにコマンドを入力して、送信してみましょう。最初にリージョンをコマンドに入力すると、Chatbotはそれを記憶し、次の命令からはリージョンを書く必要がありません。

送信すると、Chatbotから「Would you like me to do so?」という確認メッセージがきます。「Yes」をクリックします。

このように、「StatusCode: 200」という内容のメッセージがきたら、Lambda関数の実行は成功です。

では、実際にEC2インスタンスの状態を確認してみましょう。

EC2コンソールでインスタンスが「停止済み」状態になっていることを確認することができます。

Slackで

@aws describe-instance-status --instance-ids your-instance-id

コマンドを使ってインスタンスの状態を確認することもできます。

同じ方法でstart-ec2-instance関数を実行してインスタンスを起動してみてください!!

感想

AWS Chatbotを利用して、SlackでLambda関数を実行してみました。

簡単に設定することができ、チャットの形式でAWSサービスが使えるので、とても便利なサービスだと思います。料金も無料なので、気軽に試してみたらどうでしょうか。

しかし、まだAWS ChatbotとSlackを連携してできるコマンドはほとんど「読み取り」の機能で、新しいリソースを作成したり、削除したりする機能はできませんので、ご参考ください!

以上です!