实验 03 自定义角色#
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
场景#
Bob 只需要读一个已知路径的对象。用它区分预定义角色、Custom Role、角色定义和授权范围。配置者需要自定义角色管理和 Bucket IAM 管理权限。
管理员准备原始数据 Bucket;启用 uniform bucket-level access,避免对象 ACL 干扰 IAM 实验:
gcloud storage buckets create "gs://$INPUT_BUCKET" --project="$PROJECT_ID" \
--location="$REGION" --uniform-bucket-level-access
printf 'amount\n10\n20\n' > records/input.csv
gcloud storage cp records/input.csv "gs://$INPUT_BUCKET/input.csv"
gcloud iam roles create labObjectReader --project="$PROJECT_ID" \
--file=templates/custom-role.yaml角色创建后 Bob 仍不应获得对象读取权。管理员再授予:
gcloud storage buckets add-iam-policy-binding "gs://$INPUT_BUCKET" \
--member="user:$DEV_EMAIL" --role="projects/$PROJECT_ID/roles/labObjectReader"Bob 在独立会话中验证:
gcloud storage cat "gs://$INPUT_BUCKET/input.csv"
gcloud storage ls "gs://$INPUT_BUCKET"预期第一条成功,第二条因缺少 storage.objects.list 被拒绝。Console 浏览可能需要列表或元数据权限,不要拿 Console 页面打不开证明读取权限无效。如果两条均成功,检查 Bob 的其他授权。
发布阶段#
管理员依次更新阶段;每次等待传播后,由 Bob 重复读取:
gcloud iam roles update labObjectReader --project="$PROJECT_ID" --stage=BETA
gcloud iam roles update labObjectReader --project="$PROJECT_ID" --stage=GA
gcloud iam roles update labObjectReader --project="$PROJECT_ID" --stage=DISABLEDCustom Role 的 Beta / GA 不改变权限;Disabled 也不是显式 Deny。 它只停止该角色提供权限,其他 role 的同等授权仍可生效。恢复 GA 后再测读取。
清理#
恢复 GA 后移除实验绑定,保留角色供复习,最后在第 08 章删除:
gcloud iam roles update labObjectReader --project="$PROJECT_ID" --stage=GA
gcloud storage buckets remove-iam-policy-binding "gs://$INPUT_BUCKET" \
--member="user:$DEV_EMAIL" --role="projects/$PROJECT_ID/roles/labObjectReader"验收:为什么同一个角色在不同 Bucket 授予,会得到不同访问范围?为什么没有必要为了所有需求都创建 Custom Role?
参考:创建和维护自定义角色。