ロールの「Compute インスタンス管理者」には「ベータ版」と「v1」の2種類があるけど、どっちを使うべきなんだろう? というか、何が違うんだ?
Google CloudのCompute Engineにおいて、インスタンス管理権限を持つ事前定義ロールには、次の2種類があります。
- Compute インスタンス管理者(ベータ版) [roles/compute.instanceAdmin]
- Compute インスタンス管理者(v1) [roles/compute.instanceAdmin.v1]
本記事ではこの「ベータ版」と「v1」のロールの違いについて、調べた結果を紹介します。ロールに含まれる権限を細かく比較した表も載せています。ただし、各ロールの使い分け(ユースケース)については、情報が無いため独自の推測にとどまっており、煮え切らない結論になっております。
結論
「ベータ版」「v1」の2つのロールの違いを一言で表すのは難しいのですが、含まれる権限を比較した結果を見ると、次のことが言えると思います。
詳細な権限の比較結果は「権限の比較」に載せています。
「ベータ版」は「v1」の機能限定版といったイメージに見えますが、どのようなシーンで「ベータ版」を使うべきなのかは、情報が見つからず分かりません。このあたりは考察として後述していますが、おそらくは過去の互換性のために残っているロールではないかと想像しています。
これから新たにCompute Engineのインスタンス管理者権限を付与する場合は、特別な理由がない限り「v1」のロールを使うことで良いのではないかと筆者は考えています。
権限の比較
「ベータ版」と「v1」に含まれる権限については、Google Cloud公式ドキュメントの「Compute Engine IAM のロールと権限」に記載があります。これを比較した結果(2023年8月時点)を、下の表に示します。
ピンクでマークしている項目が、両者で差異のある権限です。この結果から、「v1」は「ベータ版」が持つ権限をすべて包含していることが分かります。
項目 | Compute インスタンス管理者 (ベータ版) [roles/compute.instanceAdmin] | Compute インスタンス管理者 (v1) [roles/compute.instanceAdmin.v1] |
---|---|---|
acceleratorTypes | compute.acceleratorTypes.* | compute.acceleratorTypes.* |
addresses | compute.addresses.createInternal compute.addresses.deleteInternal compute.addresses.get compute.addresses.list compute.addresses.use compute.addresses.useInternal | compute.addresses.createInternal compute.addresses.deleteInternal compute.addresses.get compute.addresses.list compute.addresses.use compute.addresses.useInternal |
autoscalers | compute.autoscalers.* | compute.autoscalers.* |
backendBuckets | compute.backendBuckets.get compute.backendBuckets.list compute.backendBuckets.listEffectiveTags compute.backendBuckets.listTagBindings | |
backendServices | compute.backendServices.get compute.backendServices.list compute.backendServices.listEffectiveTags compute.backendServices.listTagBindings | |
disks | compute.disks.create compute.disks.createSnapshot compute.disks.delete compute.disks.get compute.disks.list compute.disks.resize compute.disks.setLabels compute.disks.startAsyncReplication compute.disks.stopAsyncReplication compute.disks.stopGroupAsyncReplication compute.disks.update compute.disks.use compute.disks.useReadOnly | compute.disks.* |
diskTypes | compute.diskTypes.* | compute.diskTypes.* |
externalVpnGateways | compute.externalVpnGateways.get compute.externalVpnGateways.list | |
firewalls | compute.firewalls.get compute.firewalls.list compute.firewalls.listEffectiveTags compute.firewalls.listTagBindings | |
forwardingRules | compute.forwardingRules.get compute.forwardingRules.list compute.forwardingRules.listEffectiveTags compute.forwardingRules.listTagBindings | |
globalAddresses | compute.globalAddresses.get compute.globalAddresses.list compute.globalAddresses.use | compute.globalAddresses.get compute.globalAddresses.list compute.globalAddresses.use |
globalForwardingRules | compute.globalForwardingRules.get compute.globalForwardingRules.list compute.globalForwardingRules.listEffectiveTags compute.globalForwardingRules.listTagBindings compute.globalForwardingRules.pscGet | |
globalNetworkEndpointGroups | compute.globalNetworkEndpointGroups.* | compute.globalNetworkEndpointGroups.* |
globalOperations | compute.globalOperations.get compute.globalOperations.list | compute.globalOperations.get compute.globalOperations.list |
healthChecks | compute.healthChecks.get compute.healthChecks.list compute.healthChecks.listEffectiveTags compute.healthChecks.listTagBindings | |
httpHealthChecks | compute.httpHealthChecks.get compute.httpHealthChecks.list compute.httpHealthChecks.listEffectiveTags compute.httpHealthChecks.listTagBindings | |
httpsHealthChecks | compute.httpsHealthChecks.get compute.httpsHealthChecks.list compute.httpsHealthChecks.listEffectiveTags compute.httpsHealthChecks.listTagBindings | |
images | compute.images.get compute.images.getFromFamily compute.images.list compute.images.useReadOnly | compute.images.* |
instanceGroupManagers | compute.instanceGroupManagers.* | compute.instanceGroupManagers.* |
instanceGroups | compute.instanceGroups.* | compute.instanceGroups.* |
instances | compute.instances.* | compute.instances.* |
instanceTemplates | compute.instanceTemplates.* | compute.instanceTemplates.* |
instantSnapshots | compute.instantSnapshots.* | |
interconnectAttachments | compute.interconnectAttachments.get compute.interconnectAttachments.list | |
interconnectLocations | compute.interconnectLocations.* | |
interconnectRemoteLocations | compute.interconnectRemoteLocations.* | |
interconnects | compute.interconnects.get compute.interconnects.list | |
licenseCodes | compute.licenseCodes.* | |
licenses | compute.licenses.get compute.licenses.list | compute.licenses.* |
machineImages | compute.machineImages.* | compute.machineImages.* |
machineTypes | compute.machineTypes.* | compute.machineTypes.* |
networkAttachments | compute.networkAttachments.get compute.networkAttachments.list | |
networkEndpointGroups | compute.networkEndpointGroups.* | compute.networkEndpointGroups.* |
networks | compute.networks.get compute.networks.list compute.networks.listEffectiveTags compute.networks.listTagBindings compute.networks.use compute.networks.useExternalIp | compute.networks.get compute.networks.list compute.networks.listEffectiveTags compute.networks.listTagBindings compute.networks.use compute.networks.useExternalIp |
projects | compute.projects.get | compute.projects.get compute.projects.setCommonInstanceMetadata |
regionBackendServices | compute.regionBackendServices.get compute.regionBackendServices.list compute.regionBackendServices.listEffectiveTags compute.regionBackendServices.listTagBindings | |
regionHealthChecks | compute.regionHealthChecks.get compute.regionHealthChecks.list compute.regionHealthChecks.listEffectiveTags compute.regionHealthChecks.listTagBindings | |
regionHealthCheckServices | compute.regionHealthCheckServices.get compute.regionHealthCheckServices.list | |
regionNetworkEndpointGroups | compute.regionNetworkEndpointGroups.* | compute.regionNetworkEndpointGroups.* |
regionNotificationEndpoints | compute.regionNotificationEndpoints.get compute.regionNotificationEndpoints.list | |
regionOperations | compute.regionOperations.get compute.regionOperations.list | compute.regionOperations.get compute.regionOperations.list |
regions | compute.regions.* | compute.regions.* |
regionSslCertificates | compute.regionSslCertificates.get compute.regionSslCertificates.list compute.regionSslCertificates.listEffectiveTags compute.regionSslCertificates.listTagBindings | |
regionSslPolicies | compute.regionSslPolicies.get compute.regionSslPolicies.list compute.regionSslPolicies.listAvailableFeatures | |
regionTargetHttpProxies | compute.regionTargetHttpProxies.get compute.regionTargetHttpProxies.list compute.regionTargetHttpProxies.listEffectiveTags compute.regionTargetHttpProxies.listTagBindings | |
regionTargetHttpsProxies | compute.regionTargetHttpsProxies.get compute.regionTargetHttpsProxies.list compute.regionTargetHttpsProxies.listEffectiveTags compute.regionTargetHttpsProxies.listTagBindings | |
regionTargetTcpProxies | compute.regionTargetTcpProxies.get compute.regionTargetTcpProxies.list | |
regionUrlMaps | compute.regionUrlMaps.get compute.regionUrlMaps.list compute.regionUrlMaps.listEffectiveTags compute.regionUrlMaps.listTagBindings | |
reservations | compute.reservations.get compute.reservations.list | compute.reservations.get compute.reservations.list |
resourcePolicies | compute.resourcePolicies.useReadOnly | compute.resourcePolicies.* |
routers | compute.routers.get compute.routers.list | |
routes | compute.routes.get compute.routes.list compute.routes.listEffectiveTags compute.routes.listTagBindings | |
serviceAttachments | compute.serviceAttachments.get compute.serviceAttachments.list | |
snapshots | compute.snapshots.* | |
sslCertificates | compute.sslCertificates.get compute.sslCertificates.list compute.sslCertificates.listEffectiveTags compute.sslCertificates.listTagBindings | |
sslPolicies | compute.sslPolicies.get compute.sslPolicies.list compute.sslPolicies.listAvailableFeatures compute.sslPolicies.listEffectiveTags compute.sslPolicies.listTagBindings | |
subnetworks | compute.subnetworks.get compute.subnetworks.list compute.subnetworks.listEffectiveTags compute.subnetworks.listTagBindings compute.subnetworks.use compute.subnetworks.useExternalIp | compute.subnetworks.get compute.subnetworks.list compute.subnetworks.listEffectiveTags compute.subnetworks.listTagBindings compute.subnetworks.use compute.subnetworks.useExternalIp |
targetGrpcProxies | compute.targetGrpcProxies.get compute.targetGrpcProxies.list | |
targetHttpProxies | compute.targetHttpProxies.get compute.targetHttpProxies.list compute.targetHttpProxies.listEffectiveTags compute.targetHttpProxies.listTagBindings | |
targetHttpsProxies | compute.targetHttpsProxies.get compute.targetHttpsProxies.list compute.targetHttpsProxies.listEffectiveTags compute.targetHttpsProxies.listTagBindings | |
targetInstances | compute.targetInstances.get compute.targetInstances.list compute.targetInstances.listEffectiveTags compute.targetInstances.listTagBindings | |
targetPools | compute.targetPools.get compute.targetPools.list compute.targetPools.listEffectiveTags compute.targetPools.listTagBindings | compute.targetPools.get compute.targetPools.list compute.targetPools.listEffectiveTags compute.targetPools.listTagBindings |
targetSslProxies | compute.targetSslProxies.get compute.targetSslProxies.list compute.targetSslProxies.listEffectiveTags compute.targetSslProxies.listTagBindings | |
targetTcpProxies | compute.targetTcpProxies.get compute.targetTcpProxies.list compute.targetTcpProxies.listEffectiveTags compute.targetTcpProxies.listTagBindings | |
targetVpnGateways | compute.targetVpnGateways.get compute.targetVpnGateways.list | |
urlMaps | compute.urlMaps.get compute.urlMaps.list compute.urlMaps.listEffectiveTags compute.urlMaps.listTagBindings | |
vpnGateways | compute.vpnGateways.get compute.vpnGateways.list | |
vpnTunnels | compute.vpnTunnels.get compute.vpnTunnels.list | |
zoneOperations | compute.zoneOperations.get compute.zoneOperations.list | compute.zoneOperations.get compute.zoneOperations.list |
zones | compute.zones.* | compute.zones.* |
resourcemanager.projects | resourcemanager.projects.get resourcemanager.projects.list | resourcemanager.projects.get resourcemanager.projects.list |
serviceusage.quotas | serviceusage.quotas.get | serviceusage.quotas.get |
serviceusage.services | serviceusage.services.get serviceusage.services.list | serviceusage.services.get serviceusage.services.list |
考察
権限の違いは前述の通りですが、そもそも「なぜ2種類のロールがあるのか」については公式ドキュメントやWebを検索しても、有効な記述が見つかりませんでした。ここからは事実ではなく、筆者の推測です。
「ベータ版」のロール識別子が「roles/compute.instanceAdmin」(「.v1」がつかない)であることから、「ベータ版」が先に作られたと思われます。
その後Google Cloudの機能追加により、スナップショットやより多くのネットワークリソースなどを含めた、より広範な権限を持つロールが必要になったのではないでしょうか。しかし単純に権限を追加したのでは、そのロールを使っているユーザーに対して急に強い権限が付与されます。これはセキュリティ上望ましくない可能性があります。
そのため、それまでとは別のロールとして、新しく「v1」を作ったのではないでしょうか。もしかするとその際に、元のロールのタイトルに「ベータ版」という文言を加えたのかもしれません。
こうして、以前のロールの権限範囲を保ったまま、新しい機能に対応したロールが生まれたという仮説です。それであれば、これから新たに「ベータ版」を使うケースはほとんどないのかもしれません。
繰り返しになりますが、あくまで推測です。本当の理由が記載されたドキュメントがあれば、そちらを参照して下さい。
参考URL
おわりに
今回の記事は以上です。
当サイトでは、ITインフラ関連の知識やノウハウをメインに紹介しています。下の関連記事にも役立つ情報があるかもしれませんので、ぜひご覧下さい。
また、知識やノウハウを効率的に学ぶ方法として、Udemy の「ながらセミナー」もおすすめです。三日坊主にならず、普段の生活の中でスキルアップする方法です。これについては下の記事で紹介していますので、良ければご覧下さい。
最後まで読んでいただき、ありがとうございました。
フィードバック
あなたが抱えている疑問や悩みは解決できたでしょうか?当ブログではそれを最重視しています。今後もあなたの役に立つ情報を提供するために、ぜひ教えて下さい。
コメント