column

コラム

Azureのコスト情報をTeamsで通知する方法

はじめに

こんにちは。BTCクラウドCoEの長塚です。

今回は日次でTeamsの専用チャネルにAzureのコスト情報を通知するバッチの作成方法について説明します。

弊社社内で運用しているAzuresサブスクリプションのコスト情報を管理するため、Azureリソース毎の利用料金の合計とリソースすべての利用料金の合計をTeamsに通知するバッチを作成しました。

Azureのサービスを組み合わせることで素早く簡単に上記バッチを実装することができます。

また、AzureのコストをTeamsに連携する実装方法についてネット上に情報が少なく苦労したため、少しでも皆さんの参考になれば幸いです。

機能要件

今回実装するバッチの機能要件は以下の通りです。

・社内で運用しているAzureサブスクリプションのコスト情報を日次でTeamsの専用チャネルに通知する。

・Azureリソース毎の利用料金の合計とリソースすべての利用料金の合計を表示する。(小数第3位以下は切り捨て)

アーキテクチャ

今回実装するバッチのアーキテクチャと処理の流れは以下の通りです。

アーキテクチャ図

処理の流れ

1. Logic AppsのスケジュールトリガでLogic Appsワークフローを起動

2. Cost Management APIをコールし、コスト情報を取得

3. Azure Functionsをコールし、取得したコスト情報を成形

4. 成形したコスト情報をTeamsのチャネルに投稿する

実装手順

ここからは、以下の流れでコスト情報連携バッチの実装手順を説明します。

1. Azure Functionsの作成

2. Logic Appsの作成

3. Azure FunctionsとLogic Appsのアクセス許可設定

4. Logic Appsワークフローの作成

前提条件

以下事項を満たしていることがバッチの実装を行う上での前提条件となります。

Azureサブスクリプションを持っていること

 Azureで利用する全てのリソースはサブスクリプションに紐付けされます。

 Azureサブスクリプションが無い場合はプロジェクトの作成と管理から作成してください。

サブスクリプション配下にリソースグループが作成されていること

 Azureリソースはリソースグループ配下に作成する必要があります。

 今回作成するAzureリソースを格納するためのリソースグループを事前に作成しておいてください。

 リソースグループが存在しない場合、Azure portal を使用した Azure リソース グループの管理から作成してください。

Azure Cost Management(ACM)を有効化していること

 今回はCSP契約によるサブスクリプションであることを前提としています。

 CSPに対してACMを有効化するよう依頼し、有効化されていることを確認してください。

 CSP契約の場合、Cost Management APIで取得したコスト情報は実際の請求金額とは異なります。(CSP側でのディスカウント等があるため)

 したがって、あくまでコスト推移を確認するためのものであることをご理解ください。(個人のオンラインサブスクリプションの場合を除く)

1. Azure Functions の作成

まず、Azure Functionsのプロビジョニングを行います。

事前に用意したサブスクリプション配下のリソースグループにアクセスし、[作成]をクリックします。

検索窓で[関数アプリ]を検索し、検索結果から[関数アプリ]をクリックします。

関数アプリ画面の[作成]をクリックします。

以下の通りに情報を入力し、他はそのままで[確認および作成]をクリックします。

インバウンドのパブリックアクセスは拒否に設定します。

サブスクリプション:任意のサブスクリプション

リソースグループ:上記サブスクリプション配下の任意のリソースグループ

関数アプリ名:任意の関数アプリ名

コードまたはコンテナーイメージをデプロイしますか?:コード

ランタイムスタック:Node.js

バージョン:18 LTS

地域:Japan East

オペレーティングシステム:Linux

ホスティングオプションとプラン:消費量(サーバレス)

関数アプリのプロビジョニングが完了しました。

続いて、作成したCloud Functionsにソースコード(index.js、package.json等)をデプロイします。

デプロイ方法は複数の方法から任意で選択できます。

VS Codeの拡張機能を利用(簡単なのでおすすめ)してデプロイしたり、Azure portalからZipファイルのアップロード、Azure CLIのコマンド実行等でもデプロイ可能です。

今回利用しているソースコードはGithubのこちらのリポジトリで公開していますので、ご興味のある方はご利用ください。

VS Code拡張機能デプロイ手順はこちらを参考にしてください。

2. Logic Appsの作成

Logic Appsのプロビジョニングを行います。

Auzre portalの検索窓で「ロジック アプリ」を検索し、ロジックアプリ画面を開きます。

[追加]をクリックします。

以下の通りに入力し、[確認及び作成]をクリックします。

サブスクリプション:任意のサブスクリプション

リソースグループ:上記サブスクリプション配下の任意のリソースグループ

ロジックアプリ名:任意の関数アプリ名

コードまたはコンテナーイメージをデプロイしますか?:コード

ランタイムスタック:Node.js

バージョン:18 LTS

地域:Japan East

ログ分析を有効化:いいえ

プランの種類:消費量(サーバレス)

ゾーン冗長:無効

Logic Apps画面からロジックアプリデザイナー画面を開きます。

[空のロジックアプリ]をクリックして、空のLogic Appsワークフローを作成します。

3. Azure FunctionsとLogic Appsのアクセス許可設定

次に、Logic AppsのマネージドIDの有効化とFunctionsでのアクセス許可設定を行います。

Logic Apps画面のID画面を開きます。

Logic Apps 側でマネージド ID を有効化(「オン」)し、[オブジェクト(プリンシパル)ID]をコピーして控えておきます。

Azure Functionsの認証画面で[プロバイダーの追加]をクリックします

以下の通り設定し、[追加]をクリックします。

追加したIDプロバイダーの[編集]をクリックします。

先ほど控えておいたLogic Apps のマネージド ID のオブジェクト ID に対して、アクセス許可を設定し、[保存]をクリックします。

アプリケーションID:Logic Apps のマネージド ID のオブジェクト ID

発行者のURLhttps://sts.windows.net/対象サブスクリプションの親のAzureADテナントID

許可されるトークン対象ユーザーhttps://management.azure.com

ここで、Azure Functions許可ルールにLogic Appsランタイム発信IPの設定を行います。

Logic Appsのプロパティ画面を開き、[ランタイム発信IPアドレス]の値を全て控えます。

作成したAzure Functionsのネットワーク画面を開き、[アクセス制限]をクリックします。

アクセス制限画面で[パブリックアクセスを許可する]にチェックを入れます。

[追加]をクリックします。

以下設定し[ルールの更新]をクリックします。

1行ルールを作成し、各ルールの[IPアドレスブロック]に先ほど控えておいたランタイム発信IPアドレスを設定します。

名前:<任意のルール名>

優先度:300

アクション:許可

IPアドレスブロック:ランタイム発信IPアドレス

全てのIPアドレスを追加できたら[保存]をクリックします。

5. Logic Appsワークフローの作成

最後にLogic Appsワークフローを作成します。

Logic Appsデザイナー画面を開き、繰り返しアクションを追加します。

以下の通り設定します。アクションを追加したり設定変更した後は[保存]をクリックしないとワークフローに反映されません。

間隔:1

頻度:日

タイムゾーン:(UTC +09:00)大阪、札幌、東京

設定時刻(時間):10

Cost Management APIをコールするHTTPアクションを作成します。

HTTPアクションを追加し、以下の通り設定します。

・方法 : POST

URI : https://management.azure.com/subscriptions/<Subscription ID>/providers/Microsoft.CostManagement/query?api-version=2019-11-01

本文 : (以下の JSON を入力します。)

{
    "dataset": {
        "aggregation": {
            "totalCost": {
                "function": "Sum",
                "name": "PreTaxCost"
            }
        },
        "granularity": "Daily",
        "grouping": [
            {
                "name": "ResourceType",
                "type": "Dimension"
            }
        ]
    },
    "timeframe": "MonthToDate",
    "type": "Usage"
}

認証 : Managed Identity

Managed Identity : System-assigned managed identity

対象ユーザー : https://management.azure.com

Azure Functionsをコールするアクションを作成します。

新しいステップを追し、Azure Functionsを検索し選択します。

作成した対象のAzure Functionsを選択します。

以下の通り設定します。

要求本文:本文

方法:POST

認証の種類:マネージド ID

マネージド ID:システム割り当てマネージド ID

       ※[対象ユーザー]の入力は不要です。

最後に、Teamsにメッセージを投稿するアクションを追加し作成します。

以下の通り設定します。

投稿者 : フローボット

投稿先 : Channel

Team : (任意のチーム)

Channel : (任意のチャネル)

Message : 動的コンテンツタブでAzure Fiunctionsの「本文」を選択

※Teamsにアクセス可能なアカウントの認証を求められた場合は、ワークフロー作成者ご自身のアカウント(メールアドレス)で認証して下さい。

最終的なワークフローの形は以下の通りです。

こちらのワークフローを手動実行するか、起動時刻になると、対象のTeamsのチャネルに以下のようにコスト情報が投稿されます。

以上でバッチの実装は完了です。お疲れ様でした。

まとめ

Azureのサービスを利用して少ない手順で素早くコスト情報連携のバッチを実装することができました。

これによりサービス利用料を毎日コンソール上で確認したりレポートを作成する手間を減らすことができます。

実装した所感としては、公式ドキュメントやネットの情報だけだと、どうしてもアクセス制御などの細かい設定手順を見つけることが難しいため、Microsoftサポートを活用することが大切だということを改めて感じました。

Azure Functionsの許可ルール設定については、よりスマートな方法があるのではないかと感じているので、今後の課題として調べてみたいと思います。

AzureとTeamsの連携は非常に簡単にできますので、もしTeamsを利用していればAzureを使って今回のような業務自動化はしやすいかもしれませんね。

Azureを触ってみたいけど何から手を付けたら良いか迷っている方は、もしご興味がありましたら今回のチュートリアルを試してみてはいかがでしょうか。

今回は以上になります。

最後までお付き合いいただきありがとうございました!

参考

Azure Logic Apps でマネージド ID を使用して Azure リソースへのアクセスを認証する

Logic Appsを定時実行させる

Azure Functions を使用して Azure Logic Apps のワークフローからコードを作成して実行する

Azure App Service のアクセス制限を設定する

RECOMMEND

おすすめ記事一覧