Azureを操作する方法の1つとしてREST APIがあります。純正のCLI, ARM templateやサードパーティのTerraformに比べると操作の手間は大きいですが、痒いところには手が届きます。このページでは忘れがちなREST APIに対する権限設定の方法をまとめます。APIの具体的な仕様は本ページでは説明を省略します。仕様をお探しの方は「Azure REST API reference」を参照ください。
権限付与の操作
アプリの登録
「Azure ポータル」の全てのサービスから、「ID」「Azure Active Directory」の順に画面遷移します。
「アプリの登録」「新規登録」の順に押下します。
「名前」欄を入力し、「登録」を押下します。
クライアントシークレットの発行
「Azure ポータル」の全てのサービスから、「ID」「Azure Active Directory」の順に画面遷移します。
「アプリの登録」「アプリ名(app-test-01)」の順に押下します。
「概要」ページに表示される「アプリケーション(クライアント)ID」「ディレクトリ(テナント)ID」をメモに控えます。この値はREST APIで操作する時に必要になります。
「証明書とシークレット」「新しいクライアントシークレット」の順に押下すると、シークレットの発行画面が表れます。「説明」「有効期限」を入力し、「追加」を押下します。
シークレット発行後に表示される画面で「値」をメモに控えます。この「値」は漏洩してはいけない情報ですので、この画面を遷移してしまうと2度と表示されなくなります。メモに控え忘れた場合は、シークレットの発行からやり直してください。
ブログやGitHubでシークレット等のクラウドへの接続情報を公開するのは非常に危険な行為ですし、大きな損害をもたらします。誤って勤務先のシークレットを公開し、懲戒解雇になった事例も見た事があります。ここで公開したシークレットは、失効済みのAzure個人アカウントのものです。一般的な視点で見れば、「非常に危険なこと」をしているのをご理解ください。
アクセス制御(IAM)
「Azure ポータル」の全てのサービスから、「全般」「サブスクリプション」の順に画面遷移します。
「サブスクリプション名(gokatei-subsription-02)」「アクセス制御(IAM)」「追加」「ロールの割り当て」の順に押下します。
「共同作成者」を選択し、「次へ」を押下します。
このページでは最も強い権限を与える方法を紹介していますが、弱い権限を与える事もできます。共同作成者以外のロールを付与したり、サブスクリプションではなくリソースグループに権限を付与する事もできます。
「メンバーを追加する」を押下し、検索窓に「アプリ登録」の名前がヒットするような絞り込みの文字を入力します。
検索窓に文字を入力しないと「アプリ登録」が候補として現れません。
「アプリ登録(app-test-01)」を選択した状態にし、「選択」を押下します。
「レビューと割り当て」を押下します。
「レビューと割り当て」を押下します。
動作確認
トークンの発行
以下のようなAPI requestを送付するとaccess_tokenを取得できます。なお、TENANT_ID等は環境に応じて適宜の変更をお願いします。
TENANT_ID="a8f8d8d3-ad2c-4d3a-80f5-f6c5753a5e10" APPLICATION_ID="b43358dd-2e51-4bab-b9da-85fa28e321b6" CLIENT_SECRET="dV87Q~Mc7t.MhPRX2kBs83p-B_JJi0V~C1PRN" curl --silent --request POST \ https://login.microsoftonline.com/${TENANT_ID}/oauth2/token \ -F grant_type=client_credentials \ -F resource=https://management.core.windows.net/ \ -F client_id=${APPLICATION_ID} \ -F client_secret=${CLIENT_SECRET} | jq
実行例は以下の通りです。確かに、access_tokenを取得できている事を確認します。
$ curl --silent --request POST \ > https://login.microsoftonline.com/${TENANT_ID}/oauth2/token \ > -F grant_type=client_credentials \ > -F resource=https://management.core.windows.net/ \ > -F client_id=${APPLICATION_ID} \ > -F client_secret=${CLIENT_SECRET} | jq { "token_type": "Bearer", "expires_in": "3599", "ext_expires_in": "3599", "expires_on": "1646813352", "not_before": "1646809452", "resource": "https://management.core.windows.net/", "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImpTMVhvMU9XRGpfNTJ2YndHTmd2UU8yVnpNYyIsImtpZCI6ImpTMVhvMU9XRGpfNTJ2YndHTmd2UU8yVnpNYyJ9.eyJhdWQiOiJodHRwczovL21hbmFnZW1lbnQuY29yZS53aW5kb3dzLm5ldC8iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9hOGY4ZDhkMy1hZDJjLTRkM2EtODBmNS1mNmM1NzUzYTVlMTAvIiwiaWF0IjoxNjQ2ODA5NDUyLCJuYmYiOjE2NDY4MDk0NTIsImV4cCI6MTY0NjgxMzM1MiwiYWlvIjoiRTJaZ1lIQlhqZWk3VktteHhIem43aElqTWRZTEFBPT0iLCJhcHBpZCI6ImI0MzM1OGRkLTJlNTEtNGJhYi1iOWRhLTg1ZmEyOGUzMjFiNiIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2E4ZjhkOGQzLWFkMmMtNGQzYS04MGY1LWY2YzU3NTNhNWUxMC8iLCJpZHR5cCI6ImFwcCIsIm9pZCI6IjEzNjRhOWQwLWUxMzUtNDczNy1iZTYwLWExNmE5MzY1Njg1OSIsInJoIjoiMC5BWEVBMDlqNHFDeXRPazJBOWZiRmRUcGVFRVpJZjNrQXV0ZFB1a1Bhd2ZqMk1CT0hBQUEuIiwic3ViIjoiMTM2NGE5ZDAtZTEzNS00NzM3LWJlNjAtYTE2YTkzNjU2ODU5IiwidGlkIjoiYThmOGQ4ZDMtYWQyYy00ZDNhLTgwZjUtZjZjNTc1M2E1ZTEwIiwidXRpIjoidVBYdFUwZVpmMDZNTVI3VGI3R0FBQSIsInZlciI6IjEuMCIsInhtc190Y2R0IjoxNjQ0NTUyNTMyfQ.OGxk_KuAj91wuy3F_glh9pjPMbVfCosjeyz__MavlhOMiJPJxjN0RK05CUa-lmXwA_D1OVdCeX8JbIiiSMw0qYFfx0t3YYuK0nkz_noGoZC1ymQtzVQyWdc-bV18CzdsupLUTg4H2HczpHBRv4_f3ekfUday45Im8yWUiOOmlnt4OpIKWvwRc36z4kH4hKztXLu_hVx5mqV0id56-luhoxljukTMAFHjuDPo4hhJLKz6ZM8G0wx7WbXp5Hl2Pnmb8HA21iGhOF7_vzT3A1VVnJpNKRJnul16pZ7pFavOQoobuIOQq9iTbG8nzRzw6hFtbUhaEUNv4wNJ54lBe6_cgQ" }
初めての情報取得
access_tokenを手作業でコピーするのは手間ですので、何らかの方法で変数に格納します。実装例は以下の通りです。
TOKEN=$(curl --silent --request POST \ https://login.microsoftonline.com/${TENANT_ID}/oauth2/token \ -F grant_type=client_credentials \ -F resource=https://management.core.windows.net/ \ -F client_id=${APPLICATION_ID} \ -F client_secret=${CLIENT_SECRET} | jq -r ' .access_token ')
サブスクリプションの概要ページを開き、サブスクリプションのIDをコピーします。
サブスクリプションIDを変数に設定し、以下のようにHTTP requestを実行します。
SUBSCRIPTION_ID="2e2f81a9-b030-410f-9784-c582580c932e" curl --silent -X GET \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups?api-version=2014-04-01 | jq
実行例は以下の通りです。Authorizationヘッダーにaccess_tokenの値を設定します。
リソースグループが存在しないならば空配列が返され、リソースグループが作成済ならばリソースグループの情報が表示されます。
$ curl --silent -X GET \ > -H "Content-Type: application/json" \ > -H "Authorization: Bearer ${TOKEN}" \ > https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups?api-version=2014-04-01 | jq { "value": [] }
GETリクエスト(情報取得)の動作確認
動作確認用の仮想ネットワークを作成します。作成方法はポータルやCLI等の任意の方法で差し支えございません。azコマンドで操作する例は以下の通りです。
az group create --name ResourceGroupApiTest01 --location japaneast az network vnet create \ -g ResourceGroupApiTest01 \ -n Vnet16 \ --address-prefix 172.16.0.0/16 \ --subnet-name Vnet16-Subnet00 \ --subnet-prefix 172.16.0.0/24
作成したリソースをAPIで確認してみましょう。リソースグループの一覧を取得する操作例は以下の通りです。
[操作コマンド] curl --silent -X GET \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups?api-version=2014-04-01 | jq [出力] { "value": [ { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/ResourceGroupApiTest01", "name": "ResourceGroupApiTest01", "location": "japaneast", "properties": { "provisioningState": "Succeeded" } }, { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/NetworkWatcherRG", "name": "NetworkWatcherRG", "location": "japaneast", "properties": { "provisioningState": "Succeeded" } } ] }
リソースグループの一覧ではなく1つを表示したいならば、以下のようにURLにリソースグループ名を含めます。
[操作コマンド] curl --silent -X GET \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/ResourceGroupApiTest01?api-version=2014-04-01 | jq [出力] { "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/ResourceGroupApiTest01", "name": "ResourceGroupApiTest01", "location": "japaneast", "properties": { "provisioningState": "Succeeded" } }
仮想ネットワークの一覧を取得する操作例は以下の通りです。
[操作コマンド] RESOURCE_GROUP_NAME="ResourceGroupApiTest01" curl --silent -X GET \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP_NAME}/providers/Microsoft.Network/virtualNetworks?api-version=2021-02-01 [出力] { "value": [ { "name": "Vnet16", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/ResourceGroupApiTest01/providers/Microsoft.Network/virtualNetworks/Vnet16", "etag": "W/\"fd1dcf34-62db-4e55-bdce-5011e6adb78c\"", "type": "Microsoft.Network/virtualNetworks", "location": "japaneast", "tags": {}, "properties": { "provisioningState": "Succeeded", "resourceGuid": "13230f80-111f-474a-b7be-ddff7de701d3", "addressSpace": { "addressPrefixes": [ "172.16.0.0/16" ] }, "dhcpOptions": { "dnsServers": [] }, "subnets": [ { "name": "Vnet16-Subnet00", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/ResourceGroupApiTest01/providers/Microsoft.Network/virtualNetworks/Vnet16/subnets/Vnet16-Subnet00", "etag": "W/\"fd1dcf34-62db-4e55-bdce-5011e6adb78c\"", "properties": { "provisioningState": "Succeeded", "addressPrefix": "172.16.0.0/24", "delegations": [], "privateEndpointNetworkPolicies": "Enabled", "privateLinkServiceNetworkPolicies": "Enabled" }, "type": "Microsoft.Network/virtualNetworks/subnets" } ], "virtualNetworkPeerings": [], "enableDdosProtection": false } } ] }
PUTリクエスト(追加・更新)の動作確認
PUTリクエストを使用すると、リソースの追加と更新ができます。例えば、リソースグループを作成する操作例は以下の通りです。
curl --request PUT -d @- \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/ResourceGroupApiTest02?api-version=2014-04-01 << EOF { "name": "ResourceGroupApiTest02", "location": "japaneast" } EOF
変数やAPIバージョンを調べるには「Azure REST API reference」を参照しても良いですが、「Azure ARM template操作の説明」で説明したようにJSONビューを見て判断する横着する方法もあります。
DELETEリクエスト(削除)の動作確認
リソースの削除はGETやPUTに比べると簡単です。リソースのURLに対しDELETEリクエストを送付するだけです。
curl --request DELETE \ -H "Content-Type: application/json" \ -H "Authorization: Bearer ${TOKEN}" \ https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/ResourceGroupApiTest02?api-version=2014-04-01