こんにちは。サイオステクノロジー技術部の武井です。今回は、リソースの作成者を取得する方法を書きます。
リソースとは?
Azureでは、仮想マシン、IPアドレス、ストレージ等Azureを構成する要素を「リソース」という単位で扱います。それらを束ねるものとして、「リソースグループ」というものものあり、リソースグループ自体もリソースとなります。
リソースの作成者を知りたい
「この仮想マシン誰が作ったの?」とか「このリソースグループの管理者誰?」というケースは、よくあると思います。
しかしながら、リソース自体には「作成者」という情報を持っていません。そこで、リソースの作成者を知るには、「アクティビティログ」を使います。
アクティビティログには、リソースに関する全てのイベント(作成、変更、削除、閲覧等)が記録されます。この中の「作成」のイベントの中に、リソース作成者の情報が入っています。
ただし、アクティビティログの保存期限は90日です。必ず90日以内にこの処理を行わないと、永遠に作成者を取得することはできません。
リソースの作成者を取得する方法
Rest APIで取得します。SDKもありますが、まずはこちらの方法でやってみます。
Azureポータルにログインして、Azure Active Directory→アプリの登録とクリックします。
「新しいアプリケーションの登録」をクリックします。
「名前」にアプリケーションを識別するための任意の名称、「アプリケーションの種類」に「Web アプリ/API」、「サインオンURL」に「https://localhost/」と入力します。
アプリケーションの作成が完了すると、下記のようなリストに表示されますので、クリックします。
「プロパティ」をクリックします。表示される「アプリケーションID」をメモしておきます。
「キー」をクリックします。
「説明」の部分にキーを識別する任意の名称、「有効期限」に適切な有効期限を選択(期限なしはおすすめできません)して、「保存」をクリックします。
下図の赤枠のところに生成されたキーが表示されます。これをメモしておいて下さい。この画面から離れると二度と表示されなくなりますので、忘れずにメモを!!
Azure Active Directory→プロパティとクリックします。表示される「ディレクトリID」をメモしておきます。
次にサブスクリプションにAPIがアクセスする権限を与えます。サブスクリプションをクリックします。権限を与えたいサブスクリプションをリストの中からクリックします。
「アクセス制御(IAM)」→「+追加」の順にクリックします。
「役割」に「閲覧者」、「アクセスの割り当て先」に「Azure ADのユーザー、グループ、またはアプリケーション」を選択します。そして、先程作成したアプリを選択して、「保存」をクリックします。これで、サブスクリプションへのアクセス権限の付与は完了です。
次に、APIの認証情報を取得します。OAuthのアクセストークンを取得します。curlコマンドで以下を入力して下さい。(curlでなくてもHTTPリクエストが発行できれば何でもよいです)
curl -X POST -H “Content-Type: application/x-www-form-urlencoded” -d “grant_type=client_credentials” -d “resource=https://management.azure.com/” -d “client_id=[メモしたクライアントID]” --data-urlencode “client_secret=[メモしたキー]” https://login.windows.net/[メモしたディレクトリID]/oauth2/token?api-version=1.0
すると以下のようなレスポンスが返ってきます。アクセストークンが取得できます。このアクセストークンをメモっておきます。
{“token_type”:“Bearer”,“expires_in”:“3600”,“ext_expires_in”:“0”, “expires_on”:“1507631922”,“not_before”:“1507628022”, “resource”:“https://management.azure.com/”,“access_token”:”[アクセストークン]"}
これで全ての準備は整ったので、いよいよアクティビティログを取得します。以下のHTTPリクエストをcurlで発行して下さい。
curl -v -G -H "Content-Type: application/json" -H "Authorization: Bearer [メモしたアクセストークン]" "https://management.azure.com/subscriptions/[サブスクリプションID]/providers/microsoft.insights/eventtypes/management/values" --data-urlencode "api-version=2015-04-01" --data-urlencode "$filter=eventTimestamp ge '2017-08-21T20:00:00Z' and resourceId eq '[リソースID]'"
ちょっと解説します。上記の「$filter=・・・」のところは、ログのフィルタを行います。SQLで言うところのWHERE句のようなものです。ここは、現在日付の90日前まで指定できます。作成した日付を取りたいので、なるべく過去のほうがよいです。
「resourceId eq ‘[リソースID]’」のところは、作成者を知りたいリソース(仮想マシンやストレージ等)のIDを指定しています。一般的にリソースのプロパティからリソースIDを取得できることが多いです。例えば、リソースグループのリソースIDを取得する方法は以下です。対象のリソースグループを表示して「プロパティ」をクリックすると、「リソースID」が表示されます。
先程のHTTPリクエストを発行すると、以下のようなレスポンスが返ってきます。(一部抜粋です)
{ "value": [ { "caller": "ntakei@contoso.com", "operationName": { "value": "Microsoft.Resources/subscriptions/resourcegroups/write", "localizedValue": "Update resource group" }, "subStatus": { "value": "Created", "localizedValue": "Created (HTTP Status Code: 201)" }, } ] }
リソースグループで言えば、「operationName.value」が「Microsoft.Resources/subscriptions/resourcegroups/write」、「subStatus.value」が「Created」のときの「caller」が、このリソースの作成者ということのようです。ただし、他のリソースはこの限りではありません。作成者を取得するための条件はリソースごとに異なります。
これでようやく、リソースの作成者が取れました。もっと簡単に取れるようになるといいのですが・・・。