LambdaでNode.jsを使ってAPIを叩いてログイン処理を行ってみた(未完)
LambdaでNode.jsを使ってAPIを叩いてログイン処理を行ってみた(未完):
Lambdaでグループウェアとして採用しているCyboozu GaroonのWEBページにアクセスするためのCookieを取得したい。
このときNode.jsを使いたい。理由は、前回GASで作成したbotで書いたコードをそのままLambdaでも使いたいから。(GASはjsで動く)
LambdaでNode.jsでAPIを叩くにはrequestモジュールが良いらしい。
しかし少々めんどくさく、Lambdaでモジュールを使うにはローカルでモジュールをZIP化してLambdaに登録する必要があるらしい。
Mac OS High Sierra 10.13.6
Garoon SOAP API
AWS Lambda $LATEST
AWS API Gateway
色々しらべてみるとどうやら
Node.jsの標準moduleであるhtmlを用いることでAPIを叩くことができそうである。
参照その1
https://qiita.com/hironaito/items/9d4d56acbdca2d985b04
もしくはrequest moduleを活用する
参照その2
https://www.bokukoko.info/entry/2016/04/04/AWS_Lambda_%E3%81%AE_Node.js_%E3%81%A7%E9%80%A3%E7%B6%9A%E3%81%A7%E5%A4%96%E9%83%A8API%E3%82%92%E5%8F%A9%E3%81%8F%E4%BD%9C%E6%B3%95
また、で検索をするとexpress moduleもあるようだ。
参照その3
https://sbfl.net/blog/2018/08/25/nodejs-express-webapi/
そのexpress moduleをわかりやすく解説している。
参照その4
https://qiita.com/nkjm/items/723990c518acfee6e473
今回はAPIに対してPOSTリクエストを実行したいので,
で検索をかける。
参照その5
https://qiita.com/penta515/items/074b5c7694b9bcec1043
今回はリクエストにログインIDとPASSをリクエストに含めたいので、
POSTリクエストをメインで解説している<参照その5>を元にコードを書いていきたいと思う。
書いてみた。このgetGaroonCookie.jsを適当なディレクトリに保存しておく。
それではこのgetGaroonCookie.jsをターミナル上で実行してみたいと思う。Cookieが帰ってきたら成功なんだけど、、、
下記を参考にして実行してみる。
https://q-az.net/node-js-pursue/
するとターミナル上で
と出てきた。
下記に従ってrequest moduleを使えるように設定する。
https://www.yoheim.net/blog.php?q=20150104
簡単でターミナルに
と打ち込むだけ。
これでインストールスタート。
しかしこのあとエラーが発生する。
code ECONNREFUSEDから始まるエラーについての解消方法
https://qiita.com/tenten0213/items/7ca15ce8b54acc3b5719
を実行してproxy設定を見ると
になっていた。なのでproxyを設定する。
そしてinstallコマンドを実行すると
code e 407が出たときの解決方法
→シンプルにpasswordが間違っていました。
訂正後インストールすると
と表示され、インストールが途中で止まってしまうように見える。
下記がWARN表示を解消する記事
https://helen.hatenablog.com/entry/2016/05/22/003057
package.jsonは作った覚えはないが、ホームディレクトリにいつの間にかできている。
package.jsonの中身は
デフォで
これを
に書き換えてあげる。
するとエラーが出る。
package.jsファイルは結局元に戻した。
ググっているとWARN表示がでても正常稼働と同様らしい。
というわけで
requestモジュールを実行した。
これでモジュールがインストールされたということにして、実際にLambdaで実行をしてみると、エラーログにメッセージが出てきた。
と表示された。
ググったところどうやら使いたいモジュールはZIP化してLambdaに登録する必要があるらしい。
https://hacknote.jp/archives/12124/
これは公式ドキュメント
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-create-deployment-pkg.html
結構めんどくさいなと思って、これが正攻法なのか先輩に聞いたら、Lambdaでモジュールを使うときにはZIP化が一般的らしい。もっと簡単になると嬉しいのだけど、、、
ZIP化は次回行う。
ちなみに今まではLambdaに直接コードを書いて実行するという開発をしていたのだが先輩から助言を頂き、ローカル環境で開発することにした。
下記はなぜ実行環境と開発環境を分けるかが書いてある。
https://12factor.net/ja/
今回はまだだれにもオープンにしていないサービスだけど、実際に開発する際には既に使っているユーザーがいる。常に動く状態を保ちながら開発するという重要なことに気付いた。ユーザーがいるかいないかで、開発フローに対する意識も変わるなと思った。
express module
そもそもモジュールではなくフレームワークらしい。APIを叩くだけでなくいろんなことができる。
https://techacademy.jp/magazine/16119
HTTP module
その名の通りHTTP通信を行うことができる。
あと簡単にWEBサーバーを作れる(requestが飛んできたら特定の値をレスポンスするとか)。リクエストを受けとる側をつくれる。一応リクエストも飛ばせるらしいが割と扱いづらいらしい。
https://www.sejuku.net/blog/72566
http://or1ko.hatenablog.com/entry/2014/06/29/185012
request module
HTTPモジュールよりも簡単にリクエストできるモジュール。
https://maku77.github.io/nodejs/net/request-module.html
https://www.sejuku.net/blog/73698
LambdaでNode.jsを使ってAPIを叩いてログイン処理を行ってみた(未完)
何を目的に、何をしたのか。(達成できてない場合は「できてません」も冒頭で)
Lambdaでグループウェアとして採用しているCyboozu GaroonのWEBページにアクセスするためのCookieを取得したい。このときNode.jsを使いたい。理由は、前回GASで作成したbotで書いたコードをそのままLambdaでも使いたいから。(GASはjsで動く)
結論やわかったこと
LambdaでNode.jsでAPIを叩くにはrequestモジュールが良いらしい。しかし少々めんどくさく、Lambdaでモジュールを使うにはローカルでモジュールをZIP化してLambdaに登録する必要があるらしい。
やったこと
準備(OSのバージョン・環境等)
Mac OS High Sierra 10.13.6Garoon SOAP API
AWS Lambda $LATEST
AWS API Gateway
手順
色々しらべてみるとどうやらNode.jsの標準moduleであるhtmlを用いることでAPIを叩くことができそうである。
参照その1
https://qiita.com/hironaito/items/9d4d56acbdca2d985b04
const http = require('http'); const querystring = require('querystring'); const weatherArea = require('weather-area'); exports.getWeather = (cityName, nextDay) => { let message = [{ "type": "text", "text": "" }]; let areaNumber = exports.getAreaNumber(cityName); return new Promise(function(resolve, reject) { let URL = 'http://weather.livedoor.com/forecast/webservice/json/v1?city='+areaNumber.num; http.get(URL, (res) => { let body = ''; res.setEncoding('utf8'); res.on('data', (chunk) => { body += chunk; });
参照その2
https://www.bokukoko.info/entry/2016/04/04/AWS_Lambda_%E3%81%AE_Node.js_%E3%81%A7%E9%80%A3%E7%B6%9A%E3%81%A7%E5%A4%96%E9%83%A8API%E3%82%92%E5%8F%A9%E3%81%8F%E4%BD%9C%E6%B3%95
var request = require('request'); exports.handler = function(event, context) { var host = "https://api.awesomeapp.com"; var ids = [1,2,3,4]; ids.forEach(function(val) { request.delete({ uri: host + "/records/" + id, json: true }, function(err, response) { context.done(); //? }); }); };
参照その3
https://sbfl.net/blog/2018/08/25/nodejs-express-webapi/
// expressモジュールを読み込む const express = require('express'); // expressアプリを生成する const app = express(); // ルート(http://localhost/)にアクセスしてきたときに「Hello」を返す app.get('/', (req, res) => res.send('Hello')); // ポート3000でサーバを立てる app.listen(3000, () => console.log('Listening on port 3000'));
参照その4
https://qiita.com/nkjm/items/723990c518acfee6e473
今回はAPIに対してPOSTリクエストを実行したいので,
で検索をかける。
参照その5
https://qiita.com/penta515/items/074b5c7694b9bcec1043
var request = require('request'); //ヘッダーを定義 var headers = { 'Content-Type':'application/json' } //オプションを定義 var options = { url: 'https://hoge.com/api/v2/fuga', method: 'POST', headers: headers, json: true, form: {"hoge":"fuga"} } //リクエスト送信 request(options, function (error, response, body) { //コールバックで色々な処理 })
POSTリクエストをメインで解説している<参照その5>を元にコードを書いていきたいと思う。
書いてみた。このgetGaroonCookie.jsを適当なディレクトリに保存しておく。
//requestをrequire //リクエストmoduleはPOSTリクエストを実行するものになっている //ここではrequestmoduleに紐づくメソッドを実行できるよう、インスタンス化?している var request = require('request'); //ヘッダーを定義 var headers = { //ここではリクエストのBODY部分のコンテンツタイプを指定 'Content-Type':'text/xml; charset=UTF-8' } var payload = //XML形式でBODYを記載 //オプションを定義 var options = { //Cookieを取得するためのGaroon APIのエンドポイント url: '指定のURL', //メソッドの形式はPOST method: 'POST', //ヘッダーを指定 headers: headers, //これは謎、、、 json: true, //これは謎。多分BODYのことを指しているはずだが、、、 form: payload } //リクエスト送信とのことだが、このコードはどういうこと?謎である。 request(options, function (error, response, body) { //コールバックで色々な処理 })
下記を参考にして実行してみる。
https://q-az.net/node-js-pursue/
するとターミナル上で
Error: Cannot find module 'request'
下記に従ってrequest moduleを使えるように設定する。
https://www.yoheim.net/blog.php?q=20150104
簡単でターミナルに
npm install request --save
これでインストールスタート。
しかしこのあとエラーが発生する。
code ECONNREFUSEDから始まるエラーについての解消方法
https://qiita.com/tenten0213/items/7ca15ce8b54acc3b5719
$ npm config ls -l
https-proxy = null
$ npm config set https-proxy http://XXXXXXXX:8080
npm ERR! code E407 npm ERR! 407 Proxy Authentication Required: request@latest npm ERR! A complete log of this run can be found in: npm ERR! /Users/XXXXXXXX/.npm/_logs/2018-11-09T02_43_39_760Z-debug.log
→シンプルにpasswordが間違っていました。
訂正後インストールすると
npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN ユーザー名 No description npm WARN ユーザー名 No repository field. npm WARN ユーザー名 No license field. ⸨░░░░░░░░░░░░ ⸩ ⠦ postinstall: WARN ユーザー名 No license field. + request@2.88.0
下記がWARN表示を解消する記事
https://helen.hatenablog.com/entry/2016/05/22/003057
package.jsonは作った覚えはないが、ホームディレクトリにいつの間にかできている。
package.jsonの中身は
デフォで
{ "dependencies": { "@google/clasp": "^1.6.3", "global": "^4.3.2", "request": "^2.88.0" } }
{ "dependencies": { "@google/clasp": "^1.6.3", "global": "^4.3.2", "request": "^2.88.0" "repository": "undefined", "license": "ISC" } }
するとエラーが出る。
npm ERR! file /Users/ユーザー名/package.json npm ERR! code EJSONPARSE npm ERR! JSON.parse Failed to parse json npm ERR! JSON.parse Unexpected token in JSON at position 134 while parsing near '...tory": "undefined", npm ERR! JSON.parse "license": "ISC" npm ERR! JSON.parse ...' npm ERR! JSON.parse Failed to parse package.json data. npm ERR! JSON.parse package.json must be actual JSON, not just JavaScript
ググっているとWARN表示がでても正常稼働と同様らしい。
というわけで
npm install request --save
これでモジュールがインストールされたということにして、実際にLambdaで実行をしてみると、エラーログにメッセージが出てきた。
Cannot find module requests
ググったところどうやら使いたいモジュールはZIP化してLambdaに登録する必要があるらしい。
https://hacknote.jp/archives/12124/
これは公式ドキュメント
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-create-deployment-pkg.html
結構めんどくさいなと思って、これが正攻法なのか先輩に聞いたら、Lambdaでモジュールを使うときにはZIP化が一般的らしい。もっと簡単になると嬉しいのだけど、、、
ZIP化は次回行う。
補足
開発環境について
ちなみに今まではLambdaに直接コードを書いて実行するという開発をしていたのだが先輩から助言を頂き、ローカル環境で開発することにした。下記はなぜ実行環境と開発環境を分けるかが書いてある。
https://12factor.net/ja/
今回はまだだれにもオープンにしていないサービスだけど、実際に開発する際には既に使っているユーザーがいる。常に動く状態を保ちながら開発するという重要なことに気付いた。ユーザーがいるかいないかで、開発フローに対する意識も変わるなと思った。
Node.jsでAPIを実行する際のexpress moduleとrequest moduleとHTTP moduleの違いについて
express moduleそもそもモジュールではなくフレームワークらしい。APIを叩くだけでなくいろんなことができる。
https://techacademy.jp/magazine/16119
HTTP module
その名の通りHTTP通信を行うことができる。
あと簡単にWEBサーバーを作れる(requestが飛んできたら特定の値をレスポンスするとか)。リクエストを受けとる側をつくれる。一応リクエストも飛ばせるらしいが割と扱いづらいらしい。
https://www.sejuku.net/blog/72566
http://or1ko.hatenablog.com/entry/2014/06/29/185012
request module
HTTPモジュールよりも簡単にリクエストできるモジュール。
https://maku77.github.io/nodejs/net/request-module.html
https://www.sejuku.net/blog/73698
コメント
コメントを投稿