例2:Amazon S3イベントを処理する
今度はAmazon S3で発生するイベントを処理するファンクションを作成します。通知設定を行ったAmazon S3のバケットにオブジェクトが作成されるとLambdaファンクションが起動されます。ここでも実行するコードはあらかじめ用意されているサンプルを利用します。従ってセットアップ手順も大筋では例1の場合と同様の手順になります。
まず、例1と同様の手順でLambdaファンクションを作成してください。その際、以下のようにした上で作成を行ってください。
- ファンクション名を「S3EventProcessor」にします。
- Code Templateのドロップダウンで"S3 Get Object"を選択します。
- 例1で作成したIAMロール(execution role)を使用します。このIAMロールには既にコードテンプレートとして提供されているコードで必要な権限が設定されています。
- Advanced settingsセクションで、メモリを512MB、Timeoutを5秒に設定します。
今回使用するコードテンプレートは以下のようなものになります。
console.log('Loading event'); var aws = require('aws-sdk'); var s3 = new aws.S3({apiVersion: '2006-03-01'}); exports.handler = function(event, context) { console.log('Received event:'); console.log(JSON.stringify(event, null, ' ')); // Get the object from the event and show its content type 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('CONTENT TYPE:',data.ContentType); context.done(null,''); } } ); };
eventとして渡されるイベントデータにはAmazon S3のイベント情報が含まれます。このテンプレートではバケット名(event.Records[0].s3.bucket.name)とオブジェクトのキー(event.Records[0].s3.object.key)を参照し、実際のオブジェクトをs3.getObjectで取得しています。エラーがなく取得できた場合はオブジェクトのContentTypeを出力しています。
次に、Amazon S3のイベントを受け取るように設定していきます。なお、Amazon S3 Event Notificationsの詳細についてはこちらのドキュメント(バケットイベントの通知の設定)を参照してください。
最初にバケットを作成します。バケットの作成方法はこちらのドキュメント(バケットの作成)を参考にしてください。注意点としてLambdaファンクションのリージョンと同じリージョンにバケットを作成する必要があります。バケットの作成が完了したら、バケットの通知の設定を行います。この設定はAmazon S3のコンソールでもAWS Lambdaのコンソールでもどちらでも行えますが、今回はAWS Lambdaのコンソール上で設定することとします。
AWS Lambdaのコンソールを開くとファンクションのリストが表示されています。こちらで今回作成した「S3EventProcessor」を選択し、「Configure event source」ボタンをクリックしてください。
Publish S3 event notifications to S3EventProcessorのページ(S3EventProcessorの部分には作成したファンクション名が入ります)で先ほど作成したバケットを選択します。サンプル画像ではs3-event-sampleというバケットを選択しています。
次にInvocation roleを作成するために「Create/Select Role」をクリックしてください。続いて表示される画面ではデフォルトのままで「Allow」をクリックします。そうするとAmazon S3がAWS Lambda functionを起動するのに必要な権限が許可されたIAMロールが作成され、セットされた状態となります。その後「Submit」をクリックします。
それでは先ほど作成したバケットにお好きなファイルをアップロードしてみてください。Amazon S3のコンソール上からアップロードする方法の詳細はこちらのドキュメント(バケットにオブジェクトを追加)を参照してください。
アップロードした後にLambdaファンクションのダッシュボードを確認すると、Request DurationおよびRequest countの数が増えていることが確認できます。もしこれらの値が0のままでExecution error countが増えている場合は何らかのエラーが発生していますので設定内容などを見直してみてください。
また、実行結果のログはAmazon CloudWatch Logsに記録されています。ダッシュボードのグラフ上のlogsをクリックすることで該当のログ画面へと簡単に移動できます。もちろんAmazon CloudWatchのコンソール上でたどることも可能です。
標準では個々のログエントリで長文のものは縮小されていますが、展開して表示することが可能です。アップロードしたファイルの情報が表示されていたり、ContentTypeが表示されていることが確認できます。
まとめ
このようにAWS Lambdaを使うことで簡単にイベントドリブンアプリケーションを開発することが可能です。現時点ではまだPreviewというステータスですがAWSのアカウントがあれば誰でも使うことができ、無料枠もたっぷりとありますのでお気軽にお試しください。
今回はページボリュームの都合上、触れることができませんでしたがAmazon DynamoDB Stream(こちらもまだPreviewですが)やAmazon Kinesisとのインテグレーションはより様々なユースケースを考えることができるでしょう。こういったサービスを利用することでこれまでと比べてバックエンドの実装範囲が少なくなるためアプリケーション開発スピードの向上も期待できます。
最後に少し宣伝になりますが、2月19日、20日に開催される翔泳社主催の「Developers Summit 2015」に登壇し、今回紹介したAWS Lambdaも含めた話をする予定です(該当セッション)。お時間がある方は、こちらもぜひよろしくお願いします!