Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

スクレイピングをAWS lambdaから実行するようにする(調査) #8

Closed
OiR-ptr opened this issue Jan 3, 2023 · 42 comments
Closed

Comments

@OiR-ptr
Copy link
Owner

OiR-ptr commented Jan 3, 2023

No description provided.

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

同作業を行っているQiitaがあったので、リンク
https://qiita.com/kodai-saito/items/9051d2b30a29c7d64f7d

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

Layerにaws-lambda-layerパッケージの内容を登録すればよいらしい。
chrome-aws-lambdaへの登録用ZIPはコマンド指定がReadmeにそのままあったので実行すれば登録可能だった。
https://github.com/alixaxel/chrome-aws-lambda#aws-lambda-layer

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

50MB制限があるっぽいが、今49.4MBなので、そのうちこのパッケージ使えなくなっちゃうかも。
一旦実行バージョンは[email protected]

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

lambdaコードの変更はデプロイしないと保存されないらしい。
Qiitaに無かったから抜けちゃった。。。

ずっと 200 Hello from Lambda!帰ってきてたw

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

無事エラーになりました。

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

image

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

Issueで検索したところNode.js@16サポートはいまいちっぽい?
マージリクエストは飛んでるけどまだマージされていない感じらしい。
一旦Node12とか14で再度実行する。
alixaxel/chrome-aws-lambda#275

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

V14で動かしてみる。
デフォルトのタイムアウト3秒だと瞬殺でだめだった

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

15秒でもだめ。
仮想のChrome立ち上げてからスクレイピングするので、結構待たないとだめ?

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

大幅にあげて2分でやってみた

どうやら15秒前後はかかるっぽい

Function Logs
START RequestId: c524daae-232b-4cfb-90f7-6704c584304f Version: $LATEST
END RequestId: c524daae-232b-4cfb-90f7-6704c584304f
REPORT RequestId: c524daae-232b-4cfb-90f7-6704c584304f Duration: 14837.94 ms Billed Duration: 14838 ms Memory Size: 512 MB Max Memory Used: 512 MB Init Duration: 355.71 ms

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

Lambdaは実行時間課金なので、気が付かずにやりすぎるとやばそう(といっても十二分にお小遣いの範囲っぽいが)
ついでだし請求アラームの勉強もしとく

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 3, 2023

請求アラームのおすすめ設定みたいなのが見つかったら、ローカルPuppeteerのテスト環境を用意し、
ローカルで関数を作成してデプロイして終わり。

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

ローカルでテストするためにどうすればいいかだが、
lambdaでのコールバック exports.handler はそのままに(コピペ可能にするため)して、テストコード側で呼び出し確認をするのがよさそう
https://wp-kyoto.net/test-aws-lamnda-nodejs-as-local/#Nodejs%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

とりあえずmochaを使ってテストコードを追加する
https://matsuand.github.io/docs.docker.jp.onthefly/language/nodejs/run-tests/

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

テストコードはChaiのほうが書きやすいみたい
実際 Mocha のやつはなんだか分かりづらかった~w

なので Chai を使ってテストコード書きます

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

呼び出し実行時にうまく行っていないっぽい。
レイヤーとして追加しようとした時、そういえば追加の依存あった気がする。
AssertionError: context._error should empty: expected Error: Could not find expected browser (c… to equal null
at Context. (test/index.test.js:16:35)

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

puppeteer-coreが追加依存っぽい気がする。
インストール後再実施したらメッセージ内容が変わっていた。

channelとexecutablePathは省略不可能ですよー、らしい。
channelを渡すコードにしていない(ていうか何渡すの)ので、多分puppeteer-coreのバージョン違い。

chrome-aws-lambdaの現行バージョンで使っているpuppeteer-coreがあるはずなので、それに合うバージョンを入れてやればインタフェースは解決しそう。

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

"Could not find expected browser (chrome) locally. Run npm install to download the correct Chromium revision (884014)."

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

puppeteerじゃないとローカルChromeが入っていないっぽい。
あと、Node v16環境で動かしてた。。。

Node v16じゃ動かないことはさんざん確認したのに~w

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

Node v14で再構成叩いたら存外行けた。
いい感じ。

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

でもnpm run testでブレークポイント止まらない。
どうすれバインダー

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

しかも puppeteer-core でブラウザ動かない問題が治ってない 👎

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

😠

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

わからぬ 一旦オートチェスやります 😕

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

Linux側のライブラリが足りていない感じっぽい
https://seri.hatenablog.com/entry/2020/10/04/012459

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

libnss3が足りてないみたいなのでこれを追加する
apt install libnss3

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

出てこなかったけど apt-get update忘れてただけ

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 4, 2023

apt updateしてもUnable to locate package libatk-1.0が出てくる
こいつ何者だよ

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 5, 2023

apt-get installでどうにか入ったが、色々やっていった結果そもそもヘッドフルで起動していたことがわかった。
Dockerコンテナなので、当然X windowなんて入っているわけもなく起動失敗することを確認。
headless: trueで起動させたが、それはそれで "Protocol error (Page.navigate): Target closed." になってしまった。

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 5, 2023

公式マニュアルに、Running Puppeteer in Dockerなるものがあるらしい。
関連Qiitaも見つけたので、これでコンテナから作り直す必要があるきがする。

https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#running-puppeteer-in-docker
https://qiita.com/athagi/items/305f55bc140683d3dca7

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 5, 2023

上の場合でも puppeteer-core ではなく puppeteer を使うので、コード変換をかまさないとLambda上で動くコードと一致しない。
どうすりゃええねん。。。

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 5, 2023

https://github.com/alixaxel/chrome-aws-lambda/wiki/HOWTO:-Local-Development
上のWikiにある通り、dev依存関係として puppeteerを追加するだけでいいってあるから、もうヘッドレスブラウザが立ち上がらない問題は理由不明だね
諦めてLambda上でせこせこコード書くことにする

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Jan 5, 2023

あんまりお金かかりませんように!

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 2, 2023

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 2, 2023

定期実行時のログはLambdaが標準で取ってるらしい
CloudWatch logsというAWSのサービスと標準で連携していて、Lambdaのモニタリングタグから見れる
1週間以内とかで見れたりするので結構楽そう

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 2, 2023

あと、競馬情報のスクレイピングは毎日起動にして、kaisai_dateを指定するのがいい感じだと思う
引数も難しくないのでさっと修正してしまえばその日分のデータは取れるようになるのでは
https://race.netkeiba.com/top/race_list.html?kaisai_date=20230106

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 2, 2023

当日分のデータ(馬体重とか競走除外とか)についてどうするかが問題になるが
前日分と当日分の2面で取れば十分か?
ただ、馬のレース記録って基本即日反映じゃないので、何日分取得をずらすかはちゃんと確認しておかないとだめだ

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 2, 2023

あの・・・これ定期実行動いてます?
設定から5分経過してもまだ動いていないみたいで不安なんですけど?

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 2, 2023

きたきたきましたよっと
image

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 2, 2023

定期実行の動作確認は取れたので無効化

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 2, 2023

GitHubで管理したみがある
これでGitHub Actionsから自動デプロイできるっぽいぞ
https://dev.classmethod.jp/articles/lambda-github-actions/

@OiR-ptr
Copy link
Owner Author

OiR-ptr commented Feb 3, 2023

一旦必要な調査は終わったと思うのでクローズしよか

@OiR-ptr OiR-ptr closed this as completed Feb 3, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant