Google Cloud Storageで作るリポジトリサーバ

投稿日:  更新日:

リポジトリサーバをGoogle Cloud Storageで構築する方法です。

Remote Repositoryの詳細は「Remote Repositoryの構築と参照」を参照してください。

スポンサーリンク

Google Cloud Storageとは

Googleはクラウドベースの様々なプロダクトを開発しています。これを総称してGoogle Cloudと言います。

Google Cloudのプロダクト

そして、プロダクトの一部をユーザに提供しています。その一つがGoogle Cloud Storage(GCS)です。ストレージサービスのプロダクトになります。

ストレージサービスですから、クラウド上にデータを保存する場所が提供されます。

同様なサービスはGoogle以外も提供しています。例えば、Amazon S3(Simple Storage Service)やGitHubもそれに当たるでしょう。

GCSの大きな特徴(他との違い)は次の通りです。

  ・従量課金(データの記憶容量、転送量、操作量に対する)
  ・記憶容量は無制限
  ・ストレージの地理的な場所を選択可能

さらなる詳細は「Cloud Storageドキュメント」を参照してください。

スポンサーリンク

Google Cloudの操作環境

一般ユーザがGoogle Cloudを簡単に使えるように、Google Cloud Platform(GCP)という環境が用意されています。

GCPを通してGoogle Cloudを操作する方法は2つあります。

  ・Google Cloud Console
  ・コマンドラインツール
—> GUI(グラフィカル)による操作
—> CUI(コマンドライン)による操作

Google Cloud Console

ウェブブラウザ上で操作をします。

下図はGoogle Cloud Consoleで操作している様子(スナップショット)です。

Google Cloud Console

Google Cloudの利用登録をウェブブラウザ上から行うと、その後、利用できます。

コンソールへ移動

コマンドラインツール

コマンドプロンプト(Windowsの場合)を開いて、gcloud、gsutil、bqと言ったコマンドで操作する環境です。

以下はコマンドラインツールで操作している様子です。

Cloud SDK> gsutil mb -c standard -l asia-northeast1 gs://myrepo-001/

           ↑↑ 例:バケットの作成を行う ↑↑

※gcloud : Google Cloudリソースの操作を行うコマンド
 gsutil : Google Cloud Storageの操作を行うコマンド

Google Cloudの利用登録後、コマンドラインツールを使うためには、オペレーティングシステム毎に用意されたCloud SDKのインストールが必要になります。

スポンサーリンク

サーバの立ち上げ

GCSをリポジトリサーバにするので、Google Cloudの利用登録を行ってください。

利用登録は、Googleアカウントとクレジットカードが必要です。GoogleアカウントがGCPアカウントになります。

新規の利用者に無料トライアル(90日間+無料クレジット$300分)が用意されています。まずは、この無料トライアルを使って、クイックスタートを一通り試すことをお勧めします。理解が深まると思います。

利用登録が終わったら、ライブラリの格納場所をCloud Storage上に作っていきます。

ストレージの構成は図のようになっています。

ストレージのデータ構造

今回は例のようにしました。

階層概要コメント
Organization組織初期状態は「組織なし」
登録にドメイン(例:example.com)が必要
組織なし
[ Folders ]Projectのグループ化「組織なし」の場合は作成できない
Folderの階層化が可能
Projectリソースの管理Library Project
BucketObjectのコンテナ
グローバルに一意な名前
アンダースコアは使わない、小文字のみ
myrepo-000
Objectファイル・フォルダ保存を希望するデータライブラリ名
(decoration)
※[ ]は省略(作成しない)が可能
※Bucket名は発行先・参照先URLに現れる

例のような構成を作成する際の、Google Cloudの操作方法は省略します。ウェブ上の他の記事を参照してください。

スポンサーリンク

ライブラリのアクセス経路

下図はライブラリのアクセス経路です。

ライブラリの発行・参照経路(GCS)

アップロード(発行)もダウンロード(参照)も、Gradleに組み込まれたmaven-publishプラグインが、GCPのAPIを介してCloud Storageを操作します。

しかし、GCPは強固なセキュリティにより守られており、GCPオーナ(利用登録者)のように許可を持つ人しかアクセスできません。つまり、通常はGradleからアップ・ダウンロードは出来ません。

これを解決するため、GCPはGradleからのアクセスを可能にする仕組みを備えています。

仕組み1:サービスアカウントでGradleを認可

サービスアカウントを使った仕組みです。

チケットを持ったGradleのみが、GCPへアップロード並びにダウンロードできます。

3つの要素(条件、認可、権限)

Gradleからアクセスするために3つの要素が必要です。

  ・条件⇒Gradleがチケットを持っている
  ・認可⇒条件を満たせばGCP内で○○さんとして振舞うことを許す
  ・権限⇒○○さんはStorage内のBucketへアクセスできる

サービスアカウントでGradleを認可

ここで登場する「○○さん」のことをサービスアカウントと言います。

 ## 条件 ## 

チケットとは「サービスアカウントのKey」のことです。

チケットを持つのはGradleですので、認可されるのはGradleになります。

 ## 認可 ## 

認可はOAuth2.0プロトコルによって行われます。

Keyを使ってGradleとGCP間で調停が行われ、認可されれば、Gradleはサービスアカウントとして振舞うことを許されます。

注意点は「認可」であって「認証(誰であるかを確認)」では無いことです。

「ユーザーA、ホストBのGradle、ホストCのgcloud、…」といった誰(どのアプリ)であるかに関係なく、Keyを持っていれば認可されます。

それゆえに、Keyは厳格な管理が必要です。悪意のあるアプリケーションがKeyを持てば、悪意のあるアクセスを許すことになります。

 ## 権限 ## 

権限はStorageにIAM(Identity and Access Management)ポリシーと呼ばれる属性を付与することで指定します。

IAMポリシーとは「誰(プリンシパル)が、何(リソース)に、○○できる(ロール)」といった一連の定義です。※ロール:許される権限のリスト

サービスアカウントとKeyの作成

サービスアカウントとKeyの作成方法です。

サービスアカウントはプロジェクトに紐づいているので、プロジェクトの選択を忘れないでください。

サービスアカウントを作成

メールアドレスがサービスアカウント(表示名とは別)です。

サービスアカウントを作成

サービスアカウントの作成ができたら、「鍵の管理」からKeyを作ってください。

KeyのタイプはJSONが推奨されているので従います。作成されたKeyは自動的にローカルホストへダウンロードされます。

権限の指定

StorageへIAMポリシーを付与する方法です。

StorageへIAMポリシーを付与

プリンシパルがサービスアカウント(メールアドレス)です。

StorageへIAMポリシーを付与

ロールはライブラリの発行と参照で切り替えます。

ロール用途権限
Storageオブジェクトの管理者ライブラリの発行
(アップロード)
storage.objects.create
storage.objects.delete
storage.objects.get
storage.objects.getIamPolicy
storage.objects.list
storage.objects.setIamPolicy
storage.objects.update
    :
Storageオブジェクトの閲覧者ライブラリの参照
(ダウンロード)
storage.objects.get
storage.objects.list
    :
Storageオブジェクトの作成者※使わない※storage.objects.create
    :

管理者のロールは閲覧者のロールを含みます。ライブラリの参照で管理者のロールを指定しても、参照は可能です。

しかし、過剰な権限を与えないように、参照は閲覧者のロールに留めましょう。

認可の取得

開発ホストでKey(ダウンロードされたJSONファイル)を環境変数GOOGLE_APPLICATION_CREDENTIALSに指定します。

認可を取得する時のKeyは、この環境変数に指定されたものが使われます。

環境変数へKeyファイルを指定

発行先・参照先URLでスキームgcsを指定すると、Keyを使って認可を取得する処理が行われるようになります。

    :
afterEvaluate {     // 指示書に従った処理はビルド後に行う
    publishing {    // 発行するための指示書
        publications {   // ライブラリの情報
            ...
		}
		repositories {   // 発行先のリポジトリ
            maven {
                url "gcs://myrepo-000"  // gcs://bucket名
            }
        }
    }
}
    :
    :
dependencyResolutionManagement {  // すべてのモジュールに有効な指示
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {       // ライブラリの参照先となるリポジトリのリスト
        google()
        mavenCentral()
		maven {
            "gcs://myrepo-000"  // gcs://bucket名
        }
    }
}
    :
スポンサーリンク

仕組み2:ユーザアカウントでGradleを認可

ユーザアカウント(Googleアカウント)を使った仕組みです。

委任状を持ったGradleのみが、GCPへアップロード並びにダウンロードできます。

3つの要素(条件、認可、権限)

Gradleからアクセスするために3つの要素が必要です。

  ・条件⇒Gradleが委任状を持っている
  ・認可⇒条件を満たせばGCP内で○○さんとして振舞うことを許す
  ・権限⇒○○さんはStorage内のBucketへアクセスできる

ユーザアカウントでGradleを認可

ここで登場する「○○さん」のことをユーザアカウントと言います。

 ## 条件 ## 

委任状とは「ユーザアカウントの証明書」のことです。

証明書を持つのはGradleですので、認可されるのはGradleになります。

 ## 認可 ## 

認可はOAuth2.0プロトコルによって行われます。

証明書を使ってGradleとGCP間で調停が行われ、認可されれば、Gradleはユーザアカウントとして振舞うことを許されます。

注意点は「認可」であって「認証(誰であるかを確認)」では無いことです。

「ユーザーA、ホストBのGradle、ホストCのgcloud、…」といった誰(どのアプリ)であるかに関係なく、証明書を持っていれば認可されます。

それゆえに、証明書は厳格な管理が必要です。悪意のあるアプリケーションが証明書を持てば、悪意のあるアクセスを許すことになります。

 ## 権限 ## 

権限はStorageにIAM(Identity and Access Management)ポリシーと呼ばれる属性を付与することで指定します。

IAMポリシーとは「誰(プリンシパル)が、何(リソース)に、○○できる(ロール)」といった一連の定義です。※ロール:許される権限のリスト

証明書の作成

ユーザアカウントの証明書の作成方法です。

コマンドラインツールのgcloudを使って作成します。証明書はプロジェクトに紐づいているので、プロジェクトの選択を忘れないでください。

途中でブラウザが開き、Googleアカウントの認証(Gmailアドレスとパスワードの入力)が求められます。

>gcloud config set project プロジェクトID    ... プロジェクトの設定

>gcloud auth application-default login       ... 証明書の作成
Your browser has been opened to visit:
          :
  ブラウザが開き、Googleアカウントの認証が求められる
          :
          :                     ↓↓ ユーザアカウントの証明書 ↓↓
Credentials saved to file: [...\application_default_credentials.json]

証明書は以下の場所に作成されます。

C:\Users\ユーザ名\AppData\Roaming\gcloud\application_default_credentials.json

権限の指定

StorageへIAMポリシーを付与する方法です。

StorageへIAMポリシーを付与

プリンシパルがユーザアカウント(Googleアカウント)です。

StorageへIAMポリシーを付与

ロールはライブラリの発行と参照で切り替えます。

ロール用途権限
Storageオブジェクトの管理者ライブラリの発行
(アップロード)
storage.objects.create
storage.objects.delete
storage.objects.get
storage.objects.getIamPolicy
storage.objects.list
storage.objects.setIamPolicy
storage.objects.update
    :
Storageオブジェクトの閲覧者ライブラリの参照
(ダウンロード)
storage.objects.get
storage.objects.list
    :
Storageオブジェクトの作成者※使わない※storage.objects.create
    :

管理者のロールは閲覧者のロールを含みます。ライブラリの参照で管理者のロールを指定しても、参照は可能です。

しかし、過剰な権限を与えないように、参照は閲覧者のロールに留めましょう。

認可の取得

証明書(application_default_credentials.json)は、C:\Users\ユーザ名\AppData\Roaming\gcloudにあるものが自動的に使われます。

この時、環境変数GOOGLE_APPLICATION_CREDENTIALSは指定しないようにします。

Keyならびに証明書はADC(Application Default Credentials)と呼ばれるライブラリが検索します。

その検索の優先順位が次のようになっています。

 (1)環境変数GOOGLE_APPLICATION_CREDENTIALSのKey
 (2)証明書ファイル(application_default_credentials.json)

先に検索される環境変数の使用を防ぐためです。

発行先・参照先URLでスキームgcsを指定すると、証明書を使って認可を取得する処理が行われるようになります。

    :
afterEvaluate {     // 指示書に従った処理はビルド後に行う
    publishing {    // 発行するための指示書
        publications {   // ライブラリの情報
            ...
		}
		repositories {   // 発行先のリポジトリ
            maven {
                url "gcs://myrepo-000"  // gcs://bucket名
            }
        }
    }
}
    :
    :
dependencyResolutionManagement {  // すべてのモジュールに有効な指示
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {       // ライブラリの参照先となるリポジトリのリスト
        google()
        mavenCentral()
		maven {
            "gcs://myrepo-000"  // gcs://bucket名
        }
    }
}
    :
スポンサーリンク

仕組み3:ストレージの公開

Storageをインターネット上の全ての人へ公開する仕組みです。

StorageへIAMポリシーを付与します。

StorageへIAMポリシーを付与

プリンシパルがallUsersなので、インターネット上の全ての人がアクセス可能です。つまり、公開になります。

管理者のロールは指定しません。誰もがアップロード可能になってしまうためです。

Storageの公開

Cloud Storageはウェッブサーバではありませんが、Storageの公開を行うとHTTPSプロトコルで参照が可能になります。

参照先URLは次のようになります。

    :
dependencyResolutionManagement {  // すべてのモジュールに有効な指示
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {       // ライブラリの参照先となるリポジトリのリスト
        google()
        mavenCentral()
		maven {
            url "https://storage.googleapis.com/myrepo-000"
			//   ↑↑     定型      ↑↑/bucket名
        }
    }
}
    :
スポンサーリンク

関連記事:

アプリ開発の中で作成したクラスや関数などを資産としてライブラリ化し、次のアプリ開発で再利用するといったスタイルは、開発効率を上げる常套手段です。 私のように個人でアプリを開発している場合、この恩恵は薄いのですが、ソフトハウス(死語?)で年間に多くのアプリを開発している現場では濃いと思います。 「誰かが欲しいと思う機能」は「誰もが欲しいと思う機能」です。同じような仕様のアプリ開発を受注することはありませんか?機能の骨幹はライブラリからの流用に任せて、外観は顧客の要望に合わせるだけで済んだら、楽です。 今回は、Android Studio(アプリ開発)で参照するライブラリの種類について、まとめます。 ...
Module Libraryの構築と参照方法について、まとめます。 ※環境:Android Studio Bumblebee | 2021.1.1 ...
Local Repositoryの構築と参照方法について、まとめます。 ※環境:Android Studio Bumblebee | 2021.1.1 ...
Central Repositoryの参照方法について、まとめます。 ...
Remote Repositoryの構築と参照方法について、まとめます。 ※環境:Android Studio Bumblebee | 2021.1.1 ...
リポジトリサーバをApache+WebDavで構築する方法です。 Remote Repositoryの詳細は「Remote Repositoryの構築と参照」を参照してください。 ...
Module Libraryの構築と参照方法について、まとめます。 この記事は「Module Libraryの構築と参照(2022.04発行)」をAndroid Studio Giraffe(2023.07)向けに書き直したものです。 GiraffeよりGradleでKotlin DSLが推奨になりました。それに従い、ビルドスクリプトをKotlinで記述したコードに置き換えています。 ※環境:Android Studio Giraffe | 2022.3.1    :Android Gradle Plugin 8.1.0    :Gradle 8.0 ...
Local Repositoryの構築と参照方法について、まとめます。 この記事は「Local Repositoryの構築と参照(2022.04発行)」をAndroid Studio Giraffe(2023.07)向けに書き直したものです。 Gradle Ver7.x以降、リポジトリの構築方法が若干変更になりました。 また、GiraffeよりGradleでKotlin DSLが推奨になりました。それに従い、ビルドスクリプトをKotlinで記述したコードに置き換えています。 ※環境:Android Studio Giraffe | 2022.3.1    :Android Gradle Plugin 8.1.0    :Gradle 8.0 ...
Remote Repositoryの構築と参照方法について、まとめます。 この記事は「Remote Repositoryの構築と参照(2022.04発行)」をAndroid Studio Giraffe(2023.07)向けに書き直したものです。 Gradle Ver7.x以降、リポジトリの構築方法が若干変更になりました。 また、GiraffeよりGradleでKotlin DSLが推奨になりました。それに従い、ビルドスクリプトをKotlinで記述したコードに置き換えています。 ※環境:Android Studio Giraffe | 2022.3.1    :Android Gradle Plugin 8.1.0    :Gradle 8.0 ...
スポンサーリンク