LambdaでS3のJSONファイルをローカルから取得する
Lambdaの開発をローカルで行うために、S3の情報をローカルから取得する必要がありました。 取得に少し手こずったので記録用として書きます。実装コードはNode.jsです。
S3にJsonファイルをアップロード
S3でバケットを作成し、ローカルで取得したいJsonファイルをアップロードします。
今回はテスト用に以下ファイルを作成してアップロードしました。
test.json
{ "name": "takedajs" }
アクセスキーIDとシークレットアクセスキーを取得
ローカルからS3の情報を取得するために、IAMユーザのアクセスキーIDとシークレットアクセスキーを取得します。
IAMユーザ作成画面で、S3情報取得を許可するためにAmazonS3ReadOnlyAccessポリシーを付与したIAMユーザを作成します。
ユーザー追加の完了画面にある「.csvファイルのダウンロード」ボタンを押下し、「Access key ID」と「Secret access key」が記述してあるCSVファイルをダウンロードします。
Lambdaのローカル開発環境構築
以下、ローカルの作業ディレクトリ配下で行います。
Lambdaコードの雛形を作成
index.js
'use strict'; exports.handler = (event, context, callback) => { console.log('test'); };
Lambdaコードを実行する処理を作成
test.js
'use strict'; const lambda = require('./index.js'); const event = {}; const context = null; const callback = {}; lambda.handler(event, context, callback);
Lambdaコードの実行
作業ディレクトリはこのようになります。
$ tree -L 1 . ├── index.js └── test.js
nodeコマンドでtest.jsを実行すると、Lambdaコードのindex.jsが呼ばれ、console.logが吐き出されます。
$ node test.js test
これでLambdaのローカル開発環境構築が完成です。
ローカルからS3の情報取得
AWS SDK for JavaScript導入
作業ディレクトリ配下で以下コマンドを実行し、aws-sdkを導入します。
$ npm init
$ npm install --save aws-sdk
作業ディレクトリはこのようになります。
$ tree -L 1 . ├── node_modules ├── package-lock.json ├── package.json ├── index.js └── test.js
S3のJsonファイル取得処理実装
先程作成したindex.jsに処理を追加します。
'use strict'; const AWS = require('aws-sdk'); AWS.config.update({ accessKeyId: "xxxxxxxxxxxxxxxxxxxx", // 先程取得したアクセスキーID secretAccessKey: "xxxxxxxxxxxxxxxxxx", // 先程取得したシークレットアクセスキー }); const S3 = new AWS.S3(); const BUCKET = 'xxxxxxxxx'; // S3のバケット名 exports.handler = (event, context, callback) => { let params = { Bucket: BUCKET, Key: 'test.json' // ファイル名 }; S3.getObject(params, function(err, data) { if (err) { console.log(err); } else { console.log(JSON.parse(data.Body.toString())); } }); };
S3のJsonファイル取得
nodeコマンドでtest.jsを実行します。 S3にアップロードしたtest.json中身が表示され、正常にJsonファイルが取得できたことが分かります。
$ node test.js { name: 'takedajs' }