Cloud functionsでスクレイピング

1. Cloud Functionsとは

Google Cloud 上で提供されるサーバレスプラットフォームで、あるコードを呼び出すイベントの定義と、実行したいコードを書くだけで簡単にコードを実行する事ができます。開発言語はPythonやnodeJS,Go等、複数対応しています。

CloudFunctionsはAlwaysFree枠が設定されておりますが、呼び出しの他に別途コードの実行に必要なComputing時間やネットワークトラフィックは従量課金の対象となります。

2. プロジェクトの準備

既存のプロジェクトを利用する場合や既存のフォルダにコードを作成する場合は、対応は不要です。

ソースコードを格納するWorkディレクトリを作成

$ mkdir [project-name]
$ cd [project-name]

GCPプロジェクト作成

$gcloud projects create [project-id] --name [project-name]

プロジェクトへの支払い先設定

利用内容によっては課金設定が必須となるため、支払い先を設定します。以下記事の支払い方法の設定を実施します。

プロジェクトの選択

gcloudコマンドを用いてプロジェクトの選択を行う

$gcloud init
Pick configuration to use:
[1] Re-initialize this configuration [default] with new settings
[2] Create a new configuration
Please enter your numeric choice:  Please enter a value between 1 and 2:  1
Choose the account you would like to use to perform operations for
this configuration:
[1] [your-google-account]@gmail.com
[2] Log in with a new account
Please enter your numeric choice:  1
Pick cloud project to use:
[1] [project-name-1]
[2] Create a new project
Please enter numeric choice or text value (must exactly match list
item):  1

APIの有効化

サービス一覧の取得

$ gcloud services list --available

CloudFunctions APIの有効化

$ gcloud services enable cloudfunctions.googleapis.com

3. CloudFunctionsの設定

3-1. サービスアカウントの作成と権限付与

今回はデフォルトサービスアカウントとは別にアカウントを作成します。

$ gcloud iam service-accounts create [account-name]

アカウントの確認。作成したユーザが表示されており有効であることを確認する。

$gcloud iam service-accounts list
NAME                                EMAIL                                                       DISABLED
App Engine default service account [project-name]@appspot.gserviceaccount.com              False
                                   [account-name]@[project-name].iam.gserviceaccount.com   False

サービスアカウントに権限を付与する。

//サービスアカウントに編集者権限を付与する場合
$gcloud projects add-iam-policy-binding [project-name] --member serviceAccount:[service-account-name] --role='roles/editor'
//サービスアカウントにCloudFunctionsの開発者権限のみ付与する場合
$gcloud projects add-iam-policy-binding [project-name] --member serviceAccount:[service-account-name] --role='roles/cloudfunctions.developer'

3-2. コードの作成

コードを作成します。作成が必要な最低限のファイルはindex.js, package.jsonです。

3-3. デプロイ

コードをローカルからCloudFunctionsへデプロイします。デプロイした際にTrigger URLが表示されますので、確認しておきましょう。

$gcloud functions deploy getWebPage --trigger-http --runtime nodejs8 --memory 1024MB --region us-east1 --service-account [service-account-name] --timeout 120
~
httpsTrigger:
  url: https://us-east1-all-spice-20200308.cloudfunctions.net/getWebPage

3-4. 実行

Cloud functionsをデプロイした際に出力されていた、httpsTrigger URLへ
Webブラウザからアクセスする事でCloud Functionsが実行されます。今回のプログラムの場合、グローバル変数にURLとアンカータグのCSSクラスを指定する事で、URL一覧を抽出します。
スクレイピングはサイトにより利用規約違反となりますので、用法を守って正しく利用しましょう。

4. その他

4-1. エラーへの対処

アップロードできるファイル量を超えてファイルアップロードを行った場合には以下の様なメッセージが出力されます。例えばローカルでpuppeteerを準備していた場合にそのままデプロイするとエラー出力されます。
この場合は.gcloudignoreにnode_modulesを追記し、アップロードの対象外として指定すればよいです。

ERROR: (gcloud.functions.deploy) Failed to upload the function source code to signed url: https://storage.googleapis.com/~~~.
 Status: [400:]

4-2. ログの確認

gcloudコマンドからでもCloud Functionsのログ確認が可能です。

$ gcloud functions logs read --limit 50

4-3. gcloudコマンド Referrence

コメントを残す

email confirm*

post date*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)