0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

System ManagerでEC2とパトライトとの連携により監視チームの対応漏れを大幅に軽減②

Last updated at Posted at 2024-05-22

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サーバー接続許可が必要。

sssss.png

まとめ

簡単ながら障害メール受信から、パトライト点灯、鳴らすまでの設計、構築方法を解説いたしました。
実際の運用状況に従い、パトライトを点灯したり、鳴らしたりすることを変更する場合はあると思いますが、実際のパトライトの取扱い説明書の通り、RSHコマンドを設定いただければOKです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?