6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-04

やりたいこと

  • ファイル(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

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

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

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


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

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

スクリーンショット 2016-08-04 22.50.34.png

S3でのイベントの登録

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

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

スクリーンショット 2016-07-28 16.07.07.png

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

スクリーンショット 2016-08-04 22.53.58.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

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?