LambdaでNode.jsを使ってAPIを叩いてログイン処理を行ってみた(未完)

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に登録する必要があるらしい。


やったこと


準備(OSのバージョン・環境等)

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

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; 
            }); 
もしくは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

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(); //? 
    }); 
  }); 
}; 
 
また、で検索をするとexpress moduleもあるようだ。

参照その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')); 
 
そのexpress moduleをわかりやすく解説している。

 参照その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) { 
  //コールバックで色々な処理 
}) 
今回はリクエストにログインIDとPASSをリクエストに含めたいので、

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) { 
  //コールバックで色々な処理 
}) 
 
 
 
 
 
それではこのgetGaroonCookie.jsをターミナル上で実行してみたいと思う。Cookieが帰ってきたら成功なんだけど、、、

下記を参考にして実行してみる。
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 
と打ち込むだけ。

image.png

これでインストールスタート。

しかしこのあとエラーが発生する。



image.png


code ECONNREFUSEDから始まるエラーについての解消方法
https://qiita.com/tenten0213/items/7ca15ce8b54acc3b5719

$ npm config ls -l 
を実行してproxy設定を見ると

https-proxy = null 
になっていた。なのでproxyを設定する。

$ npm config set https-proxy http://XXXXXXXX:8080 
そしてinstallコマンドを実行すると

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 
code e 407が出たときの解決方法

→シンプルに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 
package.jsファイルは結局元に戻した。

ググっているとWARN表示がでても正常稼働と同様らしい。

というわけで

npm install request --save 
requestモジュールを実行した。

これでモジュールがインストールされたということにして、実際にLambdaで実行をしてみると、エラーログにメッセージが出てきた。

Cannot find module requests 
と表示された。



image.png


ググったところどうやら使いたいモジュールは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

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)