takedajs ログ

備考録

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' }

参考

Node.js 内の AWS SDK for JavaScript | AWS

nodejs aws-sdkでs3ファイルアップロード - Qiita