どうも、cloudpack の 自称 Amazon 芸人に弟子入りしたい かっぱ (@inokara) です。好きなサービスは SQS です。
はじめに
AWS ファン涎垂のイヴェント re:Invent では今年も様々な新しいサービスが公開されましたね。Code 三兄弟やコンテナサービス、Lambda 等…イノベーションスゴイなあと眠い目をこすりながらキーノートを見て(英語は判らないけどね…)いました。そんな新しいサービス発表の影に隠れて…はいないですが Amazon S3 に新しい機能が追加されました。
詳しい内容は上記のブログをご一読頂ければと思いますが、ザックリ言うと S3 にファイルをアップしたりしたら通知してくれまっせ…という機能だと思っています。
おお、これって従来はアプリケーション側で独自で実装して通知を飛ばしていたことを AWS がやってくれたんとちゃいまっかってことでこれを利用してちょっと遊んでみたいと思います。
参考
何をやるか?
画像をアップしたら拡張子を判断して LED ライトを点滅又は点灯させますwww
ただそんだけです。
イベント通知機能の設定
ということでやってみましょう。
バケットの作成
inokappa って作ってみました。
SNS の Topic Policy の設定
SNS で Topic Policy を下図のように設定します。
SourceArn
に "arn:aws:s3:::${バケット名}"
を指定しましょう。
Event の設定
S3 のコンソールに戻って Event の設定をしましょう。
SNS topic
をチェックして SNS topic
のプルダウンから先ほどポリシーを設定したトピックを指定して Save
です。
超カンタンですね。
テスト
既に指定した SNS topic
は通知先として SQS のキューが指定していますのでファイルをアップすると以下のような通知が SQS に蓄積されます。
{ "Type" : "Notification", "MessageId" : "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxx", "TopicArn" : "arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:kappa-test", "Subject" : "Amazon S3 Notification", "Message" : "{"Records":[{"eventVersion":"2.0","eventSource":"aws:s3","awsRegion":"ap-northeast-1","eventTime":"2014-11-14T15:11:39.680Z","eventName":"ObjectCreated:Put","userIdentity":{"principalId":"xxxxxxxxxxxxxxx"},"requestParameters":{"sourceIPAddress":"xxx.xxx.xxx.xxx"},"responseElements":{"x-amz-request-id":"C88E4EAE1BFD25B9","x-amz-id-2":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},"s3":{"s3SchemaVersion":"1.0","configurationId":"test","bucket":{"name":"inokappa","ownerIdentity":{"principalId":"AINVMR4XYD5YD"},"arn":"arn:aws:s3:::inokappa"},"object":{"key":"2014060609.png","size":17743,"eTag":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}}}]}", "Timestamp" : "2014-11-14T15:11:39.910Z", "SignatureVersion" : "1", "Signature" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-xxxxxxxxxxxxxxxxxx.pem", "UnsubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:xxxxxxxxxxxxxxxxxx:kappa-test:xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxx" }
ということで…
やりたいこと
以下のようなことをやらせてみたいと思います。
- S3 にアップしたファイルの拡張子が png であればラズパイにつないだ LED を点滅させる
- S3 にアップしたファイルの拡張子が jpg ならば LED を点灯させる
JSON があればーなんでも出来る(アン◯ニオ猪木風)
上記の通知内容の Message
を見るとアップロードしたファイル名(2014060609.png
)が含まれていることが判ります。しかも Message
の値は普通に JSON ですよねってことでファイル名を取り出す為に以下のように書きました。(お知らせが遅くなりましたが Ruby でやってみました)
recieve = JSON.load(msg.body) message = recieve['Message'] records = JSON.load(message) obj = records['Records'][0]['s3']['object']['key']
obj
にファイル名が入るはずです…。もっと良い方法があれば嬉しいです…。
スクリプト
後はラズパイで LED をチカチカさせる方法さえ追加すれば出来上がりです。
スクリプトは上記にアップしました。
デモ
以下のようにスクリプトを実行します。
sudo ./s3-event.rb
ということで…
re:Invent で発表になった各サービスの今後の発展を祝して S3 のイベント通知機能とラズパイを利用して遊んでみました。今回は LED をチカチカさせるだけでしたが、画像をアップしたら自動でダウンロードして適切なサイズに整形してフォトフレームっぽく表示させるようなものをラズパイで作れそうな気がします。あとは、音声ファイルをアップしてラズパイで任意のタイミングで再生させたりと面白いことが出来そうですね。
ということで、おやすみなさい。
元記事はこちらです。
「AWS 白帯シリーズ(22)祝:新機能!Amazon S3 Event Notifications 機能を SNS/SQS とラズパイで 256 倍楽しく使う」