Slack の Slash Command で AWS の EC2 と RDS の起動と停止を実現してみた (2) Lambda 関数と API の準備

Slack の Slash Command で AWS の EC2 と RDS の起動と停止を実現してみた (2) Lambda 関数と API の準備

こんにちは、kenzauros です。

本記事は Slack の Slash Command で AWS の EC2 と RDS の起動と停止を実現してみた (1) 導入 の続きです。やりたいことや前提条件は前回の記事を参照してください。

Lambda 関数の準備

EC2 と RDS を制御するスクリプトの実体を Lambda 関数で作成します。

  • Lambda 関数の名前 : slack-hoge-staging-control
  • ランタイム (言語) : Node.js 8.10 (おそらく今回のスクリプトは Node.js 6 系でも動作します)

希望のリージョンで AWS Lambda の関数ページを開き、 [関数の作成] ボタンを押します。

[一から作成] で必要事項を入力します。 IAM ロールには 前述 のとおり EC2 と RDS の制御権限をもつロールを指定します。

aws ec2 rds instance control via slack slash command 2 1

入力できたら [関数の作成] を押し、関数が作成されたら、インラインエディターに index.js の中身を貼り付けます。ソースコードは こちらの gist に置いています。

aws ec2 rds instance control via slack slash command 2 2

次にインラインエディターの下にある [環境変数] に EC2, RDS のリージョンとインスタンス ID などを指定します。

キー
EC2_REGION us-east-1
EC2_INSTANCE_ID i-0cf8df09567e2hoge
DB_REGION us-east-1
DB_INSTANCE_ID hogehogedb
SLASH_COMMAND_TOKEN Slash Command のトークン (後で設定)

aws ec2 rds instance control via slack slash command 2 3

今回の関数で実行するのは開始と停止の「指示」だけなので、応答は比較的すぐに返ってきますが、Lambda 関数がタイムアウトしてしまうのを防ぐため、基本設定で [タイムアウト] を 10 秒程度にしておきます。

aws ec2 rds instance control via slack slash command 2 4

ここまで終わったら、 [保存] を押して、 Lambda 関数を一旦保存しておきます。

API の準備 (API Gateway)

API キーについて

API Gateway で API を公開するときは、不正呼び出しを防ぐため、 API キーを作成し、 x-api-key ヘッダーにそのキーを渡して呼び出してやるのが望ましいと考えられます。

ただ、 Slash Command からの呼び出しでは リクエストヘッダーを設定できないため、今回は Slash Command から渡された “Slash Command のトークン” を API では検証せずに Lambda 関数にパススルーし、 Lambda 関数内で検証するようにしています。

API の作成

API Gateway のページを開き、 [APIの作成] ボタンから Lambda 関数と同名の API を作成します。

aws ec2 rds instance control via slack slash command 2 5

リソース / の [アクション] から [メソッドの作成] を選択します。

aws ec2 rds instance control via slack slash command 2 6

メソッドには “GET” を選択し、[チェックマーク (OK)] を押します。

aws ec2 rds instance control via slack slash command 2 7

※ちなみにここでは GET にしましたが、 Slash Command は POST がデフォルトですし、 URL にトークンが載ってくるので、 POST のほうがいいかもしれません。いずれにしても API Gateway の設定と Slash Command の設定を合わせてください。

[GET のセットアップ] で下記のように設定して保存します。

  • 統合タイプ : Lambda 関数
  • Lambda プロキシ統合の使用 : オフ
  • Lambda リージョン, 関数 : さきほど作成した Lambda 関数のリージョンと関数名

aws ec2 rds instance control via slack slash command 2 8

確認ダイアログが表示されるので、 [OK] を押します。

aws ec2 rds instance control via slack slash command 2 9

これで API GET / の枠組みが作成されました。

URL パラメーターの設定

Slash Command からのパラメーターを受け取る URL パラメーター (<APIのURL>/?text=hogehoge この ?text=hogehoge の部分) を設定します。

GET メソッドの設定で [メソッドリクエスト] をクリックします。

aws ec2 rds instance control via slack slash command 2 10

[リクエストの検証] で “クエリ文字列パラメータおよびヘッダーの検証” を選択し、 [URL クエリ文字列パラメータ] に texttoken を追加して、両方とも必須に設定します。

aws ec2 rds instance control via slack slash command 2 11

text は Slash Command を実行したときに /hoge-staging ほげ と書いたときの “ほげ” 部分がやってくるパラメーターです。

token はその名の通り、Slash Command のトークンがやってきます。

パラメーターのマッピング設定

URL パラメーターで送信されてきた texttoken を Lambda 関数のイベント引数に渡すため、マッピングテンプレートを追加します。

GET メソッドの設定に戻り、 [統合リクエスト] をクリックします。

aws ec2 rds instance control via slack slash command 2 12

マッピングテンプレートのところで「テンプレートが定義されていない場合 (推奨)」を選択し、 [マッピングテンプレートの追加] を押して、 Content-Type に application/json を入力して、チェックマーク (OK) を押します。

aws ec2 rds instance control via slack slash command 2 13

表示されたテンプレート部分に下記のコードを貼り付け、 [保存] を押します。この指定で、URL パラメーターの texttoken がそれぞれ Lambda 関数のイベント引数 のtexttoken に渡されます。

{
   "token": "$input.params('token')",
   "text": "$input.params('text')"
}

aws ec2 rds instance control via slack slash command 2 14

API のデプロイ

URL を発行するため、 API をデプロイします。

リソース / の [アクション] から [API のデプロイ] を選択します。

aws ec2 rds instance control via slack slash command 2 15

デプロイされるステージに「新しいステージ」を選択し、ステージ名を適当につけて [デプロイ] をクリックします。このステージ名が URL の一部になりますが、特にこだわりがなければ、なんでもかまいません。

aws ec2 rds instance control via slack slash command 2 16

デプロイが完了すると API の URL が生成されます。この URL をコピーしておきます。

aws ec2 rds instance control via slack slash command 2 17

これで API の準備は完了です。

いよいよ Slack 側で Slash Command を作成していきます。

次の記事: (3) Slash Command の作成とテスト へ

参考リンク

kenzauros