Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

RBACのオペレーション一覧

RBACはカスタムロールを作ることができますが、それらの操作一覧を取得する備忘録です。

一覧表示

操作を表示するには、Get-AzureRmProviderOperation コマンドを使います。OperationSearchStringが必須引数なので、* とか指定すると全部でます。

Get-AzureRmProviderOperation -OperationSearchString "*"

VM系のを出したい場合、

Get-AzureRmProviderOperation -OperationSearchString "Microsoft.Compute/virtualMachines/*"

となります。

Out-GridViewとかで表示するとこんな感じです。

f:id:StateMachine:20160401111409p:plain

既定のVM管理者

プリセットされているVM管理者がいますが、その操作権限を表示させると以下となります。

> (Get-AzureRmRoleDefinition -Name "Virtual Machine Contributor").actions    

Microsoft.Authorization/*/read
Microsoft.Compute/availabilitySets/*
Microsoft.Compute/locations/*
Microsoft.Compute/virtualMachines/*
Microsoft.Compute/virtualMachineScaleSets/*
Microsoft.Insights/alertRules/*
Microsoft.Network/applicationGateways/backendAddressPools/join/action
Microsoft.Network/loadBalancers/backendAddressPools/join/action
Microsoft.Network/loadBalancers/inboundNatPools/join/action
Microsoft.Network/loadBalancers/inboundNatRules/join/action
Microsoft.Network/loadBalancers/read
Microsoft.Network/locations/*
Microsoft.Network/networkInterfaces/*
Microsoft.Network/networkSecurityGroups/join/action
Microsoft.Network/networkSecurityGroups/read
Microsoft.Network/publicIPAddresses/join/action
Microsoft.Network/publicIPAddresses/read
Microsoft.Network/virtualNetworks/read
Microsoft.Network/virtualNetworks/subnets/join/action
Microsoft.ResourceHealth/availabilityStatuses/read
Microsoft.Resources/deployments/*
Microsoft.Resources/subscriptions/resourceGroups/read
Microsoft.Storage/storageAccounts/listKeys/action
Microsoft.Storage/storageAccounts/read
Microsoft.Support/*

以上

Azure SDK for Java 1.0.0 beta

AutoRestに対応したJava SDK 1.0.0 beta がリリースされてます。GitHubのAutoRestブランチを参照してください。

github.com

0.9系のAPIから大幅に変更されているため互換がありません。ただ各言語共通フレームワークからの自動生成なので、各言語間のクラス構成やメソッド名などの差異が(言語差はあるとして)ありません。

pom

READMEのとおりだと、依存が見つからないのでVMを操作するときの最小限の依存関係のpomを張っておきます(備忘録)

  • compute がVMを操作するもの
  • adal4j は Azure Active Directory
  • client authenticationはクライアント認証に必要な補足的なクラス
    <dependencies>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-mgmt-compute</artifactId>
            <version>1.0.0-beta1</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-client-authentication</artifactId>
            <version>1.0.0-beta1</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>adal4j</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>

使用例

例によってADALでアプリ登録を行い、テナントID、クライアントID、クライアントキーを取得しておき、ApplicationTokenCredentials クラスで認証を行います。 VMを操作するクラスとしてComputeManagementClientを使いますが、サブスクリプションはそこに設定するみたいです。

あとは、Operationオブジェクトを取得してVM情報を取得する流れとなります。

    private static void getVirtualMachine(
            String subscriptionId,
            String tenantId,
            String clientId,
            String clientKey)
            throws CloudException, IOException, InterruptedException {
        
        ApplicationTokenCredentials creds = new ApplicationTokenCredentials(
                clientId, tenantId, clientKey, null);

        ComputeManagementClientImpl client = new ComputeManagementClientImpl(creds);
        client.setSubscriptionId(subscriptionId);

        String rg = "your-resourece-group-name";
        String rs = "your-vm-name";
        ServiceResponse<VirtualMachine> response = client.getVirtualMachinesOperations().get(rg, rs, "instanceview");
        System.out.println(response.getBody().getName());
    }

インスタンスビューを取得するのに、第3引数に"instanceview"を指定するのは,前BLOG ARM API およびSDKでの仮想マシンの状態取得 - Azureの小ネタ (改) のとおりです。

ARM API およびSDKでの仮想マシンの状態取得

ARM APIを使うSDK(Python、Java)などで仮想マシンの状態(InstanceView)を取得するのにハマったので備忘メモ。

前提として

そもそも、InstanceViewを取得するには以下のAPIを使います。

Get information about a virtual machine

二種類あって、以下がInstanceView取得用です。クエリではなく、URLにInstanceViewが埋め込まれてます。

https://management.azure.com/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.Compute/virtualMachines/{vm-name}/InstanceView?api-version={api-version}

また、最近の言語向けSDKは自動生成なので、言語間でほぼ同じようなメソッド、クラスが用意されていますが、このInstanceViewを取得するメソッドが用意されていなくて、ソースみたんですけど、該当メソッドを見つけることはできませんでした。(同名で違うメソッドはいくつか見つかりますが。)

結論

というわけでPython SDKにIssueを挙げたのですが、要約すると、"expand=instanceview"というアンドキュメンテッドなクエリパラメータが用意されていて、それを前提としているような感じでした。なので、それを使えと。 試してみたところ、Python/Javaともに問題なく取得できました。

AutoRestでの議論 compute: spec missing for virtualmachines/{vm}/InstanceView · Issue #117 · Azure/azure-rest-api-specs · GitHub

Python SDKでの質問 Instance view of virtual machine · Issue #548 · Azure/azure-sdk-for-python · GitHub

同じことがJavaでも。 Autorest: unable to receive VM InstanceView · Issue #618 · Azure/azure-sdk-for-java · GitHub

まとめ

AutoRestの自動生成フレームワークだと、APIの設計によって多くの言語に影響がでちゃうのはしょうがないというか、少し懸念していたことが起きた感じがします。で、どこに質問していいかわからなくて、案外、既に議論されている内容だったりして。 地味にウォッチしておかないとだめですかね。