Azureの昨日までの各サービスの利用料金をSlackに通知させる

前に、AWSでの各サービス利用料金通知Botを作ってたので、Azureについても作成してみた。ソースはとりあえずこちらに配置している。
…正直、AWSに比べてえらい作りにくかった。AWSの場合だと一発でJSONでデータとれるのだが、Azureは各サービスの利用データと、その利用データごとのレート金額で分かれているので、データを取ってきたあとにマージしてやる必要があった。
あと、どうも日本リージョンのデータを取得する際にドルで取ってこれないようで、日本円で計算する必要があった。為替の変動とかに影響受けそうなんだけど、どうなんだろう…?
この辺の情報はソースに直書きになっているので、変更する場合は書き換えが必要。

面倒くさかったので認証情報等を記載するファイルPATHが固定になってる(/opt/script/.auth_info)ので、そこも環境に合わせるといいだろう。
まず、事前に以下のコマンドを実行して、AzureADアプリケーションの作成をしてApplication IDを取得する。

azure ad app create --name "Azure BillingInfomation Bot" \
--home-page "https://orebibou.com" \
--identifier-uris "https://orebibou.com" \
--password パスワード
blacknon@BS-PUB-UBUNTU-01:~$ azure ad app create --name "Azure BillingInfomation Bot" \
>  --home-page "https://orebibou.com" \
>  --identifier-uris "https://orebibou.com" \
>  --password パスワード
info:    Executing command ad app create
+ Creating application Azure BillingInfomation Bot
data:    Application Id:          XXXXXXXX-711X-XX3b-aaXX-XXX027XXXda9
data:    Application Object Id:   87160XXX-XXXX-XXXX-XXc8-XXX747bb8XXX
data:    Application Permissions:
data:                             claimValue:  user_impersonation
data:                             description:  Allow the application to access Azure BillingInfomation Bot on behalf of the signed-in user.
data:                             directAccessGrantTypes:
data:                             displayName:  Access Azure BillingInfomation Bot
data:                             impersonationAccessGrantTypes:  impersonated=User, impersonator=Application
data:                             isDisabled:
data:                             origin:  Application
data:                             permissionId:  XXXXe92b-XXXX-40b7-XXXX-18fbaeXXXX21
data:                             resourceScopeType:  Personal
data:                             userConsentDescription:  Allow the application to access Azure BillingInfomation Bot on your behalf.
data:                             userConsentDisplayName:  Access Azure BillingInfomation Bot
data:                             lang:
info:    ad app create command OK
Sponsored Links

次に、以下のコマンドでApplication IDに紐づいたObject Idを作成する。

azure ad sp create <Application ID>
blacknon@BS-PUB-UBUNTU-01:~$ azure ad sp create XXXXXXXX-711X-XX3b-aaXX-XXX027XXXda9
info:    Executing command ad sp create
+ Creating service principal for application XXXXXXXX-711X-XX3b-aaXX-XXX027XXXda9
data:    Object Id:               XXXXd7e0-XXXX-49b3-XXXX-ebXXXXabcXXX
data:    Display Name:            Azure BillingInfomation Bot
data:    Service Principal Names:
data:                             XXXXXXXX-711X-XX3b-aaXX-XXX027XXXda9
data:                             https://orebibou.com
info:    ad sp create command OK

 

利用しているサブスクリプションとObjectIDを紐づける。

azure role assignment create \
--objectId <Object ID> \
-o Reader \
-c /subscriptions/<サブスクリプションID>/
blacknon@BS-PUB-UBUNTU-01:~$ azure role assignment create \
>   --objectId XXXXd7e0-XXXX-49b3-XXXX-ebXXXXabcXXX \
>   -o Reader \
>   -c /subscriptions/XXXXf054-XXXX-4ada-XXXX-XXXX2e9fXXXX/
info:    Executing command role assignment create
+ Finding role with specified name
/data:    RoleAssignmentId     : /subscriptions/XXXXf054-XXXX-4ada-XXXX-XXXX2e9fXXXX/providers/Microsoft.Authorization/roleAssignments/XXXX83df-XXXX-4e34-9b84-XXXXd8a5XXXX
data:    RoleDefinitionName   : Reader
data:    RoleDefinitionId     : acdd72a7-3385-48ef-bd42-f606fba81ae7
data:    Scope                : /subscriptions/XXXXf054-XXXX-4ada-XXXX-XXXX2e9fXXXX
data:    Display Name         : Azure BillingInfomation Bot
data:    SignInName           :
data:    ObjectId             : XXXXd7e0-XXXX-49b3-XXXX-ebXXXXabcXXX
data:    ObjectType           : ServicePrincipal
data:
+
info:    role assignment create command OK

 

上記までで得られた情報を、「.auth_info」で定義してやる。
テナントIDについては、別途この辺を参考に確認してやる。

[Azure]
AZURE_API_VER = 2015-06-01-preview
AZURE_TENANT_ID = <テナントID>
AZURE_CLIENT_ID = <Application Id>
AZURE_CLIENT_PW = <Application Idのパスワード>
[slack]
WEBHOOK_URL = https://hooks.slack.com/services/XXXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXX

 

で、あとはスクリプトを実行することで当月分の利用料金が得られる。

 

本当はもっと細かく利用データを取得できるのだが、面倒だったのでひとまずメインカテゴリ単位で集計している。

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*