Amazon S3にドキュメントを置いたらLambda経由でSlackに通知させてみた

#やりたかったこと
**S3にファイルをアップロードしたタイミングでSlackに通知する仕組み**を作りました。
だいたい**1時間くらいで実装できます。**
実装後のイメージとして、まずはこんな感じにS3にファイルをアップロードします。
![UploadToS3.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/2357801e-16ab-8fd1-414b-904d414ea7d3.jpeg)
するとSlackに通知されます。
![UploadNotification.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/a6263955-e4f3-0264-9240-b161b0dac4c9.jpeg)
#仕組み
通知の仕組みを図で表すこんな感じです。
![S3toSlackOverview.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/6634ed75-b61d-a552-00e0-041c6a720d0a.jpeg)
**AWSのサービス間は連携が優れています。**この辺のサービスを作った結果の感想を[マイクロサービス否定派が変節した経験](http://qiita.com/FukuharaYohei/items/3c1b1b1b9283e45adad7)に書いています。
#Slack側設定
Slackの受信設定を[incoming webhook integration](https://my.slack.com/services/new/incoming-webhook/)から設定します。
投稿するチャネルを選択して"Add Incoming WebHooks integration"を押します。
![SlackWebhookSetting.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/180d92cb-63cb-651e-ae42-bb402b465246.jpeg)
そうすると、Webhook URLが発行されます。
![SlackWebhookResult.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/f2b15e0d-a606-fe0c-479a-8e519207ff9b.jpeg)
#AWS Lambda設定
AWS Lambda設定を簡単にスクリーンショットを貼っていきます。
###1. Select blueprint
blueprintからs3-get-objectを選択します。ここはpythonでもよかったのですが、特にこだわりなく選んでいます。
![S3toSlack.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/6957f380-8b80-77dc-480b-eb3de223eb5b.jpeg)
###2. Configure triggers
S3のBucket名とEven type(Put)を選択。
![S3toSlack_02.ConfigureTriggers.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/f5ca9d9d-e3bb-f0bd-5b8c-24dfcf275e4d.jpeg)
###3. Configure function
あとはその他の属性を入力します。
![S3toSlack_03.ConfigureFunction.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/1ef34c01-1e70-ff44-195d-db0645e8652c.jpeg)
![S3toSlack_03.ConfigureFunction2.jpg](https://qiita-image-store.s3.amazonaws.com/0/134273/37a4b8fe-a510-83ac-3173-9eef2d73ed46.jpeg)

#AWS Lambdaのコーディング
最後にコーディング。動けばいい程度の認識でコーディングしたので、正直、自信がありません(Node.jsはお遊び程度の知識しかないですし)。

```js:S3toPostSlack.js
'use strict';
console.log('Loading function');

let aws = require('aws-sdk');
let s3 = new aws.S3({ apiVersion: '2006-03-01' });

var url        = require("url");
var http       = require('http');
var https      = require('https');
var webhookUrl = url.parse("https://hooks.slack.com/services/<path>");

var webhookOptions = {
  hostname: webhookUrl.hostname,
  path:     webhookUrl.path,
  port:     443,
  method:   "POST",
  headers: { "Content-Type": "application/json"  }
};

exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));

    // Get the object from the event and show its content type
    const bucket = event.Records[0].s3.bucket.name;
    const key    = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    const size   = Math.floor(event.Records[0].s3.object.size / 1024);
    const params = {
        Bucket: bucket,
        Key: key
    };
    
    var filename = event.Records[0].s3.object.key;
    var payload = JSON.stringify({
        channel:    "#<channel name>",
        icon_emoji: ":paperclip:",
        username:   "S3 Backet:" + bucket,
        text:       key + "がアップロードされました:" + size + "MB"
      }); 
    
    console.log(payload);

    var req = https.request(webhookOptions, function(res) {
        res.setEncoding("utf8");
        res.on("data", function(chunk) {
          console.log(chunk);
          context.succeed();
        });
      }).on("error", function(e) {
        console.log("error: " + e.message);
      });
    req.write(payload);
    req.end();
    
    
    s3.getObject(params, (err, data) => {
        if (err) {
            console.log(err);
            const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
            console.log(message);
            callback(message);
        } else {
            console.log('CONTENT TYPE:', data.ContentType);
            callback(null, data.ContentType);
        }
    });
};
```

#参考
以下の記事も併せて参考になるかと思います。

- [マイクロサービス否定派が変節した経験](http://qiita.com/FukuharaYohei/items/3c1b1b1b9283e45adad7)
- [[AWS IoT] Kinesis Firehoseに連携しAmazon S3へ保管](http://qiita.com/FukuharaYohei/items/96699933fa7ff9247739)