limitusus’s diary

主に技術のことを書きます

EBSがattachされたらSlackに通知する仕組みを作った

AWS Lambdaを以前から使ってみたいなあと思っていたのですが、「何かの操作にhookする」というので試してみました。

今回は「任意のEBS VolumeがEC2 instanceにattachされたら(AttachVolume)Slackのwebhookを叩いて通知する」というのをやってみました。

Pythonを利用しています
https://gist.github.com/limitusus/59640fc2a9b2bbaf6941

だいたいよく利用されそうな情報は変数に放り込んだので、ちょっとコードをいじれば「特定のVolumeだけ」とか「特定のinstanceだけ」とかも簡単に実現できます。

仕組み

  • CloudTrailを有効にし、SNS通知を有効にする
  • SNS topicにはLambdaを登録しておく
  • Lambda(上URL)ががんばって通知する

気付いたこと

  • Lambdaに最初に渡ってくるイベント通知は小さく、CTのBucketにgzがあるのでそれを取りにいく処理が必要(boto3が使える)
    • Lambdaが実行されるroleにS3アクセスの権限が必要なことに注意
  • gzファイルの展開時もファイルに書き出すような操作はIOErrorとなる。Lambdaの世界ではインメモリで処理する必要がある
  • attachされた時刻が入っているが、UNIXTIMEのミリ秒表記なのでtime.gmtimeに渡すときは1000で割る
  • LambdaのスクリプトはWeb画面でも編集できるがテストしにくいしエディタも慣れたものを使った方がいい
    • ローカルで開発するときは更新をawscliでできるので、以下のようなスクリプトを書いておくと簡単にデプロイできる
#!/bin/sh

zip -r ebsattached.zip ebsattached.py
aws --region us-east-1 lambda update-function-code \
    --function-name "arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:ebsattached" \
    --zip-file "fileb://ebsattached.zip"
echo "Deployed"