toto_1212

技術のログをツラツラ書きます。自分用ですが参考にしていただけたら嬉しいです。間違ってたらドンドン突っ込んでください。

【AWS】EC2インスタンスが停止した時にS3へログを逃がすと同時にメールで通知

EC2が停止した時にログや特定ファイルをS3cmdを使ってS3へバックアップしたい場合があるかと思います。
ユースケースはAutoScaling収束時にターミネートされて自動消去されたくないファイルがそれにあたると思います。
※監査対応なんかではシビアにアクセスログが要求される場合があります。

停止をトリガーにメールを投げる仕組みも合わせて入れておくと、アップロードされたアクセスログと収束したインスタンスの紐づけがしやすくなるのかと思います。

環境:CentOS 6.4 64bit(Amazon Marketplace)
   S3backet名 cptest10


①S3cmdの環境を作成する。
過去エントリーのこちらを参照

CentOS 6.4だと以下で入ります。

$ cd /etc/yum.repos.d
$ curl -O http://s3tools.org/repo/RHEL_6/s3tools.repo
$ sed -i -e s/enabled=1/enabled=0/ /etc/yum.repos.d/s3tools.repo
$ yum install s3cmd --enablerepo=s3tools

②S3cmdの設定ファイルをリネームする。

$mv /root/.s3cfg /root/log2s3.cfg

③S3バックアップ用のシェルスプリクトを配置する。

$vi /root/log2s3.sh

#!/bin/sh
#cat /root/log2s3.sh

insid=$(curl http://169.254.169.254/latest/meta-data/instance-id)
s3cmd -c /root/log2s3.cfg put /var/log/messages s3://cptest10/${insid}_`date '+%Y%m%d%H%M%S'`

メタデータからインスタンスIDを取得し、その"ID_取得時間"をバケット内のファイル名としました。

④S3バックアップ用のシェルスプリクトのパーミッションを変更する。

$chmod 755 /root/log2s3.sh

次にメール通知の環境を作ります。
かっこよくSESとか使いたかったんですが、速効性を要求され取り急ぎssmtpとしました。

⑤ssmtpの環境を作る

$yum install make gcc openssl-devel
$wget http://ftp.de.debian.org/debian/pool/main/s/ssmtp/ssmtp_2.64.orig.tar.bz2
$tar jxf ssmtp_2.64.orig.tar.bz2 
$cd ssmtp-2.64/
$./configure --enable-ssl
$yum install make
$make install
$vi /usr/local/etc/ssmtp/ssmtp.conf

以下、confファイルですが、gmailsmtpサーバに指定してメールを出すことを想定しています。

#
# /etc/ssmtp.conf -- a config file for sSMTP sendmail.
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=hogehoge@gmail.com #送信先メールアドレス
# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=smtp.gmail.com:587 #smtpサーバ指定
AuthUser=hogehoge@gmail.com #送信先メールアドレス
AuthPass=password #smtp認証パスワード
UserSTARTTLS=YES #追記
AuthMethod=LOGIN #追記
FromLineOverride=YES #追記
# Where will the mail seem to come from?
rewriteDomain=gmail.com #外す
# The full hostname
hostname=gmail.com #追記

$ln -s /usr/local/sbin/ssmtp /usr/sbin/sendmail

宛先指定したメールフォーマットを作成する。
$vi /root/mail.txt

To: hogehoge@gmail.com
From: egohegoh@gmail.com 
Subject: stop ec2 instance

..

⑥メール配信用のシェルスプリクトを配置する。

$vi /root/ec2_stop_send.sh

#!/bin/sh
#cat /root/ec2_stop_send.sh

curl http://169.254.169.254/latest/dynamic/instance-identity/document/ >> /root/ec2_stop_send.txt

/usr/sbin/sendmail -t < /root/ec2_stop_send.txt

先ほどのメールフォーマットにメタデータを追記することで本文にメタデータ情報を載せます。

⑦メール配信用のシェルスプリクトのパーミッションを変更する。

$chmod 755 /root/ec2_stop_send.sh

停止時の処理(開始時もできます)に関連するのでrcスプリクトとして登録します。

⑧停止時にコマンドを発行できるようrcスプリクトを配置する。

$vi /etc/init.d/log2s3

#!/bin/bash
# chkconfig: 2345 99 10
# description: Backup to S3
# cat /etc/init.d/log2s3

. /etc/init.d/functions
prog=log2s3
send=ec2_stop_send
lock=/var/lock/subsys/$prog
exec=/root/${prog}.sh
exec1=/root/${send}.sh

case "$1" in
	start)
		touch $lock;
		;;
	stop)
		$exec
		$exec1
		rm -f $lock
		;;
esac

exit $?

⑨作成したrcスプリクトのパーミッションを変更する
$chmod 755 /etc/init.d/log2s3

⑩rcスプリクトの起動レベル設定とサービス開始する。

$chkconfig --add log2s3
$chkconfig log2s3 on
$/etc/init.d/log2s3 start

これで一連の設定は終了なので、一度動作確認のため停止をします。

指定したメール宛先の受信メールと指定したS3バケットを確認します。
S3バケットf:id:toatoshi:20131018141952j:plain

受信メールf:id:toatoshi:20131018142002j:plain

スプリクトは色々書き方があると思うので、必要と思われる情報を取得するように
書き換えてもらえればと思います。

注意点としては通常のインスタンにこのロジックを搭載すると、意図せずコピーやメール送信が行われてしまうのでご注意ください。
※S3は課金されてしまいます。