リポジトリサーバをGoogle Cloud Storageで構築する方法です。
Remote Repositoryの詳細は「Remote Repositoryの構築と参照」を参照してください。
目次
Google Cloud Storageとは
Googleはクラウドベースの様々なプロダクトを開発しています。これを総称して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つあります。
・コマンドラインツール
—> CUI(コマンドライン)による操作
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アカウントになります。
利用登録が終わったら、ライブラリの格納場所をCloud Storage上に作っていきます。
ストレージの構成は図のようになっています。
今回は例のようにしました。
階層 | 概要 | コメント | 例 |
---|---|---|---|
Organization | 組織 | 初期状態は「組織なし」 登録にドメイン(例:example.com)が必要 | 組織なし |
[ Folders ] | Projectのグループ化 | 「組織なし」の場合は作成できない Folderの階層化が可能 | |
Project | リソースの管理 | Library Project | |
Bucket | Objectのコンテナ | グローバルに一意な名前 アンダースコアは使わない、小文字のみ | myrepo-000 |
Object | ファイル・フォルダ | 保存を希望するデータ | ライブラリ名 (decoration) |
※[ ]は省略(作成しない)が可能 ※Bucket名は発行先・参照先URLに現れる |
例のような構成を作成する際の、Google Cloudの操作方法は省略します。ウェブ上の他の記事を参照してください。
ライブラリのアクセス経路
下図はライブラリのアクセス経路です。
アップロード(発行)もダウンロード(参照)も、Gradleに組み込まれたmaven-publishプラグインが、GCPのAPIを介してCloud Storageを操作します。
しかし、GCPは強固なセキュリティにより守られており、GCPオーナ(利用登録者)のように許可を持つ人しかアクセスできません。つまり、通常はGradleからアップ・ダウンロードは出来ません。
これを解決するため、GCPはGradleからのアクセスを可能にする仕組みを備えています。
仕組み1:サービスアカウントでGradleを認可
サービスアカウントを使った仕組みです。
チケットを持ったGradleのみが、GCPへアップロード並びにダウンロードできます。
3つの要素(条件、認可、権限)
Gradleからアクセスするために3つの要素が必要です。
・条件⇒Gradleがチケットを持っている
・認可⇒条件を満たせばGCP内で○○さんとして振舞うことを許す
・権限⇒○○さんはStorage内のBucketへアクセスできる
ここで登場する「○○さん」のことをサービスアカウントと言います。
## 条件 ##チケットとは「サービスアカウントの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オブジェクトの管理者 | ライブラリの発行 (アップロード) | 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は、この環境変数に指定されたものが使われます。
発行先・参照先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になります。
## 認可 ##認可は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ポリシーを付与する方法です。
プリンシパルがユーザアカウント(Googleアカウント)です。
ロールはライブラリの発行と参照で切り替えます。
ロール | 用途 | 権限 |
---|---|---|
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ポリシーを付与します。
プリンシパルがallUsersなので、インターネット上の全ての人がアクセス可能です。つまり、公開になります。
管理者のロールは指定しません。誰もがアップロード可能になってしまうためです。
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名 } } } :
関連記事: