AWSのboto3を使ってサーバのコマンド結果をメールに飛ばしてた。


やりたいこと


  1. AWS上のEC2(Linux)で一定時間毎に自動的にコマンドを叩く。

  2. コマンドの標準出力をメールで飛ばす。ついでにSQSにも連携しとく。


方法


  • pythonのboto3を用いて、SNSでメールを飛ばす。

  • SQSへはSNSのサブスクリプションで連携する。


前提


  • EC2を立てる(ここでのサーバはRHEL系を想定してます。)

  • EC2にaws cli、python3、boto3のインストール。

  • aws configureでユーザ認証。

  • SNSでトピック及びサブスクリプション作成。

  • SQSでキュー作成。


コード

EC2上で以下のスクリプトを作成。

実行するコマンドやSNSのトピックはXXXXX表記ですので、適宜置き換えて下さい。あと、変数はテキトーです(笑)。

### send_msg.py ###

import boto3
import subprocess
import shlex
import time

# SNSのトピックのARNを記載
sns = boto3.resource('sns')
topic = sns.Topic('arn:aws:sns:ap-northeast-1:XXXXXXXX:topic-name')

# 出力させたいコマンドを指定
cmd = "XXXXXXX"
sos = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE)

# 標準出力の場合
tenpura = sos.stdout.read()

# 文字コードを「UTF-8」に指定
sushi = tenpura.decode("UTF-8")

response = topic.publish(
Message = sushi)
print(response)

#ループ処理(ここでは1分毎に定期実行)
while True:
response = topic.publish(
Message = sushi)
print(response)
time.sleep(60)


参考にしたもの

以下参考にさせていただきました。ありがとうございました。

AWS SDKを使ってSNSにCPU使用率を送りつける

boto3 (AWS SDK for Python) メモ - Qiita

boto3を使ってAmazon SNSへpublishしてみた | DevelopersIO