前に、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
で、あとはスクリプトを実行することで当月分の利用料金が得られる。
本当はもっと細かく利用データを取得できるのだが、面倒だったのでひとまずメインカテゴリ単位で集計している。