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:          <span style="color: #ff0000;">XXXXXXXX-711X-XX3b-aaXX-XXX027XXXda9</span>
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

次に、以下のコマンドで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:               <span style="color: #ff0000;">XXXXd7e0-XXXX-49b3-XXXX-ebXXXXabcXXX</span>
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

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

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