はじめに
はじめまして。 中廣と申します。
ニフティ株式会社に中途入社して4年目になります。
私が所属しているチームでは、日々の運用作業をこなしつつ、並行して開発作業も行っていますが、開発作業に時間を取りたいので、運用作業はなるべく自動化若しくは簡易化を進めています。今回は、AWS Chatbot + AWS Lambda + Slackを利用して運用作業を簡易化した話を書きたいと思います。
とある運用作業の手順(簡易化前)
これまで手運用で実施していた運用作業の手順を以下に記します。
※ 実際の手順より簡略化しています。また、テーブル名・項目名は適当な値にしています。
依頼元より作業依頼を受ける
他部署より作業依頼をメールで受けます。
依頼内容と、対象データのキー(受付番号:HOGE_NO)が連携されます。
SQLを順番に実行する
作業用サーバからSQL実行環境へログインし、以下SQLを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-- テーブルAのデータを依頼元から連携された受付番号で検索し、 -- 現在登録されているデータを確認する&後続処理に必要な値を取得する SELECT HOGE_ID, HOGE_A, HOGE_B, HOGE_C, LAST_UPDATE FROM TABLE_A WHERE HOGE_NO = &HOGE_NO; -- テーブルAの値を更新する -- HOGE_A,HOGE_B の設定値は HOGE_C の値によって決まるため、手作業で設定する UPDATE TABLE_A SET HOGE_A = &VAL1, HOGE_B = &VAL1, LAST_UPDATE = SYSDATE WHERE HOGE_NO = &HOGE_NO; -- 更新後の値を確認するため、再度SELECT文を実行し、目視で確認する SELECT HOGE_ID, HOGE_A, HOGE_B, HOGE_C, LAST_UPDATE FROM TABLE_A WHERE HOGE_NO = &HOGE_NO; -- テーブルBのデータを受付番号で検索し、データがないことを確認する SELECT HOGE_NO,FUGA_A,FUGA_B,LAST_UPDATE FROM TABLE_B WHERE HOGE_NO = &HOGE_NO; -- テーブルBへデータを投入する -- FUGA_A, FUGA_B の値は HOGE_C の値によって決まるため、手作業で設定する INSERT INTO TABLE_B (HOGE_NO ,FUGA_A,FUGA_B,LAST_UPDATE) VALUES (&HOGE_NO, &VAL_3, &VAL_4, SYSDATE); -- テーブルBのデータを受付番号で再検索し、データが投入されていることを確認する SELECT HOGE_NO,FUGA_A,FUGA_B,LAST_UPDATE FROM TABLE_B WHERE HOGE_NO= &HOGE_NO; -- 問題なければコミットする COMMIT; |
APIを実行し、外部システムへ連携する
SQL更新後、APIを実行して外部システムへの連携を行います。
1 2 3 |
# HOGE_IDはテーブルA.HOGE_IDの値を設定する # VAL1, VAL2, VAL3 の値はテーブルA.HOGE_Cの値によって決まる curl "http://hogehoge/renkei?HOGE_ID=XXXXX&VAL1=XXX&VAL2=YYY&VAL3=ZZZ" |
…いかがでしょうか。
手順が決まっているとはいえ、なかなか面倒です。
また、すべて手作業なので作業漏れ・ミスにもつながります。
運用作業手順をもっと簡単にする
上記の手順を見ると、以下のことが分かります。
- 受付番号があればテーブルAのデータを特定できる
- 更新時に設定する値は、テーブルAを見ればわかる
- API連携する値はテーブルAを見ればわかる
…ということは、受付番号さえわかれば自動化できちゃいそうですね。
① 一連の作業を Lambda関数化する
ということで、上記の作業手順をLambda関数(hogehoge_operation)にまとめました。
(以下はサンプルなのでデータチェック・エラーハンドリングなどは一切考慮していません!!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
from lib.settings import session from lib.models import TableA,TableB import requests def lambda_handler(event, context): """ ほげほげ運用作業用Lambda関数(サンプル) """ # 受付番号を取得 hoge_no = event.get("hoge_no", "") # テーブルAのデータを取得 data = session.query(TableA).filter(TableA.hoge_no == hoge_no ).one_or_none() id = data.id hoge_c = data.hoge_c # テーブルAのデータを更新しつつ、テーブルBへ追加する値・API連携値を設定する if hoge_c == '1': data.hoge_a = 'hoge_a_1' data.hoge_b = 'hoge_b_1' fuga_a = 'fuga_a_1' fuga_b = 'fuga_b_1' val1 = 'val_1_1' val2 = 'val_2_1' val3 = 'val_3_1' else: data.hoge_a = 'hoge_a_0' data.hoge_b = 'hoge_b_0' fuga_a = 'fuga_a_0' fuga_b = 'fuga_b_0' val1 = 'val_1_0' val2 = 'val_2_0' val3 = 'val_3_0' data.last_update = dt.now() session.add(data) # テーブルBにデータ挿入 data2 = TableB( hoge_no= data.hoge_no, fuga_a = fuga_a, fuga_b = fuga_b, last_update = dt.now() ) session.add(data2) # コミット session.commit() # APIを叩いて外部連携する requests.get("http://hogehoge/renkei", params={"ID" : id, "VAL1" : val1, "VAL2" : val2, "VAL3" : val3,}) # 結果を返す return {"result" : "0"} |
この関数に引数 hoge_no を設定し実行することで、上述の運用作業を自動でやってくれるようになりました。これだけでだいぶ楽になりましたね。早速実行してみます。
1 2 3 4 5 6 7 |
PS C:hogehoge> aws lambda invoke --function-name hogehoge_operation --payload '{ "hoge_no": "xxxxxx" }' --cli-binary-format raw-in-base64-out response.json --profile profile_name { "StatusCode": 200, "ExecutedVersion": "$LATEST" } PS C:hogehoge> cat response.json {"result": 0 } |
応答結果がresponse.json に出力されています。問題なさそうですね。
…ただし、aws-cliがインストールされていない環境では実行できません。
さらに手軽に実行できるように、Lambda関数をSlack経由で呼び出せるようにしたいと思います。
② AWS Chatbot を利用してLambda関数をSlack経由で呼び出す
WebコンソールからAWS Chatbotを開き、Slack ワークスペースを追加します
チャットクライアントで「Slack」を選択し、「クライアントを設定」を押下すると、
認証画面へ遷移しますので、そのまま進めてください。
Slackワークスペースが作成されますので、「新しいチャネルを設定」ボタンを押下します。
設定画面から各種設定を行います。
チャネルID には、利用するSlackチャンネルのIDを入力します。
SlackのリンクURLを入力すると、チャネルID部分だけ切り取ってくれます。(便利)
アクセス許可には、適切なロールを設定しましょう。
チャネルロールは「テンプレートを使用してIAMロールを作成する」を選択し、
ポリシーテンプレートは「通常のアクセス許可」「Lambda呼び出しコマンドのアクセス許可」を選択します。
ここまで設定したら、利用するSlackチャンネルで以下を入力します。
/invite @aws
入力後、以下が表示されればOKです!
続けて、以下のコマンドを入力します。
@aws lambda invoke –payload {“hoge_no” : “xxxxx”} –function-name hogehoge_operation –region ap-northeast-1
実行確認のメッセージが通知されますので、「[Run] command」 を押下します。
押下すると、コマンドを実行した旨の通知と実行結果が返ってきました!
aws-cli を使わずに、SlackからLambda関数を呼び出すことができるようになりました!!
…が、毎回コマンドを入力するのも正直面倒ですよね。
更に運用を楽にするため、Slackワークフローを利用してみましょう!
③ Slackワークフローを利用してコマンドを実行する
Slackワークフロービルダーにて、以下のようなフローを作成します。
- チャンネルのショートカットから起動する
- フォームを作成し、受付番号(hoge_no)を入力できるようにする
- チャンネルにコマンドを送信する hoge_no は引数に指定する
送信するメッセージはこんな感じです。ほぼ入力していたコマンドそのままですが、
hoge_no は「変数を挿入する」からフォームの入力値を設定します。
公開をしたら早速ワークフローを実行してみます。
チャンネルから「てすと」ショートカットを選択します。
フォームが表示されますので、受付番号を入力し、「Submit」ボタンを押下します。
ワークフローからコマンドが送信され、引数付きでLambdaを実行することができました!
とある運用作業の手順(簡易化後)
上記①~③の対応を行ったことで、運用作業手順は以下になりました。
- 依頼元から作業依頼を受ける
- Slackのショートカットからワークフローを起動し、受付番号を入力して送信
- 結果を確認して終わり
簡易化前・後を比較するとだいぶやることが減りましたね♪
おわりに
いかがでしたか?
面倒な運用作業もAWS・Slackを利用することによって簡易化することができました。
是非参考になればと思います。