やりたいこと
- ファイル(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のイベントは設定しなくても大丈夫です!
何も操作せず、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となります。
コードを入力すると以下の項目があります。
ここでは、このLambda functionの権限を設定します。
以下のようにs3-object read-only permissionを設定します。Role nameも忘れずに入力しましょう。
S3でのイベントの登録
今回どこにファイルを置いたら、上記のLambda functionが発火するか、まだ設定してません。これはS3の画面で設定できます。
あるバケットである特定のprefixを持つファイルを置かれたら、発火するように設定しましょう。
まず目的のbucketのディレクトリに行きます。
そして以下のボタンが画面上部にあると思うので、プロパティを押します。
「イベント」というのがあるので、ここから情報を入力していきます。
名前はこのLambda functionのS3上のでの区別をつけるために使用します。なので,どういうlambda functionが発火するか分かりやすい名前が良いでしょう。
次にeventを設定します。Putを選びます。
プレフィックス、サフィックスはおまかせです。
送信先は「Lambda関数」を選び、先ほどLambda上で登録した関数名を選びます。そしたら保存です。
完成!
実際、登録したbucketにfileを置くと(中身はjsonにしましょう)、Lambda functionが実行されると思います。結果は
Lambda上の「view logs in CloudWatch」より確認できます。