どうも、cloudpack の 自称 Amazon 芸人に弟子入りしたい かっぱ (@inokara) です。好きなサービスは SQS です。

はじめに

AWS ファン涎垂のイヴェント re:Invent では今年も様々な新しいサービスが公開されましたね。Code 三兄弟やコンテナサービス、Lambda 等…イノベーションスゴイなあと眠い目をこすりながらキーノートを見て(英語は判らないけどね…)いました。そんな新しいサービス発表の影に隠れて…はいないですが Amazon S3 に新しい機能が追加されました。

詳しい内容は上記のブログをご一読頂ければと思いますが、ザックリ言うと S3 にファイルをアップしたりしたら通知してくれまっせ…という機能だと思っています。

おお、これって従来はアプリケーション側で独自で実装して通知を飛ばしていたことを AWS がやってくれたんとちゃいまっかってことでこれを利用してちょっと遊んでみたいと思います。

参考

何をやるか?

画像をアップしたら拡張子を判断して LED ライトを点滅又は点灯させますwww
ただそんだけです。

イベント通知機能の設定

ということでやってみましょう。

バケットの作成

Amazon S3 イベント通知機能の設定 (1): バケットの作成

inokappa って作ってみました。

SNS の Topic Policy の設定

SNS で Topic Policy を下図のように設定します。
Amazon S3 イベント通知機能の設定 (2): SNS の Topic Policy の設定

SourceArn"arn:aws:s3:::${バケット名}" を指定しましょう。

Event の設定

S3 のコンソールに戻って Event の設定をしましょう。
Amazon S3 イベント通知機能の設定 (3): 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

そして…PNG ファイルをアップロード。
Amazon S3 イベント通知機能の動作確認 (pngアップロード版): S3バケットにpngファイルをアップロード

以下のように点滅します。
Amazon S3 イベント通知機能の動作確認 (1): Raspbrry Pi につないだLEDが点灯Amazon S3 イベント通知機能の動作確認 (2): Raspbrry Pi につないだLEDが点灯Amazon S3 イベント通知機能の動作確認 (3): Raspbrry Pi につないだLEDが点灯Amazon S3 イベント通知機能の動作確認 (4): Raspbrry Pi につないだLEDが点灯

ついでに…JPEG ファイルをアップロード。
Amazon S3 イベント通知機能の動作確認 (jpgアップロード版): Amazon S3 バケットにjpgファイルをアップロード

以下のように点灯します。
Amazon S3 イベント通知機能の動作確認 (jpgアップロード版): Raspbrry Pi につないだLEDが点灯
おおっ。

ということで…

re:Invent で発表になった各サービスの今後の発展を祝して S3 のイベント通知機能とラズパイを利用して遊んでみました。今回は LED をチカチカさせるだけでしたが、画像をアップしたら自動でダウンロードして適切なサイズに整形してフォトフレームっぽく表示させるようなものをラズパイで作れそうな気がします。あとは、音声ファイルをアップしてラズパイで任意のタイミングで再生させたりと面白いことが出来そうですね。

ということで、おやすみなさい。

元記事はこちらです。
AWS 白帯シリーズ(22)祝:新機能!Amazon S3 Event Notifications 機能を SNS/SQS とラズパイで 256 倍楽しく使う