コンテンツに移動
デベロッパー

Google Cloud Functions での Artifact Registry の限定公開リポジトリの使用

2021年9月7日
Google Cloud Japan Team

※この投稿は米国時間 2021 年 8 月 21 日に、Google Cloud blog に投稿されたものの抄訳です。

昨年末、Google は、Artifact Registry が一般提供に移行し、GCP のお客様がデプロイされているのと同じプラットフォーム内でパッケージを管理できるようになることを発表しました。このブログ投稿では、この処理をプライベート依存関係を使用して行う方法について説明します。

プライベート依存関係を使用すると、パッケージを限られた閲覧者グループとのみ共有できます。コードベースがすでにプライベートである場合、プライベート依存関係は、オープンソース プロジェクトと同じ方法論を使用して機能をモジュール化するのに役立ちます。さらに、依存関係のバージョンを作業中のリリースに固定することで、コードベース全体を壊すことなく、プライベート依存関係を実験的に開発できます。また、複数のプロジェクトが同じ機能に依存している場合は、必要かつ耐久性の高い抽象化を行えます。これは、断片化したコード スニペットをコピーして貼り付けるのではなく、複数のチームが最新のテスト済みコードにアクセスできるようにすることで実現します。

Artifact Registry を使用することで、Google Cloud Platform を離れることなく、サーバーレス プロセスをプライベート依存関係と結び付けられるようになりました。このブログ投稿では、プライベート依存関係をホストし、後で Cloud Build を使用して Google Cloud Functions などのサーバーレス ホストにデプロイすることにより、デプロイを自動化する方法の一例について説明します。

始める前に、ここでサンプルコードを参照してコピーし、これに沿って手順を進めてください。

パッケージを作成する

Node で記述された単純なプライベート依存関係を使用して、Google Cloud Functions の関数をデプロイする方法を見ていきましょう。この依存関係の例では、Unicode で指定された入力が返されます。index.js ファイルは次のようになります。

読み込んでいます...

まず、Artifact Registry にアップロードするパッケージを準備します。Node の場合、このパッケージにはパッケージに関するエントリ ポイントと情報を指定する package.json ファイルが必要です。コマンド npm init -y を実行すると、以下のような簡単なファイルを作成できます。

パッケージの名前には、スコープを指定する必要があります。スコープを使用すると、パッケージをグループ化できます。これは、プライベート パッケージを公開する場合に役立ちます。スコープなしで公開すると、リポジトリがデフォルトで公開されます。このブログ投稿では、@example というスコープを使用しますが、実際にはプライベート依存関係のグループ(会社、チーム、プロジェクトなど)にちなんで名前を付けます。

読み込んでいます...

このファイルのもう 1 つの重要な詳細事項は、devDependencies プロパティに、Google Artifact Registry への認証の依存関係が含まれていることです。認証するには、このチュートリアルの後半の scripts セクションにあるコマンドを使用します。

パッケージを Artifact Registry にアップロードして認証を設定する

これらのガイドの手順に沿って、Artifact Registry に npm パッケージ リポジトリを作成します。その際、npm の構成やリポジトリの push は不要です。次に、.npmrc ファイルを構成します。これを行うには、.npmrc という名前の空のファイルをリポジトリのベースに追加するだけです。作成したレジストリにデプロイするようにこのファイルを構成するには、次のコマンドを実行して、出力を .npmrc ファイルに追加します(注: コマンドを実行する前に、Google Cloud SDK をインストールする必要があります)。

読み込んでいます...

出力を .npmrc ファイルにコピーします。最終的には次のようになります。<projectId> を Google Cloud Platform のプロジェクト ID に置き換えてください。

読み込んでいます...

次に、パッケージを Artifact Repository に push します。これを行うには、次のコマンドを実行します(上記の package.json ファイルから scripts セクションをコピーしたことを確認してください)。

読み込んでいます...

このコマンドを使用すると、リポジトリを push するときにアクセス トークンを更新できます。

その後は、次のコマンドを実行して公開するだけです。

読み込んでいます...

Google Cloud Platform ダッシュボードの Artifact Registry でリポジトリを検索すると、ライブラリがデプロイされたことを確認できます。

Google Cloud Functions の関数を設定する

Artifact Registry にリポジトリを設定したら、その上へのアプリケーションの構築を開始できます。Google Cloud Functions の関数のような簡単なサーバーレスの例を見てみましょう。

読み込んでいます...

この簡単な Cloud Functions の関数では、プライベート依存関係を使用して、指定した URL に Unicode で「Hello World」と出力します(このチュートリアルでも同じ例を使用しています)。しかし、Cloud Functions の関数はどのようにしてプライベート依存関係を正常に pull するのでしょうか。これには、元のリポジトリで作成した .npmrc ファイルを使用します。

実際の動作を確認するには、簡単な Google Cloud Functions の関数を作成する手順に沿ってください。チュートリアルに従う際、次の 3 つの重要な要素が関数に含まれていることに注意してください。

  1. チュートリアルに沿って index.js ファイルを作成すると、ファイルはリポジトリのベースに存在し、上の例のように Artifact Registry で設定したプライベート依存関係を使用しているはずです。

  2. package.json に次のことが表示されます。

    • Artifact Registry にリストされているバージョンとの依存関係

    • Artifact Registry で認証するスクリプト(依存関係と同様)

読み込んでいます...

3. また、最も重要なのは、.nmprc ファイルをこの Google Cloud Functions の関数のベースにコピーして、npmrc トークンを認証することです。

次に、以下のコマンドを使用して、この関数をデプロイします。

読み込んでいます...

実際の動作を確認するには、(チュートリアルの)http トリガーリンクをたどり、Unicode で入力を確認してください。

Cloud Functions を自動化して保護する

上記のコマンドは関数をデプロイしますが、そのために、.npmrc ファイルでトークンを公開し、関数が再デプロイされるたびにユーザーに手動での再認証を要求します。安全な方法で関数の再デプロイを自動化するために、cloudbuild.yaml ファイルを Cloud Functions パッケージのルートに追加できます。

まず、.npmrc ファイルを変更するヘルパー関数を作成することから始めましょう。次のファイルを Cloud Functions パッケージのルートに保存して、npmrc-parser.js という名前を付けます。

読み込んでいます...

次は、Cloud Build ファイルを作成しましょう。これを行うには、ディレクトリのルートにある次のファイルをコピーして、cloudbuild.yaml という名前を付けます。

読み込んでいます...

ビルドファイルの最初の 2 つの手順では、プライベート依存関係を認証し、プロジェクトにすべての依存関係をインストールします。3 番目の手順では、上の手順で作成したカスタム ヘルパー関数を呼び出し、.npmrc ファイルを準備します。この関数は 2 つの引数、pathToAuthToken と pathToNpmrc を取ります。pathToAuthToken は、.npmrc ファイルの authToken 割り当ての左側です。プロジェクト ID を projectId に置き換えると、次のようになります。

読み込んでいます...

pathToNpmrc は、.npmrc ファイルを保存した場所にあります。この場合、値は次のようになります。

読み込んでいます...

このビルド手順では、ファイルのトークン値を削除して変数に保存し、.npmrc ファイルを環境変数 TOKEN に置き換えます。そのため、Cloud Functions は実際のトークンをソースコードに保存せず、ローカルに保存されている .npmrc ファイルは次のようになります。

読み込んでいます...

ビルドファイルの最後の手順では、関数を再デプロイします。その際、.npmrc ファイルの環境変数を、先ほど作成したトークン値に置き換えます。ビルド手順を実行するには、トリガーを設定するか、以下のコマンドを手動で実行して、上記で説明したように変数を置き換えます。

読み込んでいます...

実行する前に、Cloud Build 機能に適した権限を設定していることを確認してください。

これですべての設定が完了です。このように設定すると、Google Cloud Functions の関数は、外部のパッケージ マネージャーをホストせずに、手動でのデプロイ手順もなしに、Artifact Registry からプライベート依存関係を取得できます。

プライベート依存関係の公開を自動化する

ローカル パッケージの Artifact Registry へのデプロイを高速化するために、変更がパッケージに保存されたときに公開イベントをトリガーする Cloud Build ファイルを Artifact Registry パッケージに追加することもできます。こちらのセットアップ手順に沿うこともできますが、プライベート依存関係に存在するサンプルの cloudbuild.yaml ファイルのスニペットを次に示します。

読み込んでいます...

他の言語とランタイムについて

このブログ投稿は Node.js に焦点を当てていますが、Cloud Functions と Artifact Registry は、Python や Java などの他のランタイムもサポートしています。たとえば、Python の場合、モジュールを Python にデプロイする手順は、複雑さの面で Node とそう変わりありません。プライベート依存関係を準備して、Artifact Registry に公開したら、上で説明したような Google Cloud Functions の関数の作成を Python で開始できます。次に、これらの依存関係をローカルでフェッチしてパッケージ化する必要があります。


-デベロッパー プログラム エンジニア Sofia Leon

-テクニカル ソリューション エンジニア Martin Skoviera

投稿先