Google Cloud Functionsで、GitHubのprivateリポジトリにある自作ライブラリを使う方法

初めまして、ピリカ開発チームの九鬼と申します。

Google Cloud Functions(以後、GCF)でアプリをデプロイするとき、Cloud Build環境でSSHキーにアクセスできません。そのため、GitHubのprivateリポジトリにアクセスできないので、アプリのソースコード上に自作ライブラリをあらかじめ組み込んでおく必要があります(公式リファレンス)。

しかしながら、pip install -tでインストールした方法ではいくつか問題があります。

そこで本記事では、ライブラリをwhlに固めてから組み込む方法を紹介します。

自作ライブラリのソースコードをpip install -tで組み込む問題点

Pipfile, requirements.txtなどで依存ライブラリを一元管理できなくなります。また、自作ライブラリの依存ライブラリがアプリのソースコード下に組み込まれてしまいます。

同じライブラリを二重にインストールすることがあるので、デバッグが困難になり得るほか、アプリの容量が肥大化します。

自作ライブラリをwhlで組み込む

whl形式は自作ライブラリの依存ライブラリ一覧も入っているため、前述の問題が解決されます(whlのデータ構造については、付録をご覧ください)。

1. 自作ライブラリからwhlを生成する

自作ライブラリをwhlに変換するには以下のコマンドを使用します。

※ wheelライブラリが必要なので、必要に応じインストールください。

$ python setup.py bdist_wheel

これにより (ライブラリ名)-(バージョン)-py3-none-any.whl などの形式でwhlが生成されます。

2. アプリに自作ライブラリのwhlを依存関係に追加する

whlをアプリのディレクトリ内に組み込み、Pipfileやrequirements.txtにwhlを追加します。

  • pipenv(Pipfile)の場合

以下のコマンドを実行して、Pipfileに追加します。

$ pipenv install ./path/to/(whl名).whl

pipenv install後のPipfile

...(前略)...

[packages]
(パッケージ名) = {path = "./path/to/(whl名).whl"}

...(後略)...
  • requirements.txt

仮想環境ツールを使う、あるいは直接requirements.txtに追記します。

※ 仮想環境を使っている場合も、デプロイまでにrequirements.txtにwhlを追記しておく必要があります。

...(前略)...

./path/to/(whl名).whl

...(後略)...

以上により、GCFのデプロイ時に自作ライブラリがインストールされるようになります。pipはwhlのRequires-Distに書いている依存ライブラリを見て依存関係を解決するため、アプリおよび自作ライブラリで依存関係が干渉するリスクが軽減されます。

付録:whlのデータ構造

whlには、ライブラリのソースコードおよびメタデータをバイナリで保持しています。whlはZIPフォーマットなので、ZIPで解凍できます(公式リファレンス)。中を見てみると、

が入っています。ライブラリのメタデータの中には最低でも以下のファイルが入っています。

  • METADATA: ライブラリの概要情報。バージョン、ライブラリ名、作成者情報などが入っている
    • 依存ライブラリの一覧は、METADATAのRequires-Distに記載されている
  • RECORD: whl内ファイルのsha256以上のハッシュ値があり、whlの整合性が問題ないかの確認に使う
  • WHEEL: whl形式のバージョンや生成方法など

METADATAの例は以下となります。

Metadata-Version: 2.1
Name: (ライブラリ名)
Version: (ライブラリのバージョン)
Summary: (ライブラリの説明文)
Home-page: (ライブラリ制作元の管理ページ)
Author: (ライブラリ製作者名)
License: (ライブラリのライセンス)
Platform: ([ライブラリが対応するCPUアーキテクチャ。ソースコードおよび依存関係でC言語拡張を含む場合、明示的に指定が必要になる](https://www.python.org/dev/peps/pep-0425/))
Requires-Dist: google-cloud-tasks (==1.5.0)

以上、ご覧いただきありがとうございました!