Google Cloud Functions (Python) から Cloud Firestore の データを 読み出す – Cloud SDK を使う方法 と Firebase Admin SDK を使う方法 –

Cloud Firestore を Python で作成した Cloud Functions から利用するには 活用する SDK 別に以下の2つがあります。 Cloud SDK を使う方法 Firebase Admin SDK を使う方法 両者に特に メリット / デメリット があるわけではなさそうですが、少し紛らわしい部分もありますので、 簡単なサンプルコード を用いて整理していきたいと思います。 前提 本記事は以下を前提としてすすめていきます。 Cloud SDK インストール 済み Firebase Admin SDK インストール 済み Cloud Firestore データベース作成 済み これらについては、以下の記事も参考にしてください。 Cloud Firestore の内容を Read する データ 登録済みの Cloud Firestore のデータを Python で作成した Cloud Functions で読み出してみます。 Read する Cloud Firestore データ の内容 今回読み出してみる Firestore のデータを GCP Console からみてみます。名前 フィールド のみを持つ シンプル な データ 構造となっています。 ちなみに Firebase Console からみてみても、同じ データ を確認することができます。 ベース となる 関数の準備 次に、 ベース となる 最小構成の Python 関数を作成していきます。 この関数を以下の コマンド で Functions Framework を用いて ローカル 環境で実行してみます。 http://localhost:5000 にアクセスしてみると、以下の結果が表示されます。 Python Client for Google Cloud Firestore の インストール Cloud SDK を用いる方法を進める前に … Read more

Google Secret Manager に 辞書型データを格納し、Cloud Functions から アクセスする方法

こちらの記事 で Google Secret Manager に パスワード や API キー といった 「他者に知られたくない」あるいは 「公開したくない」 情報を格納する方法を紹介しました。 今回はより実践的な管理方法として 辞書型 の データ を Secret に登録して Python で 作成した Cloud Functions 関数 で 意図通り 辞書型 として扱う方法について紹介していきます。  前提 本記事を読みすすめるにあたっては、以下を実施済みであることが前提となっています。 Python 開発環境の設定 サービスアカウント作成済み Secret Manager API の有効化 Secret Manager への アクセス ロール 付与済み これらが未実施の場合は 以下の 関連記事 を参照してください。 Secret の作成 それでは早速 辞書型の データ を Secret Manager に登録していきます。本記事では 以下のような 構造をもつ Dict 型 の データ を登録してみます。 以下の リンク を クリック して GCP コンソール から Secret Manager を表示し、「 シークレットを作成 」を クリック します。 https://console.cloud.google.com/security/secret-manager シークレット の詳細として 以下を設定します。 名前: 任意の名称(ここでは、 my-dict-secret ) シークレットの値: 上述した 辞書型 の データ 他の項目は デフォルト のままで 「シークレット を作成」 をクリックし、 Secret の作成を完了させます。 Secret 作成後 Secret の値を確認してみます。 特に フォーマット が変換されることもなく、そのままの テキスト … Read more

Google Secret Manager で パスワードや API キー などの秘匿情報を管理し Cloud Funcitons から参照する方法

ソフトウェアデベロッパー にとって、 パスワード、 APIキー、 認証情報 といった秘匿情報の管理は頭を悩ませる問題の一つといえます。 開発環境と本番環境では別の情報を用いる必要があることが殆どだと思いますし、 このような秘匿情報を誤って公開 Repository にコミットしてしまうと、 様々な被害を被る危険性があります。 一方で、秘匿情報をローカルで管理すると、 紛失のリスクや、バージョン管理面での不都合などが生じてしまいます。 その問題に対処すべく Google Cloud では Secret Manager を使うことで、 秘匿情報を安全に管理する方法を提供しています。 本記事では、 Secret Manager に サンプルの API キー を格納し、 Python で作成した Cloud Functions から参照する方法を紹介します。 引用元: https://cloud.google.com/secret-manager/ 本記事の概要 本記事では以下を実施していきます。 シークレット バージョン の作成 Python で作成した Cloud Functions 関数から 事前に作成した シークレット バージョン の値を取得 なお、“シークレット バージョン” という呼称は、個人的に少し馴染みが無いため以下のように捉えています。 「パスワードなどの秘匿情報 = (Secret) をバージョン管理したもの」 前提 なお本記事を読みすすめるにあたっては、以下を実施済みであることが前提となっています。 Python 開発環境の設定 サービスアカウント作成済み 参考記事: Secret Manager を利用するための準備 Secret Manager API の有効化 まずは、 Secret Manager API を有効化します。この API を有効化することで、後述する Secret Manager を使って シークレット バージョン を管理することができるようになります。 GCP コンソール から以下のように遷移し有効にしていきます。 既存 サービスアカウント への Secret Manager への アクセスロール 付与 次に、Secret Manager にアクセスできるようにしていきます。最初に Secret Manager 関連のロールにどのようなものがあるのかを確認していきます。 Secret Manager 関連ロール Secret Manager 関連ロールには以下が用意されています。今回は、作成済みの シークレット に Cloud Functions … Read more

[GCP Cloud Functions Tutorial] First Python(関数の作成、デプロイ、テスト、関数の削除)

GCP の サーバーレスコンピューティング サービス の一つである、 Cloud Functions について、 Python で作成した プログラム を動作させるための チュートリアル 、最初の関数: Python (First Python) について解説していきます。 別途解説した、Python クイックスタートが GCP 上ですべて完結していたのに対し、最初の関数: Python は ローカル で開発、テストしたものを GCP に デプロイ するという、より実践的な内容となっています。 事前準備1、事前準備2が完了していることが前提となりますので、そちらがまだの場合は是非先にご参照ください。 Cloud SDK を使用した GCP プロジェクトの作成 ここでは、以下を実施します。 GCP プロジェクト の作成は事前準備1を参照してください。 GCP プロジェクト の作成 Cloud SDK の インストール Cloud SDK の インストール チュートリアル の通りに、 gcloud コマンドを用いてインストール します。 既に インストール 済みの場合でも、以下のように更新を見つけることができますので、更新したほうがよさそうです。 なお、更新前の バージョン に戻したい場合は、以下の コマンド で戻すことができるようです。 関数の作成 それでは、ローカル 環境に関数を作成していきます。今回は first-python ディレクトリ を作成し、その中で作業していきます。 作成した helloworld ディレクトリ 内に main.py という名称で、 チュートリアル に掲載されている ソースコード を作成します。 依存関係の指定 python の実行に必要な ライブラリ 依存関係 を pip で管理するために、 requirements.txt を作成します。こちらも、 チュートリアル に掲載されている内容 のままで作成していきます。 以上で最小構成となる Cloud Funtions 用の python 関数 の作成が完了となります。 関数のデプロイ 作成した 関数 を GCP Cloud Functions に デプロイ していきます。 … Read more

[GCP Cloud Functions Tutorial] Python クイックスタート(関数の作成、デプロイ、テスト、関数の削除)

GCP のサーバーレスコンピューティングサービスである、 Cloud Functions について、 Python で動作させるためのチュートリアル、Python クイックスタートについて解説していきます。 事前準備1、事前準備2が完了していることが前提となりますので、そちらがまだの場合は是非先にご参照ください。なお、各見出しに対応するチュートリアルページへのリンクを設定しています。 関数を作成する GCP コンソール左上のハンバーガーメニューを下にスクロールしていくと、「サーバーレス」セクションの中に「Cloud Functions」がありますので、これをクリックして、 Cloud Functions を作成していきます。 余談ですが、ピンアイコンをクリックすることで、そのサービスがリストの上に固定表示されるようになります。GCP のサービスは数も多いので、よく使うサービスの場合はピン留めしておくと便利です。 「関数を作成」をクリックします。 次に、関数の基本情報を設定します。チュートリアルに記載されている内容に従って必要な項目を埋めていきます。チュートリアル上の手順6番までを実施することになります。 「リージョン」に関しては、後から変更できないため、適切なものを検討した上で選択してください。 なお「ランタイム、ビルド、接続の設定」はこのタイミングでは特に変更する必要はありません。「保存」をクリックした後、画面の一番下に出現する「次へ」ボタンをクリックして関数のコードを記載する画面を表示します。 ここでは、チュートリアルの残りの手順(7、8)を実施していきます。 手順が前後してしまいますが、まずは「ランタイム」プルダウンから使用したいランタイムを選択します。ここでは、Python 3.9 を選択して進めていきます。 ランタイム選択前はデフォルトの Node.js 14 に関するコードが表示されていましたが、Python 3.9 選択後は Python 3.9 のものに更新されます。 サンプルコードの内容 チュートリアルでは触れられていませんが、ここで簡単にサンプルコードの内容を見ていきます。 main.py Cloud Functions の関数は基本的に Web の API として動作することを想定していて、デフォルトで用意されているものはFlaskフレームワークを用いています。このチュートリアルでは ここで定義した hello_world というエンドポイントをデプロイすることになり、API 呼出し時の情報は request 変数に格納されることになります。 最初に、 request_json 変数に、呼出し時の情報を JSON化します。 次に、API呼出し情報にパラメータがあり、そのパラメータ名が message なら、そのmessageパラメータに指定された内容をそのまま呼出し元に返すようにしています。 同様に、JSON化した際に、message が存在した場合にも同様の処理を施すようにしています。前者がGETによるクエリパラメータへの対応で、後者がJSON形式でのPOSTへの対応となっています。(後ほど、それぞれテスト動作させてみます) API呼出し情報に message パラメータが存在しない場合は、Hello World! を返します。 requirements.txt 初期段階では本ファイルはコメント行があるのみの状態です。 関数をデプロイする デプロイするには画面下部の「デプロイ」をクリックします。 デプロイには1〜2分ほどかかります。デプロイが完了すると、以下の様にリスト表示されます。それでは、デプロイした関数をテストして動作をみていきます。「操作」列の3点リーダーをクリックして、「関数をテスト」をクリックします。 関数をテストする テスト画面が表示されます。まずは、そのまま、「関数をテストする」をクリックしてみます。これは、パラメータなしで関数を呼び出すことになりますので、さきほどコードを見たとおり、 Hello World! が返ってくることが期待値になります。 テストが完了すると、「出力」と「実行ログ」が表示されます。期待値通り、 Hello World! と表示されていることが確認できます。 JSON形式POST 次に、JSON形式のPOSTをした場合の動作をテストしてみます。message パラメータに指定された内容がそのまま返ってくることが期待値になります。 こちらも期待どおりの動作が確認できます。 エンドポイントへのGET確認 チュートリアルには言及がありませんが、ブラウザでエンドポイントにアクセスして動作を確認してみます。 関数一覧から、関数名をクリックして「関数の詳細」を表示します。 「トリガー」タブを選択すると、エンドポイントのURLが記載されていますので、これをコピーしてブラウザに貼りつます。 パラメータ指定がないため、 期待値の Hello World! が表示されました。 パラメータを指定してみます。こちらも期待通りの結果となりました。 ログを表示する テスト実施時のログを確認してみます。関数一覧のページの操作列、「ログを表示」をクリックします。 各種ログが表示されます。赤枠で囲った「クエリ」部分に、プロジェクトやCloud Functions といった情報であらかじめフィルタリングされた状態でログが表示されています。 関数を削除する 最後に、チュートリアルには言及がありませんが、関数を削除します。チュートリアルということもあり、未認証でもアクセスできてしまう状態で進めていますので、忘れない内に削除しておかないと、何かがきっかけで想定外の請求が来てしまいかねないリスクは回避したいところです。Cloud Functions では、有効・無効を切り替えるようなことはできないようなので、削除することにします。 関数一覧のページの、操作列「削除」をクリックします。 「削除」をクリックします。削除してしまうと関数内のコードは失われてしまうので、必要に応じて手元にコピーするなどバックアップ対策を講じてください。 なお、一時的に無効化する Tips としては、単純にコード全体をコメントアウトするのが現実解のようです。 参考: https://stackoverflow.com/questions/43681644/is-there-a-way-to-stop-disable-a-google-cloud-function まとめ … Read more

[GCP Cloud Functions Tutorial] Pythonクイックスタート(事前準備編2:API有効化)

事前準備編1に引き続き、ここでは、Cloud Functions APIとCloud Build API を有効化していきます。 APIの有効化 まずは、作成したプロジェクトでのAPI 状況を確認するため、GCP コンソール左上のハンバーガーメニューから、「APIとサービス」→ 「ダッシュボード」をクリックします。 すると、APIとサービス画面が表示されます。画面上部の「+ API とサービスの有効化」をクリックします。 Cloud Functions API の有効化 検索窓に「Cloud Functions」と入力すると、”Cloud Functions API” が表示されますので、これをクリックします。 「有効にする」をクリックし、このAPIを有効にします。 API 有効化後の画面です。画面上部に「認証情報」を促すメッセージが表示されています。後述しますが、結果的にこの後有効化する Cloud Build API 含め、認証情報の作成は不要になります。 Cloud Build API の有効化 「←」をクリックして、API ライブラリに戻り、先程同様検索窓に「 Cloud Build 」と入力すると、 ”Cloud Build API” が表示されますので、これをクリックします。 この API も先程同様「有効にする」をクリックし、有効にしていきます。 「認証情報」ページに戻り、サービスアカウントが作成されていることを確認します。サービスアカウントは [プロジェクト名]@appspot.gserviceaccount.com というフォーマットがデフォルトで作成されます。 認証情報の作成要否について Cloud Functions API, Cloud Build API を有効化した際に、「認証情報が必要になる可能性がある」旨表示されます。ここでは、認証情報とはなにか?また、必要なのか?について確認してきたいと思います。 まず、GCP コンソールの「 API とサービス」→「認証情報」と進みます。 表示される認証情報画面には認証情報が存在していないため、「+認証情報を作成」→「ウィザードで選択」と進んで認証情報を作成していきます。 認証情報について 認証情報を作成する前に、ここで作成しようとしている認証情報について説明します。 GCP では、 API のアクセス制御として以下の種別を用意しています。 認証( authentication ):ユーザの識別 認可( authorization ):ユーザが実施できることを制限 監査( auditing ):ユーザが実施したことを記録 ここでは、この内の「認証」を設定しようとしていることを念頭においておいてください。 詳細は、公式サイト「認証の概要」を参照してください。 認証情報の種類 画面に戻って認証情報を作成していきます「使用する API 」には「 Cloud Functions API 」を選択します。 「アクセスするデータの種類」は「アプリケーションデータ」を選択し、当然ですが Cloud Functions で Cloud Functions API を利用する予定があるため、「はい、使用しています」を選択します。(予定を聞かれているのですが、過去形で回答せざるを得ないのはご愛嬌ですね) 「次へ」をクリックすると、以下の画面が表示されます。「完了」をクリックして、認証情報の作成を完了します。 このように、結果的に今回のチュートリアルを進めるにあたっては「認証情報の作成」は不要であることが確認できました。 まとめ 事前準備編1に引き続き、残りの事前準備として以下を実施しました。 Cloud Functions API の有効化 Cloud Build API の有効化 また、「認証情報」と何か?について簡単に確認しつつ、Python クイックスタートを進めるにあたっては「認証情報」の作成が不要であることが確認できました。 これで、やっと本題である … Read more

[GCP Cloud Functions Tutorial] Pythonクイックスタート(事前準備編1:プロジェクト作成、課金有効化)

GCP Cloud Functions のチュートリアル、最初の入口である「Python クイックスタート」ですが、Cloud Functions に触れるまでに以下のような事前準備が必要になります。 プロジェクトの作成 課金の有効化 必要なAPIの有効化 認証情報の作成 今回の一連の投稿はイチから始めることを想定しているので、すべて解説していこうと思います。ここでは、1. と 2. について解説していきます。 プロジェクトの作成 Cloud Functions に限らず、 GCP で何かを動かす場合には「プロジェクト」を作成することになります。以下の URL から、プロジェクトダッシュボードを表示し、「プロジェクトを作成」をクリックしてプロジェクトを作成していきます。 https://console.cloud.google.com/projectselector2/home/dashboard?hl=ja プロジェクト名などを適宜入力して、作成をクリックします。 今回は「Sample for Blog」という名前でプロジェクトを作成してみました。 次に課金の有効化を実施していきます。 課金の有効化 GCP を利用するためには、お試し利用であれ、課金を有効化する必要があります。クラウドコンピューティングとはいえ、実際にはどこかにあるデータセンターにあるサーバを稼働させることになるため、ここは当然と言えば当然といえます。私自身もそうでしたが、特に個人で利用しようと思ったときの最初の大きな(主に心理的な)ハードルはここかもしれません。 なお課金の有効化というと、いきなり請求されてしまうように思う方もいるかもしれませんが、GCP には、毎月の無料枠というものが存在します。例えば、 Cloud Functions に関しては、執筆時点では以下が無料枠として定義されています。 200 万回の呼び出し(1 か月あたり、バックグラウンド呼び出しと HTTP 呼び出しを含む) 400,000 GB 秒、200,000 GHz 秒のコンピューティング時間 5 GB の下り(外向き)ネットワーク(1 か月あたり) お試しの関数を少し動作させる程度であればよほどのことが無い限り請求されることはないのではないかと思います。詳細については、https://cloud.google.com/free/docs/gcp-free-tier/?hl=ja#cloud-functionsを参照ください。 前置きが長くなりましたが、課金の有効化を進めていきます。 GCP コンソールから「お支払い」をクリック GCP のコンソールで作成したプロジェクトが表示されていることを確認し、左上のハンバーガーアイコンをクリックし表示されるメニューから「お支払い」をクリックします すると、以下のような画面が表示されます。ここでは、請求先アカウントを新規作成していこうと思いますので、「請求先アカウントを管理」をクリックします。 そうすると、「課金」という画面が表示されます。ここで、「アカウントを作成」をクリックして、請求先アカウントを作成していきます。 名称、国を設定し、「続行」をクリックします。ここでは、名称として「sample for blog の請求先」という名称を設定しました。 次に、支払い方法を設定する画面になりますので、支払い方法を設定します。クレジットカードを追加する場合は、以下のような情報を入力することになります。 支払い方法を設定したら、「送信して課金を有効にする」をクリックすることで、課金が有効になります。 課金を有効にした後、再度 GCP コンソールの左上のハンバーガーメニューから「お支払い」をクリックして、課金情報の内容を確認していきます。 すると、請求先アカウントに先程作成したものが追加されていることが確認できます。 なお、ヘルスチェック列に電球アイコンがついており、警告があることを教えてくれますので、この電球をクリックして内容を確認してみます。 1つ目の「予算アラート」に関しては必要に応じて設定することで、突然の予想外の請求を防ぐことができますので、設定しておくのが良いと思います。 2つ目に関しては、この後プロジェクトにリンクすることで警告が消えます。 請求先アカウントをプロエジェクトにリンク 作成したプロジェクトに、これまた作成した請求先アカウントをリンクしていきます。再び、 GCP コンソールから「お支払い」をクリックします。 先程は、「請求先アカウントを管理」をクリックして請求先アカウントを作成しましたが、今回は、「請求先アカウントをリンク」をクリックして、作成した請求先アカウントをプロジェクトにリンクします。 プルダウンから、作成した請求先アカウントを選択し、「アカウントを設定」をクリックします。 この画面が表示されると、リンクの設定が完了しています。 ここで、再度 GCP コンソールから「お支払い」をクリックします。 すると、パッと見先程と同じ様に見えますが、左側の文言が「リンクされた請求先アカウントに移動」に変わっていますので、これをクリックします。 先程の、作成直後と同じ画面にきました。 同じ画面に「請求のヘルスチェック」という項目があるので、「すべてのヘルスチェックを表示」をクリックしてみます。 請求先アカウント作成直後は2つとも電球アイコン(=警告)でしたが、2つ目はリンク済みのためOKになっています。 投稿のボリュームもいい感じになってきたので、 API の有効化以降の事前準備は投稿を分けてご紹介することにします。 まとめ 事前準備として以下を実施しました。 GCP プロジェクトの作成 作成したプロジェクトへの課金有効化 ここまでの内容はチュートリアル上では、たった2行の内容なのですが、1から始める場合は中々のボリュームですね。しかも、抵抗感のある「課金の有効化」という作業もあるため、二の足を踏んでしまいがちですが、本投稿が一歩踏み出す助けになれれば幸いです。 関連

GCP Cloud Functions チュートリアル 解説

本記事では、 GCP Cloud Functions チュートリアル を実際に進めていきながら、初心者の方でもわかりやすいように、公式 サイト での説明が少し不足している部分などを中心に補足しながら、実際に進めていきます。なお、以前ご紹介したとおり、 Google が提供する Serverless Computing には、以下の2種類が存在します。 サーバサイド に フォーカス した、 GCP Cloud Functions モバイルデバイス に フォーカス した、 Cloud Functions of Firebase 今回の一連の投稿では、「 サーバサイド に フォーカス した、 GCP Cloud Functions 」の実装を、 チュートリアル の内容に沿って進めていきます。なお、関数の記述には Python を使うことにします。 なお、公式サイト上は「 クイックスタート 」や「 入門ガイド 」といった表現が使われていますが、本ブログではすべて「 チュートリアル 」として表現させていただきます。 チュートリアル サイト https://cloud.google.com/functions/docs/quickstarts?hl=ja シリーズ 記事一覧 チュートリアル 概要 事前準備(1) プロジェクト作成、課金有効化 事前準備(2) API 有効化、その他(認証情報について) Pythonクイックスタート Pythonで記載した簡単な関数をデプロイする。事前準備として、プロジェクト の作成、課金の有効化、 API の有効化が必要。 最初の関数: Python Python クイックスタート が GCP 上で全て完結していたのに対し、こちらは、 ローカル の開発環境で、 Cloud SDK を用いて Cloud Functions を開発する チュートリアル になっています チュートリアル一覧