【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ファイルですが、gmailをsmtpサーバに指定してメールを出すことを想定しています。 # # /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バケット
受信メール
スプリクトは色々書き方があると思うので、必要と思われる情報を取得するように
書き換えてもらえればと思います。
注意点としては通常のインスタンにこのロジックを搭載すると、意図せずコピーやメール送信が行われてしまうのでご注意ください。
※S3は課金されてしまいます。