UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

GCPの別プロジェクトにIAM権限をコピーする

GCPにすでにある検証環境プロジェクトをクローンして開発環境プロジェクトをつくる際にIAM権限のコピーを行ったときのメモ

1. コピー元プロジェクトのIAMのエクスポート

 $ gcloud projects get-iam-policy <プロジェクトID> --format json > IAM.json

2. サービスアカウントのプロジェクト番号を変更

IAM.json内のプロジェクト番号をコピー元からコピー先に変更する

プロジェクト番号の確認

 $ gcloud projects describe <プロジェクトID> | grep projectNumber

確認したら、そのプロジェクト番号でIAM.json内のプロジェクト番号を全置換

3. etagの情報削除

IAM.json内にetagが存在しているとインポート時に現行リソースとファイル内のetag情報のチェックが行われ、一致していないとエラーになるので削除する

4. IAMのインポート

 $ gcloud projects set-iam-policy <プロジェクトID> IAM.json
 The specified policy does not contain an "etag" field identifying a
 specific version to replace. Changing a policy without an "etag" can
 overwrite concurrent policy changes.

 Replace existing policy (Y/n)? Y

実行するとetagが無いからポリシーが上書きになるという確認メッセージが表示される

エラーが発生

 ERROR: (gcloud.projects.set-iam-policy) INVALID_ARGUMENT: Request contains an invalid argument.
 - '@type': type.googleapis.com/google.cloudresourcemanager.v1.ProjectIamPolicyError
   member: user:xxxx@yyyy.com
   role: roles/owner
   type: SOLO_MUST_INVITE_OWNERS

xxxx@yyyy.comに関してのエラー

xxxx@yyyy.comはオーナー権限をもっている自分以外のユーザ オーナー権限のインポートはできないようなので、権限を編集者に変えてリトライ

 ERROR: (gcloud.projects.set-iam-policy) INVALID_ARGUMENT: Service account service-999999999@compute-system.iam.gserviceaccount.com does not exist.

サービスアカウントが存在しないというエラー

一旦、サービスアカウントの権限周りの記述を削除して、ユーザアカウントだけにしてリトライ

 Updated IAM policy for project [プロジェクトID].
 bindings:
 - members:
   - user:xxxx@yyyy.com
   role: roles/editor
 - members:
   - user:my-account@yyyy.com
   role: roles/owner
 etag: XXXXXXXX
 version: 1

ユーザアカウントはコピー完了

サービスアカウントの追加はプロジェクト毎に作り直す方がより安全と考え、コピーするのは止める