今後も似たようなことをやりたくなることはありそうなので、備忘録的にもここに記載
クローラーや差分チェックの話ではなくLambdaの定期実行の話
やったこと
災害ボランティアの更新情報があると良いなぁと思ったため、その情報を取得するための定期的な情報取得で更新があるかを確認しようというものです。
こちらにあるリンク集のURLで、更新があったかどうかを確認を行います。
更新があったか、なので更新前の状態を取っておく必要があります。
更新前の状態と結果のファイルが生成されます。
結果のファイルから見られるようにしたサイトが下記になります。
コード
言語はPython
URLリストは公開しているSpreadSheetにあるのでそれをダウンロードし、pandasで開き、URLそれぞれにアクセスしてBeautifulSoup4で中身をみてタグを除いた文章にして行単位でCSVとして保存。
前回の分と比較して、増えたものがあれば差分として出す、というものです。
タグは除いただけなので、リンクのURLだけ変わったとかは今回のものでは検知できません
定期実行のために行ったこと
実行するサーバー:AWS Lambda
慣れた方法なら、借りているVPSでcron回したほうがやりやすいですが、今回は使ったことがないからという理由でAWS Lambdaを使ってみます
ただ、これは作ったものを実行するだけなのであまり語ることがないです
とはいえスクリプト作ったけどどうやってpipの各種ライブラリ取ってくんねん?ってので困ったところはありました。
これは次の章
Lambdaで動かすスクリプトをDockerで作成し、AWSで使えるようにする
他の方法もあるかもしれませんが、Dockerで上げることにします。
Dockerfileでよしなにpip insatllするようにしておけば良いようです
その上でDockerビルドして、
Amazon ECR(Elastic Container Registry)に上げます
まずAWSコンソール上でPrivate registryにリポジトリを作成します。そのあとAWS CLIを使いアップロードするわけですがコマンドがよくわからんねぇな?と思ってたら
「プッシュコマンドの表示」というところに、「これをコピペして実行しろ」的に記載されていました。
そのままやれば登録されます。
全体的には下記を参照しました
ファイルの入出力部分
Lambdaでサーバー内に書き出してもどうしようもないので、出力してのファイルの保存はS3に行います
Lambda内の一時ファイルの置き場は /tmp/以下
である必要があるようです
LambdaからS3にファイルの読み書きをするにあたって権限周りが必要です。
実行するLambdaの設定時にポリシーを付与する形になります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::{bucket名}"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::{bucket名}/*"
}
]
}
ローカルで試す場合はそのポリシーを当てはめたユーザーを作成する必要がありそうです。
Lambdaの関数登録時にこのポリシーも付与する必要があります。
これで手動で実行するのはできるようになったはずです。
cronの部分
Lambda上では定期実行などはできないので、Amazon EventBridgeの「EventBridge スケジュール」を使います。
AWS LambdaのInvokeでLambdaのを指定すれば実行できます。
サーバーに取ってくる
表示用のファイルは上書き更新しているわけではないのに、毎回S3から取ってくるのは転送量の無駄なので、定期的にVPSで立てているサーバーに持ってくるようにします。
差分だけ取るコマンドが有るのでそれを使います
aws s3 sync s3://{bucket name}/ {置き場所のパス}
--dryrun
をつければドライランもできます
これをcronで実行するようにすれば定期的にとれます。
これでサーバーに定期的に更新されるようになりました
あとは、よしなに表示系でいじるだけです。