こんにちは、Azure課金を最小限に抑えたい石川です。
先日Azure REST APIを叩いてリソース監視をする記事を上げました。
その後、Azure SDK for .NETがあると天からの思し召しがありましたのでこちらで書き直してみます。
・パッケージのインストール
Nugetパッケージマネージャから Microsoft.Azure.Management.Fluent を検索し、インストールします。
もしくはパッケージマネージャーコンソールからいい感じにしてください。
PM> Install-Package Microsoft.Azure.Management.Fluent
・Azure側の準備
前回の記事と同様にサービスプリンシパル(AADアプリ)を作成します。
この記事では割愛しますが必要な情報は以下です。
- テナントID
- クライアントID
- クライアントシークレット
- サブスクリプションID
・リソース情報を取得する
今回扱っているパッケージはfluentなものなのでメソッドチェーンを多用します。ちょっと慣れてないと違和感。
ちなみにfluentは「流れるような」とか「流暢な」といった意味らしいです。
まず何をするにも認証を通らないといけないので認証情報を作成します。
var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(
<クライアントID>,
<クライアントシークレット>,
<テナントID>,
AzureEnvironment.AzureGlobalCloud
);
それぞれ必要な情報はstringで渡してあげましょう。もちろん、環境変数から読むのもありです。
次にリソースグループの一覧を取得します。まだ認証情報を作成しただけなので認証を通過しAzureを触れるようにしましょう。
var azure = await Azure
.Configure()
.WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
.Authenticate(credentials)
.WithDefaultSubscriptionAsync();
これでAzureを触るためのインスタンスのIAzureが生成できます。
これを使い、リソースグループを取得してみます。
var resourceGroups = await azure.ResourceGroups.ListAsync();
一行でリソースグループが取れました。
レスポンスとして IPagedCollection<IResourceGroup> という型の値が取れますがforeach等で良しなに処理ができます。
では次にリソース情報を取得してみます。
RestClientのインスタンスを生成してそれを使うことでリソースの情報取得ができるようです。
var restClient = RestClient.Configure()
.WithEnvironment(AzureEnvironment.AzureGlobalCloud)
.WithCredentials(credential)
.WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
.Build();
var client = new ResourceManagementClient(restClient);
client.SubscriptionId = <サブスクリプションID>;
var resources = await client.Resources.ListByResourceGroupAsync(<リソース一覧を取得したいリソースグループ名>);
こちらのレスポンスは IPage<GenericResourceInner> でリソースグループ同様良しなにできます。
いい感じにループさせてあげるとサブスクリプションに含まれる全リソースグループと全リソースの一覧を出すのも一瞬です。
?の画像みたいな感じで。
あとはSlackに飛ばす処理等々いい感じに書けば完成です。
前回のものと挙動は変わりません。こっそり差し替えてもバレませんね。
・まとめ
何か作るときにはとりあえずSDKを探す
ダメ元でもいいので何か外部APIを叩きに行ったりする場合はとりあえずSDKを探す癖を付けようと思いました………。jsonのデシリアライズなどの面倒な部分を吸収してくれるので本当に楽に書けます。
余談ですが、このSDKで今回使った機能はごくごく一部にしか過ぎないです。リソースを立てたり消したりといろいろなことができるSDKとなっているので他の機能も触ってみたいですね!
皆さんも機会があれば触ってみてはいかがでしょうか。
それでは今回はこの辺で。