Azure ロールの割り当てを作成する

このページでは、GKE on Azure が Azure API にアクセスできるように権限を付与する方法について説明します。これらの手順は、新しい GKE on Azure クラスタを設定するとき、または既存のクラスタの権限を更新するときに実行する必要があります。これらの権限は、GKE on Azure が仮想マシン、ネットワーキング コンポーネント、ストレージなどの Azure リソースをユーザーに代わって管理するために必要です。

サービス プリンシパル ID とサブスクリプション ID を取得する

GKE on Azure に権限を付与するには、Azure サービス プリンシパルとサブスクリプション ID を取得する必要があります。Azure サービス プリンシパルとサブスクリプション ID は、GKE on Azure 用に作成した Azure AD アプリケーションに関連付けられています。詳細については、Azure Active Directory アプリケーションを作成するをご覧ください。

サービス プリンシパルは、Azure に対して認証を行い、そのリソースにアクセスするために使用される Azure Active Directory(AD)の ID です。Azure サブスクリプションは、Azure のプロダクトとサービスへの承認済みアクセスを提供する論理コンテナです。サブスクリプション ID は、Azure サブスクリプションに関連付けられた固有識別子です。

サービス プリンシパルとサブスクリプション ID をすぐに参照できるように保存するには、シェル変数に保存します。こうしたシェル変数を作成するには、次のコマンドを実行します。

APPLICATION_ID=$(az ad app list --all \
    --query "[?displayName=='APPLICATION_NAME'].appId" \
    --output tsv)
SERVICE_PRINCIPAL_ID=$(az ad sp list --all  --output tsv \
      --query "[?appId=='$APPLICATION_ID'].id")
SUBSCRIPTION_ID=$(az account show --query "id" --output tsv)

APPLICATION_NAME は、Azure AD アプリケーションの名前に置き換えます。

3 つのカスタムロールを作成する

GKE on Azure に Azure リソースを管理する権限を付与するには、3 つのカスタムロールを作成してサービス プリンシパルに割り当てる必要があります。次の手順では、最小限の権限のみを追加します。必要に応じて、権限をさらに追加できます。

次のタイプのアクセスには、カスタムロールを作成する必要があります。

  • サブスクリプション レベルのアクセス: Azure サブスクリプション全体に適用される権限。サブスクリプション内のすべての Azure リソースの管理を許可します。
  • クラスタ リソース グループレベルのアクセス: GKE on Azure クラスタを含む特定のリソース グループ内の Azure リソースの管理に固有の権限。
  • 仮想ネットワーク リソース グループレベルのアクセス: Azure 仮想ネットワーク リソースを含むリソース グループ内の Azure リソースの管理に固有の権限。

サブスクリプション レベルのアクセス用のロールを作成する

  1. GKEOnAzureAPISubscriptionScopedRole.json という名前のファイルを作成します。

  2. エディタで GKEOnAzureAPISubscriptionScopedRole.json を開き、次の権限を追加します。

    {
    "Name": "GKE on-Azure API Subscription Scoped Role",
    "IsCustom": true,
    "Description": "Allow GKE on-Azure service manage resources in subscription scope.",
    "Actions": [
      "Microsoft.Authorization/roleAssignments/read",
      "Microsoft.Authorization/roleAssignments/write",
      "Microsoft.Authorization/roleAssignments/delete",
      "Microsoft.Authorization/roleDefinitions/read"
    ],
    "NotActions": [],
    "DataActions": [],
    "NotDataActions": [],
    "AssignableScopes": ["/subscriptions/${SUBSCRIPTION_ID}"]
    }
    
  3. 新しいカスタムロールを作成します。

    az role definition create --role-definition "GKEOnAzureAPISubscriptionScopedRole.json"
    
  4. 次のコマンドを使用して、サービス プリンシパルにロールを割り当てます。

    az role assignment create --assignee ${SERVICE_PRINCIPAL_ID} --role "GKE on-Azure API Subscription Scoped Role" --scope /subscriptions/${SUBSCRIPTION_ID}
    

クラスタ リソース グループレベルのアクセス用のロールを作成する

  1. GKEOnAzureClusterResourceGroupScopedRole.json という名前のファイルを作成します。

  2. エディタで GKEOnAzureClusterResourceGroupScopedRole.json を開き、次の権限を追加します。

    {
    "Name": "GKE on-Azure API Cluster Resource Group Scoped Role",
    "IsCustom": true,
    "Description": "Allow GKE on-Azure service manage resources in cluster resource group scope.",
    "Actions": [
        "Microsoft.Resources/subscriptions/resourcegroups/read",
        "Microsoft.Authorization/roleDefinitions/write",
        "Microsoft.Authorization/roleDefinitions/delete",
        "Microsoft.ManagedIdentity/userAssignedIdentities/write",
        "Microsoft.ManagedIdentity/userAssignedIdentities/read",
        "Microsoft.ManagedIdentity/userAssignedIdentities/delete",
        "Microsoft.Network/applicationSecurityGroups/write",
        "Microsoft.Network/applicationSecurityGroups/read",
        "Microsoft.Network/applicationSecurityGroups/delete",
        "Microsoft.Network/applicationSecurityGroups/joinIpConfiguration/action",
        "Microsoft.Authorization/roleAssignments/write",
        "Microsoft.Authorization/roleAssignments/read",
        "Microsoft.Authorization/roleAssignments/delete",
        "Microsoft.Network/loadBalancers/write",
        "Microsoft.Network/loadBalancers/read",
        "Microsoft.Network/loadBalancers/delete",
        "Microsoft.Network/loadBalancers/backendAddressPools/join/action",
        "Microsoft.Network/networkSecurityGroups/write",
        "Microsoft.Network/networkSecurityGroups/read",
        "Microsoft.Network/networkSecurityGroups/delete",
        "Microsoft.Network/networkSecurityGroups/join/action",
        "Microsoft.KeyVault/vaults/write",
        "Microsoft.KeyVault/vaults/read",
        "Microsoft.KeyVault/vaults/delete",
        "Microsoft.Compute/disks/read",
        "Microsoft.Compute/disks/write",
        "Microsoft.Compute/disks/delete",
        "Microsoft.Network/networkInterfaces/read",
        "Microsoft.Network/networkInterfaces/write",
        "Microsoft.Network/networkInterfaces/delete",
        "Microsoft.Network/networkInterfaces/join/action",
        "Microsoft.Compute/virtualMachines/read",
        "Microsoft.Compute/virtualMachines/write",
        "Microsoft.Compute/virtualMachines/delete",
        "Microsoft.Compute/virtualMachineScaleSets/write",
        "Microsoft.Compute/virtualMachineScaleSets/read",
        "Microsoft.Compute/virtualMachineScaleSets/delete",
        "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action",
        "Microsoft.Compute/virtualMachines/retrieveBootDiagnosticsData/action",
        "Microsoft.Insights/Metrics/Read"
    ],
    "NotActions": [],
    "DataActions": [
        "Microsoft.KeyVault/vaults/keys/create/action",
        "Microsoft.KeyVault/vaults/keys/delete",
        "Microsoft.KeyVault/vaults/keys/read",
        "Microsoft.KeyVault/vaults/keys/encrypt/action"
    ],
    "NotDataActions": [],
    "AssignableScopes": ["/subscriptions/${SUBSCRIPTION_ID}"]
     }
     ```
    
  3. 新しいカスタムロールを作成します。

    az role definition create --role-definition "GKEOnAzureClusterResourceGroupScopedRole.json"
    
  4. 次のコマンドを使用して、サービス プリンシパルにロールを割り当てます。

    az role assignment create --assignee ${SERVICE_PRINCIPAL_ID} --role "GKE on-Azure API Cluster Resource Group Scoped Role" --scope /subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${CLUSTER_RESOURCE_GROUP_ID}
    

仮想ネットワーク リソース グループレベルのアクセス用のロールを作成する

  1. GKEOnAzureAPIVNetResourceGroupScopedRole.json という名前のファイルを作成します。

  2. エディタで GKEOnAzureAPIVNetResourceGroupScopedRole.json を開き、次の権限を追加します。

    {
    "Name": "GKE on-Azure API VNet Resource Group Scoped Role",
    "IsCustom": true,
    "Description": "Allow GKE on-Azure service manage resources in virtual network resource group scope.",
    "Actions": [
        "Microsoft.Network/virtualNetworks/read",
        "Microsoft.Network/virtualNetworks/subnets/read",
        "Microsoft.Network/virtualNetworks/subnets/join/action",
        "Microsoft.Authorization/roleDefinitions/write",
        "Microsoft.Authorization/roleDefinitions/delete"
    ],
    "NotActions": [],
    "DataActions": [],
    "NotDataActions": [],
    "AssignableScopes": ["/subscriptions/${SUBSCRIPTION_ID}"]
    }
    
  3. 新しいカスタムロールを作成します。

    az role definition create --role-definition "GKEOnAzureAPIVNetResourceGroupScopedRole.json"
    
  4. 次のコマンドを使用して、サービス プリンシパルにロールを割り当てます。

    az role assignment create --assignee ${SERVICE_PRINCIPAL_ID} --role "GKE on-Azure API Subscription Scoped Role" --scope "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/VNET_RESOURCE_GROUP_ID"
    

次のステップ