MeWrite Docs

GCP: PERMISSION_DENIED

GCPでIAMによりアクセスが拒否された場合のエラー

概要

Google Cloud Platformでリソースへのアクセス時に、IAMポリシーによって必要な権限が付与されていない場合に発生するエラーです。

エラーメッセージ

ERROR: (gcloud.storage.cp) HTTPError 403: user@example.com does not have storage.objects.get access to the Google Cloud Storage object.

または

google.api_core.exceptions.PermissionDenied: 403 Permission denied on resource project myproject

原因

  1. IAMロール不足: 必要なロールが付与されていない
  2. サービスアカウントキー: 権限のないサービスアカウント
  3. 組織ポリシー: 組織レベルでの制限
  4. APIの有効化: 必要なAPIが有効化されていない

解決策

1. 現在の権限を確認

1
2
3
4
5
6
7
# プロジェクトのIAMポリシーを確認
gcloud projects get-iam-policy PROJECT_ID

# 特定メンバーのロールを確認
gcloud projects get-iam-policy PROJECT_ID \
  --flatten="bindings[].members" \
  --filter="bindings.members:user@example.com"

2. ロールを付与

1
2
3
4
5
6
7
8
9
# プロジェクトレベルでロールを付与
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="user:user@example.com" \
  --role="roles/storage.objectViewer"

# サービスアカウントに付与
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="serviceAccount:my-sa@project.iam.gserviceaccount.com" \
  --role="roles/cloudsql.client"

3. 必要なロールを特定

1
2
3
4
5
6
7
8
# 利用可能なロール一覧
gcloud iam roles list

# ロールの詳細(含まれる権限)
gcloud iam roles describe roles/storage.objectViewer

# 権限からロールを検索
gcloud iam roles list --filter="includedPermissions:storage.objects.get"

4. サービスアカウントの確認

1
2
3
4
5
6
7
8
9
# 現在の認証情報を確認
gcloud auth list

# サービスアカウントとして認証
gcloud auth activate-service-account \
  --key-file=service-account-key.json

# アプリケーションデフォルト認証情報
gcloud auth application-default login

5. リソースレベルのIAM

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Cloud Storageバケットのポリシー
gsutil iam get gs://my-bucket

# バケットにロールを付与
gsutil iam ch user:user@example.com:objectViewer gs://my-bucket

# Pub/Subトピック
gcloud pubsub topics add-iam-policy-binding my-topic \
  --member="user:user@example.com" \
  --role="roles/pubsub.publisher"

6. APIの有効化

1
2
3
4
5
6
# APIが有効か確認
gcloud services list --enabled

# APIを有効化
gcloud services enable storage.googleapis.com
gcloud services enable compute.googleapis.com

7. Terraformでの設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
resource "google_project_iam_member" "storage_viewer" {
  project = "my-project"
  role    = "roles/storage.objectViewer"
  member  = "user:user@example.com"
}

resource "google_storage_bucket_iam_member" "bucket_viewer" {
  bucket = google_storage_bucket.default.name
  role   = "roles/storage.objectViewer"
  member = "serviceAccount:${google_service_account.default.email}"
}

8. Workload Identity(GKE)

1
2
3
4
5
# Workload Identityを設定
gcloud iam service-accounts add-iam-policy-binding \
  --role roles/iam.workloadIdentityUser \
  --member "serviceAccount:PROJECT.svc.id.goog[NAMESPACE/KSA_NAME]" \
  GSA_NAME@PROJECT.iam.gserviceaccount.com

9. 組織ポリシーの確認

1
2
3
4
5
6
7
# 組織ポリシーを確認
gcloud resource-manager org-policies list --project=PROJECT_ID

# 特定ポリシーの詳細
gcloud resource-manager org-policies describe \
  constraints/storage.uniformBucketLevelAccess \
  --project=PROJECT_ID

10. IAM Troubleshooter

1
2
3
4
5
# Policy Troubleshooterで原因を特定
gcloud policy-troubleshoot iam \
  //storage.googleapis.com/projects/_/buckets/my-bucket/objects/my-object \
  --principal-email=user@example.com \
  --permission=storage.objects.get

よくある間違い

  • プロジェクトIDとプロジェクト番号の混同
  • サービスアカウントキーの期限切れ
  • 条件付きロールバインディングの条件不一致
  • 均一なバケットレベルアクセスとオブジェクトACLの混在

GCP の他のエラー

最終更新: 2025-12-09