System ManagerでEC2とパトライトとの連携により監視チームの対応漏れを大幅に軽減①の続きです。
設定、構築のポイント
3. Lambda関数、パトライトスクリプト作成部分
事前設定
SSM RunCommand実行が必要ですので、「AmazonSSMFullAccess」ポリシーをEC2にアタッチしておいてください。
@aws-sdk/client-ssm、mailparserのnode.jsライブラリはLambda関数のレイヤーに事前インポートしておいてください。
仕様としては、★監視NG! から始まるメール件名であれば、パトライト赤点灯をし、◎監視復旧! から始まるメール件名であれば、緑点灯をします。
実際の運用に従い、点灯仕方、鳴らす方法を決める方が良いです。
index.mjs
import { SendCommandCommand } from "@aws-sdk/client-ssm";
import { ssmClient } from "./ssmClient.mjs";
import { simpleParser } from "mailparser";
export const handler = async (event) => {
console.log("request:", JSON.stringify(event, undefined, 2));
let res = "0"
let command = "sh patlite.sh 192.168.100.5 "
let params = {
DocumentName: 'AWS-RunShellScript',
InstanceIds: ['i-************'],
Parameters: {
commands: [
"cd /usr/lib/zabbix/alertscripts"
],
},
CloudWatchOutputConfig: {
CloudWatchLogGroupName: '/aws/lambda/S3toPatlite',
CloudWatchOutputEnabled: true
},
TimeoutSeconds: 3600
}
const SES_message = event["Records"][0]["Sns"]["Message"];
const SES_message_json = JSON.parse(SES_message);
const SES_message_content = SES_message_json["content"];
const email_message = await simpleParser(SES_message_content);
console.log("email_message start --------");
console.log(
"Received email_message:",
JSON.stringify(email_message, null, 2)
);
console.log("email_message end --------");
const email_from = email_message.from.value[0]["address"];
console.log(email_from);
const email_date = JSON.stringify(email_message.date).replace(/"/g, "");
console.log(email_date);
const email_subject = email_message.subject;
console.log(email_subject);
const email_content = email_message.text;
console.log(email_content);
if (email_subject.startsWith('★監視NG! 【' )){
console.log("★監視NG!");
res = "4"
} else if (email_subject.startsWith('◎監視復旧! 【')){
console.log("◎監視復旧!");
res = "1"
} else {
console.log("何もない");
}
if(res != 0){
params.Parameters.commands[1] = command + res;
console.log(params);
try {
const response = await ssmClient.send(new SendCommandCommand(params));
console.log("Successfully call shell patlite.sh.");
} catch (error) {
console.log("Error", error);
}
}
};
ssmClient.mjs
import { SSMClient } from "@aws-sdk/client-ssm"
const REGION = "ap-northeast-1"
const ssmClient = new SSMClient({ region: REGION })
export { ssmClient }
パトライトシェルスクリプト
実行する時、今の状態をClearしてからRSHコマンドを実行する。15秒継続してまた元の状態(消灯)に戻すという設計となります。
#!/bin/sh
user=root
notclassified=000000
information=001000
warning=010000
average=100000
high=111001
disaster=222002
ipaddress=$1
severity=$2
case $severity in
0)
options=$notclassified;;
1)
options=$information;;
2)
options=$warning;;
3)
options=$average;;
4)
options=$high;;
5)
options=$disaster;;
*)
options=000000;;
esac
/usr/bin/rsh $ipaddress -l $user clear
/usr/bin/rsh $ipaddress -l $user alert $options 15
パトライト側でrshサーバー接続許可が必要。
まとめ
簡単ながら障害メール受信から、パトライト点灯、鳴らすまでの設計、構築方法を解説いたしました。
実際の運用状況に従い、パトライトを点灯したり、鳴らしたりすることを変更する場合はあると思いますが、実際のパトライトの取扱い説明書の通り、RSHコマンドを設定いただければOKです。