あるテストサーバーから OneTimeToken を取得しようとしたら、レスポンスが HTML しかなかったので、AWS Lambda の Node.js で axios と cheerio で、HTML解析(スクレイピング)して JSON をレスポンスさせるようにした話。
Node.js ソースコード
app.js
const axios = require('axios');
const cheerio = require('cheerio');
const url = '{TARGET_PAGE}';
exports.lambda_handler = (event, context, callback) => {
axios(url)
.then(({ data }) => {
const content = getContent(data);
callback(null, {
statusCode: 200,
body: JSON.stringify({ content: content })
});
})
.catch(callback);
};
function getContent(html) {
const $ = cheerio.load(html);
const content = $('{TARGET_SELECTOR}').text();
console.log('Content: ', content);
return content;
}
ね、簡単でしょ?
開発手順
-
AWS SAM CLI でプロジェクト作成
$ sam init --runtime nodejs8.10 --name onetimetoken
ディレクトリ構成onetimetoken ├── hello_world <-- Source code for a lambda function │ ├── app.js <-- Lambda function code │ ├── package.json <-- NodeJS dependencies └── template.yaml <-- SAM template
-
axios と cheerio をインストール
$ cd onetimetoke/hello_world $ npm install --save axios $ npm install --save cheerio $ cd ..
-
app.js を上記のコードに書き換える
-
ローカルでサーバーを起動
$ sam local start-api 2018-07-02 14:14:25 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET] 2018-07-02 14:14:25 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template 2018-07-02 14:14:25 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
-
ブラウザ等で http://127.0.0.1:3000/hello を GET で開くとスクレイピング結果の JSON が取得できます。
-
AWS へデプロイ
-
AWS S3 BUCKET作成
aws s3 mb s3://BUCKET_NAME
-
パッケージ (AWS S3 へコードをアップロード)
sam package \ --template-file template.yaml \ --output-template-file packaged.yaml \ --s3-bucket REPLACE_THIS_WITH_YOUR_S3_BUCKET_NAME
-
デプロイ (AWS Lambdaへデプロイ)
sam deploy \ --template-file packaged.yaml \ --stack-name onetimetoken \ --capabilities CAPABILITY_IAM
-
※当初ヘッドレスブラウザで実装してましたが、AWS Lambda では実行できなかったので、HTMLパーサを使うようにしました。
参照
- AWS SAM CLI
- [Node.jsでウェブスクレイピングする色々な方法 - Qiita]
(https://qiita.com/ledsun/items/0965a60f9bdff04f2fa0)