Amazon S3 Event Notificationsを設定してみる



## Event Notifications

現在ラスベガスで開催されているAWS re:InventにてS3の新機能が発表されました。

* [【AWS発表】S3の新しいイベント通知機能](http://aws.typepad.com/aws_japan/2014/11/s3-event-notification.html)

* [Enabling Event Notifications](http://docs.aws.amazon.com/AmazonS3/latest/UG/SettingBucketNotifications.html)


S3にオブジェクトがアップロードされたり上書きした際に、通知を送ることができます。
通知は、Amazon SNS/ Amazon SQS/ AWS Lambdaの３つの方法で実行することができます。
（AWS Lambdaはまだプレビュー版で、使うにはManagementConsoleからリクエストを送る必要があります。）


既にいろんな人が試していると思いますが、SNSでの設定してみました。
ざっくりと３ステップで設定できます。ただ、僕はSNSのポリシー設定でハマりました・・・。
とにかく、やってみましょう。


## S3のバケットを作る

Tokyoリージョンで作ります。
S3とSNSのリージョンは同じである必要があります。

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/ccc336a3-86c3-19d7-e5ec-e40334430730.png "S3_Management_Console.png")



## SNSのトピックを作る

Tokyoリージョンを選択します。

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/c061803b-3ce9-c57f-961f-708fb232d6b9.png "S3_Management_Console.png")

![SNS_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/775ca96e-c854-a5cc-28c1-cf53d4384598.png "SNS_Management_Console.png")


Subscriptionを作成します。
EndpointにはSNSを受け取るメールアドレスを入力します。
通常のメール形式でも受け取れますが、今回はEMailJSONという形式を選択してみます。

![SNS_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/d57eda73-d68a-244b-5be1-b806b93c437f.png "SNS_Management_Console.png")

Subscriptionを作成すると、以下のような画面が表示されます。
設定したメールアドレスに認証用メールが届いているはずです。
SubscribeURLのリンクへアクセスして認証を完了します。

![SNS_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/d71c0f30-1ce3-9318-cf78-dd1e4c24b09f.png "SNS_Management_Console.png")


TopicActionボタンより、「View/Edit Topic policy」を選択します。

![SNS_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/57d5492e-0ae2-e5fa-da3f-9964104ce68a.png "SNS_Management_Console.png")


![SNS_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/f5c54d76-350e-1927-b3c1-2634a56ba0e7.png "SNS_Management_Console.png")

Condition以下を下記のように書き換えます。

```
"Condition": {
    "ArnLike": {
	  "aws:SourceArn": "arn:aws:s3:*:*:s3-event-test"
    }
```

## S3のEvents設定をする

Eventには ObjectCreated(ALL),Put,Post,Copy,ComputeMultiPatUploadの４種類選べます。
今回は全てのイベント（ALL）を選択しました。

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/52ede7fa-73f9-bfbd-91fa-f2d92c1bbcb2.png "S3_Management_Console.png")

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/43ea047a-4fa2-f980-a23b-956ea4ad384b.png "S3_Management_Console.png")


正常に保存できれば以下の様な感じになります。
エラーになる場合は、ポリシー設定周りを確認するのがいいかと思います。

![S3_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/8607/f68a0f65-90da-a84c-3be6-68c69f4ebc06.png "S3_Management_Console.png")


## 動作確認

あとはS3に適当なファイルをアップロードしています。
アップロード完了後、登録したアドレスにメールが届いていたら成功です。

こんな感じのJSONが届いています。

```
{
  "Type" : "Notification",
  "MessageId" : "5230ec36-054e-5b4a-9be2-a0e9c65627ab",
  "TopicArn" : "arn:aws:sns:ap-northeast-1~:s3-event-topic",
  "Subject" : "Amazon S3 Notification",
  "Message" : "{\"Records\":[{\"eventVersion\":\"2.0\",\"eventSource\":\"aws:s3\",\"awsRegion\":\"ap-northeast-1\",\"eventTime\":\"2014-11-14T08:44:08.186Z\",\"eventName\":\"ObjectCreated:Put\",\"userIdentity\":{\"principalId\":\"ACXAST529TQXX\"},\"requestParameters\":{\"sourceIPAddress\":\"10.115.144.24\"},\"responseElements\":{\"x-amz-request-id\":\"90BC3EA8CFE5595C\",\"x-amz-id-2\":\"UFr7b4eZQmPVauENR6Zb7zB40GrxhxMVUHLqhzq6sX3fNybfo/DV23yCNE0xEuQw\"},\"s3\":{\"s3SchemaVersion\":\"1.0\",\"configurationId\":\"upload-event\",\"bucket\":{\"name\":\"s3-event-test\",\"ownerIdentity\":{\"principalId\":\"ACXAST529TQXX\"},\"arn\":\"arn:aws:s3:::s3-event-test\"},\"object\":{\"key\":\"car.txt\",\"size\":120,\"eTag\":\"782a329be052f76a716f238ef7c69b52\"}}}]}",

  (省略)
}
```

以上。
Lambda Functionの実行も早く試してみたいですねー