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
ユーザアカウントはコピー完了
サービスアカウントの追加はプロジェクト毎に作り直す方がより安全と考え、コピーするのは止める