Artifact Registry プライベートリポジトリで Python 依存関係を管理する
はじめに
Google Cloud 上の Cloud Run にデプロイするコンテナや Compute Engine といったワークロードに依存関係をインストールする際、外部リポジトリへのアクセスを制限していたり、インストール対象のパッケージを特定してガバナンスを効かせたい場合など、プライベートリポジトリを利用したいケースがあるかと思います。
今回は、そのようなケースで利用可能な Artifact Registry でプライベートリポジトリを構成し、Python 依存関係を管理する検証をしてみました。
Artifact Registry とは
コンテナイメージやパッケージといったアーティファクトを一元的に保存し管理できるレジストリとして機能させることが可能な Google Cloud のマネージドサービスです。Docker や Python といったさまざまなアーティファクトタイプを格納し、単一のプロジェクトに複数のリポジトリを作成することが可能です。
Artifact Registry では以下の形式の保存が可能です。
- Docker
- Maven
- npm
- Python
- Apt
- Yum
- Kubeflow
- Go
詳細は以下をご参照ください。
やってみた
各種ワークロードから依存関係をインストールするために、外部リポジトリを参照せずに Artifact Registry のプライベートリポジトリを直接参照する検証を試してみます。
本検証では、Artifact Registry にプライベートリポジトリを作成し、Cloud Shell から Artifact Registry リポジトリに Python のパッケージを push、Artifact Registry リポジトリを参照して Cloud Shell に Python のパッケージをインストール、という簡易的な構成で検証します。
手順は以下を参照しています。
Artifact Registry でリポジトリを作成する
まずは Artifact Registry に、 Python のパッケージを管理するためのプライベートリポジトリを作成していきます。リポジトリの作成には Artifact Registry リポジトリ管理者 (roles/artifactregistry.repoAdmin) の権限が必要となりますが、本検証ではオーナー権限を持つユーザーで作業します。
Cloud Console から [Artifact Registry] -> [リポジトリ] を選択し、[リポジトリを作成] をクリックします。
以下のように設定し、画面下部の [作成] をクリックします。
- 名前: 任意のリポジトリ名を指定。今回は
private-python-package-repo
とした。 - 形式: Python を指定。
- モード: 標準 を指定。標準リポジトリは非公開アーティファクト用のリポジトリで、イメージやパッケージのアップロードとダウンロードが可能。
- ロケーションタイプ: リージョン か マルチリージョン を指定。今回はリージョンを指定し、
asia-northeast1
とした。
作成したリポジトリが表示されていることが確認できます。
Python パッケージをアップロードする
Python パッケージをアップロードするには Twine が必要となります。 Twine は Python パッケージを PyPI などのリポジトリにアップロードすることができるツールです。
Cloud Shell から以下を実行し、Twine をインストールします。
pip install twine
PyPI によって提供されるサンプルパッケージである sampleproject
を Cloud Shell にダウンロードします。
pip download sampleproject
Cloud Console から [Artifact Registry] -> [リポジトリ] を選択し、先ほど作成したリポジトリ名をクリックします。上部にあるディレクトリ名の横にあるコピーマークをクリックし、Artifact Registry リポジトリの URL を取得します。
コピーした URL を含めた以下コマンドを実行します。sampleproject-3.0.0-py3-none-any.whl
は先ほどダウンロードした sampleproject
のパッケージファイル名です。
python3 -m twine upload --repository-url <Repository URL> sampleproject-3.0.0-py3-none-any.whl
Cloud Console からリポジトリを確認すると、sampleproject
パッケージがアップロードされていることがわかります。
Artifact Registry リポジトリを参照してパッケージをインストールしてみる
Cloud Shell を利用して Artifact Registry のプライベートリポジトリを参照した pip install を試してみます。(sampleproject は 他の依存関係が必要となりますが、今回は検証のために --no-deps
で無視しています)
$ pip install --index-url <Repository URL> sampleproject --no-deps
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: <Repository URL>
Collecting sampleproject
Downloading <Repository URL>/sampleproject-3.0.0-py3-none-any.whl (4.7 kB)
Installing collected packages: sampleproject
Successfully installed sampleproject-3.0.0
$ pip list | grep sampleproject
sampleproject 3.0.0
Artifact Registry のプライベートリポジトリからパッケージをダウンロードしてインストールされたことがわかります。
なお、pip 構成ファイルを利用して --index-url
を指定せずにプライベートリポジトリのみを検索するように設定することも可能です。詳細は以下をご参照ください。
おわりに
今回は Cloud Shell で簡易的に検証しましたが、Compute Engine や Cloud Run などから Artifact Regsitry リポジトリを直接参照させる構成が可能です。その際、サービスアカウントで適切な権限を付与したり、VPC Service Controls で適切なサービス境界を設定するといった対応が必要になるためご注意ください。
それぞれのサービスからの接続方法については以下ドキュメントをご参照ください。