.../articles/

Cloud Functions & Pub/Sub & Cloud Scheduler でクローラーを動かす

Cloud Functions、Pub/SubとCloud Schedulerを利用して、タスクを自動化してみました。

弊社では、 qrop docs という農業キュレーションメディアをやっているのですが、その農業に関わるニュース記事を収集するクローラーをサーバーレスでタスクを自動化したいなと思い、今回Cloud Functions、Pub/SubとCloud Schedulerを使いやってみました。
(App Engineでもいいのではないか?と思われる方もいらっしゃるかと思いますが、試しにという気持ちでやってみました)

1. ファイルの作成とfunctionsへのDeploy, Pub/Subの作成

今回はクローラーを実行する main.py を下記のように作成しました。
request['data'] には、Cloud Schedulerのペイロードに設定した内容が入ってきます。
Cloud Functionsは現在最大の実行時間が9分となっているため、Schedulerからそのタイミングで実行するIDを渡して、タスクを処理するようにしました。

./app/main.py

import argparse
import base64
from batch import crawler
import os

# for google cloud functions
def crawl(request, callback):
    id = int(base64.b64decode(request['data']))
    crawler.runForRss(id)

そして、このファイルをdeployするコマンドは下記のようになります。
--set-env-vars で functionsで利用する環境変数を設定できたり、
--timeout でfunctionsの最大実行時間を設定できます。
--trigger-resource には、作成したいPub/SubのトピックIDを設定します。
--entry-point は、実行したいmain.pyのmethod名を指定します。今回でいうと上で書いた crawl です。

$ gcloud functions deploy ${FUNCTION_NAME} \
		--source ./app --runtime python37 \
    --region asia-northeast1 --timeout 540 \
		--trigger-resource ${TRIGGER_NAME} \
    --trigger-event google.pubsub.topic.publish \
		--entry-point ${ENTRY_POINT_NAME} \
    --project $(PROD_PROJECT_ID)\
		--set-env-vars="API_URL"="$(PROD_API_URL)","BASIC_USER"="${BASIC_USER}","BASIC_PASSWORD"="$(BASIC_PASSWORD)"

上記を実行するとGCPのコンソールで Pub/Sub のページより、作成されたトピック名が確認可能です。

2. Cloud Schedulerの作成

次は、functionsを定期実行するためのスケジューラーを作成します。
Cloud Scheduler のページより、作成します。

ジョブの作成から下記画面に遷移し、登録します。

頻度は、cronと同じように書けるので、 3時間ごとに X時15分 に実行したいとすると
15 */3 * * * とかけます。
ターゲットはPub/Subに設定して、トピックには先ほど作成したPub/Subの名前を設定します。
ペイロードには今回は実行時にIDを設定しているため、intで数値を入れていますが、開発者の設定したい値を設定すればいいかと思います。(使い方違っていたら指摘してください!)

まとめ

これらを設定するだけで、Cloud Functionsを定期実行することが出来ました!
App Engineとかを使うほどでもないなーというタスクにはCloud Functionsを利用するというのも一つの手かと思います。
また何かいい使い方があれば、ブログにしたいと思います。

参考

.../articles/

Articles

記事

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

AWS AmplifyにmonorepoのNext.js(App Router)をデプロイする

monorepo管理しているNext.jsをAmplifyにデプロイしようとした際にいくつか躓く内容があったのでまとめておきます。

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

リモートワーク・オンライン会議でも、スムーズに制作を進めるために大切なこと[資料編]

コロナ禍の影響により、リモートワークの導入をおこなっている制作会社も多く、実際に弊社でも導入しています。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトデザインを作るために。参考にしたいおしゃれな事例の探し方。

売れるECサイトのデザインは、「この形式」という決まりはありません。ECサイトで売り上げを上げるなら、しっかりとしたコンセプトと、コンセプトを決定するまでのリサーチが必要です。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

制作会社の考える、業務効率化ツールのおすすめ。個人でも使いやすいサービスなど。

新型コロナウイルス感染拡大の影響で、リモートワークが主流になり、弊社でも週のほとんどは各自宅で作業をしています。

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaでデザインのコミット履歴を残せるプラグイン【Thought Recorder】をリリースしました

Figmaを利用するWebデザイナーの助けになれると嬉しいです。使い方は本記事をご覧ください。

ECの構築方法、おすすめのECサービス。

ECの構築方法、おすすめのECサービス。

ファッションや家電、スーパーの買い物でさえもECサイトを利用することが当たり前になりました。加えて新型コロナウイルスの影響もあり、弊社にも「どんなプラットフォームを利用したら良いか」「どれくらいコストがかかるのか」などECに関するさまざまなご相談を頂きます。

FastAPIのスキーマクラスをOpenAPIから生成する方法

FastAPIのスキーマクラスをOpenAPIから生成する方法

PythonでAPIを構築する要件があり、フレームワークに比較的モダンなFastAPIを採用しました。FastAPIはバックエンドの開発を行えば自動でOepnApi定義を生成する機能が備わっていますが、今回はこれを使わず、事前に用意したOepnApi定義からFastAPIで利用するスキーマクラスを生成する方法を紹介します。

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel 日本一解りやすい全文検索のマイグレーション記載方法解説

Laravel + MySQLで全文検索を実装する

とあるPythonのソースで sys.path.append としたく無かった話

とあるPythonのソースで sys.path.append としたく無かった話

とあるプロジェクトのとあるソースコードのレビューをしてた時、「ソースコードの参照がうまくいってなかったので修正しました」とレビュー依頼がきました。 ディレクトリ構造 ``` module L __init__.py L main.py L tests L __init__.py L test_main.py ``` ソースコード ``` python tests/test_main.py sys.path.append(os.path.abspath("..")) from main import fuga ``` 今まで案件でPythonに触れる機会も結構ありましたが、なんとなく使ってきた部分も多く、この書き方が良いのか悪いのか判別できなかったので、改めてPythonのモジュールのインポートに関して調べてみたのでブログにしました。普段PHPを書いている事が多くPythonに関して何も分からないので初心者向けの内容になっていると思います。

GiFT1号目新卒デザイナーの2021年振り返り

GiFT1号目新卒デザイナーの2021年振り返り

いつの間に、年末ですね。入社してもう、9ヶ月も立っていたようです。2021年の振り返りを記事にしました。

すべての記事

お問い合わせ