質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

3118閲覧

ローカルで実行できた node.js コード を lambda で実行できません

blossan

総合スコア154

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2016/12/12 06:35

御世話になります。

lambda で node.js を実行したいと思います。
以前こちらサイトで質問したところ、一度ローカルからnode.jsのコードを成功してからの方が質問し易いというご指摘を頂き、ローカルで以下のコードでapiの呼び出しをしました。

node.js

1var request = require('request'); 2 3//ヘッダーを定義 4var headers = { 5 'Content-Type':'application/json', 6 "Accept": "application/json" 7} 8 9//オプションを定義 10var options = { 11 url: 'https://api.soracom.io/v1/auth', 12 method: 'post', 13 headers: headers, 14 body : { 15 "email":"登録したメールアドレス", 16 "password":"登録したパスワード" 17 }, 18 json: true 19} 20 21console.log(options); 22request(options, function(error, response, body){ 23 if (!error && response.statusCode == 200) { 24 console.log(response.body); 25 console.log("apiは成功しました"); 26 } else { 27 console.log('error: '+ response.statusCode); 28 console.log(response.body); 29 console.log("apiは失敗に終わりました"); 30 } 31});

このコードを、lambdaで呼び出すには、以下の点に注意して実践しました。
自分で調べた知識ですので、もしかしたら勘違いしているかもしれません。

1:
モジュールrequestを利用しているので、モジュールと一緒にzipファイルとしてアップロードする

2:
外部モジュールとして呼び出すため、呼び出したい関数を、
exports.handler = function(event, context) {}
に入れる

実際にアップロードしたファイルの構造は以下になります。
node_module - request//node_moduleの中にrequestモジュールがファイルがあります
index.js

index.jsの中身は以下になります。

node.js

1var request = require('request'); 2 3exports.handler = function(event, context) { 4 //ヘッダーを定義 5 var headers = { 6 'Content-Type':'application/json', 7 "Accept": "application/json" 8 } 9 10 //オプションを定義 11 var options = { 12 url: 'https://api.soracom.io/v1/auth', 13 method: 'post', 14 headers: headers, 15 body : { 16 "email":"登録したメールアドレス", 17 "password":"登録したパスワード" 18 }, 19 json: true 20 } 21 22 console.log(options); 23 request(options, function(error, response, body){ 24 if (!error && response.statusCode == 200) { 25 console.log(response.body); 26 console.log("apiは成功しました"); 27 } else { 28 console.log('error: '+ response.statusCode); 29 console.log(response.body); 30 console.log("apiは失敗に終わりました"); 31 } 32 }); 33} 34

lambda側でのエラーになります。

node.js

1{ 2 "errorMessage": "Cannot find module 'extend'", 3 "errorType": "Error", 4 "stackTrace": [ 5 "Function.Module._load (module.js:276:25)", 6 "Module.require (module.js:353:17)", 7 "require (internal/module.js:12:17)", 8 "Object.<anonymous> (/var/task/node_modules/request/index.js:17:29)", 9 "Module._compile (module.js:409:26)", 10 "Object.Module._extensions..js (module.js:416:10)", 11 "Module.load (module.js:343:32)", 12 "Function.Module._load (module.js:300:12)", 13 "Module.require (module.js:353:17)" 14 ] 15}

気になる点として、zipファイルをアップロードしたときに、以下の注意メッセージが出ました。

node.js

1This function contains external libraries. Uploading a new file will override these libraries.

外部モジュールは、どのような構造で一緒に上げればよろしいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

モジュール不足が原因でした。
requestモジュールが必用だっため、requestという名称のファイルだけを上げていました。
しかし、requestモジュール自体も、また別のモジュールを必要としているため、それだけではモジュールが起動しませんでした。その他のモジュールを上げることで解決しました。

投稿2016/12/14 02:08

blossan

総合スコア154

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問