AWS Lambdaでs3のuploadで関数実行、さらにそれを読み込む



# やりたいこと

- ファイル(file Aとする)をS3のあるディレクトリにおいたときにlambda functionの発火
- file Aがjsonで、そのファイル内のjsonを取得する。

この2点を満たすlambda functionを作りたいと思います。



# 環境など

言語のランタイムとしてはNodeJSを使うことにします。
今回は、特にフォルダをきって、その中でいろいろファイルを作るということはしません。
AWSの管理コンソールからぽちぽち設定して、コードを書いて、実施する！
というシンプルな方法をとろうと思います。

+ AWS Lambdaの管理よりLambda functionの作成/コードを登録
+ S3で、イベントの登録
+ Lambda function実行


# AWS Lambdaの管理よりLambda functionの作成/コードを登録

### 作業場所: AWS LAmbda

AWSのLambda functionの設定を行います。
言語はNodeJsかNode.js 4.3を選んでください。
Blue Printは特に選びません。
以下のような画面がでますが、ここでS3のイベントは設定しなくても大丈夫です!

![スクリーンショット 2016-08-04 22.42.08.png](https://qiita-image-store.s3.amazonaws.com/0/88357/bceeb872-ff3b-843e-d1a3-c6afc6f653e3.png)

何も操作せず、Nextをクリックしましょう。

NameやDescriptionは適当に登録してください。

コードを入力するところで以下のコードをコピペしてください。

```js

var aws = require('aws-sdk');
var s3 = new aws.S3();

exports.handler = function(event, context) {
   var bucket = event.Records[0].s3.bucket.name;
   var key = event.Records[0].s3.object.key;
   s3.getObject({
       Bucket:bucket,
       Key:key
   },
    function(err,data) {
        if (err) {
               console.log('error getting object ' + key + ' from bucket ' + bucket + 
                   '. Make sure they exist and your bucket is in the same region as this function.');
               context.done('error','error getting file'+err);
            }
            else {
                console.log(String(data.Body)); // 文字列にする。
                console.log(JSON.parse(String(data.Body))); // jsonとしてパース
                // var json = JSON.parse(String(data.Body);
                // とすれば、objectとしてコードで操作可能
            }
        }
   );
};
```

## コードのポイント
- aws-sdkを使う
- s3.getObject()
- jsonのパース

js強者の方には説明が不要かもしれませんが、上記の三点を行う必要があります。
`data.Body` では訳のわからない文字列が出力されるので、 `String()` で文字列に変換します。
これだけだと、文字列に過ぎないので、 `JSON.parse(String(data.Body)` とすることでjavascriptで操作可能なobjectとなります。

コードを入力すると以下の項目があります。

![スクリーンショット 2016-08-04 22.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/88357/89a50780-e8ab-0863-6ed2-6369d5510788.png)

ここでは、このLambda functionの権限を設定します。
以下のようにs3-object read-only permissionを設定します。Role nameも忘れずに入力しましょう。

![スクリーンショット 2016-08-04 22.50.34.png](https://qiita-image-store.s3.amazonaws.com/0/88357/a758337a-2805-115b-8c56-1b9bbcb5c386.png)


# S3でのイベントの登録
今回どこにファイルを置いたら、上記のLambda functionが発火するか、まだ設定してません。これはS3の画面で設定できます。

あるバケットである特定のprefixを持つファイルを置かれたら、発火するように設定しましょう。
まず目的のbucketのディレクトリに行きます。
そして以下のボタンが画面上部にあると思うので、プロパティを押します。

![スクリーンショット 2016-07-28 16.07.07.png](https://qiita-image-store.s3.amazonaws.com/0/88357/bbb3129d-8f52-3504-8239-8f6bb1c3b172.png)

「イベント」というのがあるので、ここから情報を入力していきます。

![スクリーンショット 2016-08-04 22.53.58.png](https://qiita-image-store.s3.amazonaws.com/0/88357/a9c1c134-676d-884e-ebad-28aaf0d01a99.png)

名前はこのLambda functionのS3上のでの区別をつけるために使用します。なので,どういうlambda functionが発火するか分かりやすい名前が良いでしょう。

次にeventを設定します。Putを選びます。
プレフィックス、サフィックスはおまかせです。

送信先は「Lambda関数」を選び、先ほどLambda上で登録した関数名を選びます。そしたら保存です。

# 完成!

実際、登録したbucketにfileを置くと（中身はjsonにしましょう）、Lambda functionが実行されると思います。結果は
Lambda上の「view logs in CloudWatch」より確認できます。

![スクリーンショット 2016-08-04 22.58.04.png](https://qiita-image-store.s3.amazonaws.com/0/88357/1bb65dd2-742f-55aa-11e5-c550fc694d43.png)