本日も乙

ただの自己満足な備忘録。

GCPのプロジェクト間でGCEイメージを共有する

昨日からGoogle Cloud Next Tokyo 2018が開催されていますね。私は残念ながら家庭の事情により基調講演のみの参加となりました。
聴きたいセッションがたくさんあってかなり前からセッションの予約をしていたのに非常に残念です。後日動画がアップされることを祈るばかりです。

GCEイメージ *1 をプロジェクト間で共有する方法を紹介します。
どこかに同じような記事があるかもしれませんが気にしない。

想定例

Aプロジェクトから BプロジェクトにあるGCEイメージを使いたいとします。
- 取得先: Aプロジェクト
- 取得元: Bプロジェクト

IAMの設定変更

他プロジェクトのイメージを取得する権限をIAMで付与する必要があります。
取得元のプロジェクト(Bプロジェクト)のIAM画面を開きます。ユーザがない人は追加ボタンからユーザを追加しておきます。
ユーザの権限編集で「Compute Engine」->「Compute イメージ ユーザー」を選択します。

share-gce-image1.png

VMインスタンスの作成など

VMインスタンスを作成する際に、ブートディスクの選択で「カスタムイメージ」-> 「イメージの取得元」からイメージを保有しているプロジェクト(Bプロジェクト)をプルダウンから選ぶとイメージが出てきますのでそれを選択します(モザイクばかりですいません。。。)。

share-gce-image2.png

マネージドインスタンスグループ

マネージドインスタンスグループから他プロジェクトのイメージでVMインスタンスを起動しようとすると次のようなエラーがでます。
これはGoogle APIサービスアカウントがイメージ取得元(Bプロジェクト)にあるGCEイメージに対して取得権限がないためです。

Instance 'hogehoge' creation failed: Required 'compute.images.useReadOnly' permission for 'projects/project-b/global/images/xxxxxxxxxxxxx' (when acting as 'xxxxxxxxxxxxx@cloudservices.gserviceaccount.com')

先ほどのIAM画面に戻り、今度はGoogle APIサービスアカウントに対して権限付与します。
ユーザ追加画面で取得先のサービスアカウントを入力します。
サービスアカウントは [PROJECT_NUMBER]@cloudservices.gserviceaccount.com となります。[PROJECT_NUMBER] はプロジェクト一覧画面から確認できます。

share-gce-image3.png

権限は先ほどと同じように「Compute Engine」->「Compute イメージ ユーザー」を選択します。

*1:AWSのAMIに相当