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

**System ManagerでEC2とパトライトとの連携により監視チームの対応漏れを大幅に軽減①の続きです。**
## 設定、構築のポイント
３. Lambda関数、パトライトスクリプト作成部分
###### 
:::note warn
***事前設定***
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 }
```
:::note info
***パトライトシェルスクリプト***
実行する時、今の状態を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
```
:::note warn
パトライト側でrshサーバー接続許可が必要。
:::
![sssss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/15e15698-5cd3-8ef1-7662-71f8e0a1e971.png)

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