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