Azureの検証環境コストを削減したい #3 Azureポリシーを利用してリソースを制限する

#1.はじめに
肌寒さが身にしみる近頃ですが、皆様におかれましてはいかがお過ごしでしょうか。
肌寒くなると、どうしても足が冷えるので、作業中はひざ掛けが欲しくなりますね。

さて、だいぶ[Azureの検証環境コストを削減したい♯2](https://qiita.com/motomiya_hikaru/items/fc0c5526938456fc3734)から時間がたってしまいましたが、続きの記事です。

今回は、「アラートは設定したけど実際アラートが鳴ったらどうしたらいい？」という記事です。

#2.一言でいうと
 - アラートが鳴ったら迅速に行動しよう
 - まずはコスト管理を確認しよう
 - ポリシーを作って適用しよう

#3.「あっ！アラートがなってる！」と気が付いたら
まず何はともあれ__「コスト管理」を確認しましょう。__
コスト管理 > コスト分析をひらきます。
すると、どのサブスクリプション・リソースグループで、何のリソースにコストがかかっているのか確認できます。

リソースグループとリソースから、__誰のどのリソースがどの程度コストがかかっているのか、見当が付くはずです。__
あとはそれが削除・停止してもよいリソースなのか、当事者に判断してもらいましょう。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/276c8a36-0276-007b-a52a-3d76dd3b16d8.png)|
|:--|
どうやら私の場合、__ApplicationGatewayに対して、多くのコストが発生しているみたいです__。
これはいけませんね！

見直した結果、__テスト用ApplicationGatewayのプランがWAFV2となっており、例のようにコストがかかっていることがわかりました。__
詳しくは[Azureの検証環境コストを削減したい#1(Load Balancer/Application Gateway)](https://qiita.com/motomiya_hikaru/items/6db04a20a088063b0398)を参照(隙あらば自分の記事上げ)。

#4.言ってわからない人には
言ってやってくれる相手なら、楽なものです。
困ったことに、__世の中には言ってもやってくれない人が山のようにいるのです…。__
そんな人にはどうしたらいいでしょう？

__Azureポリシーでそもそも高額なプランを利用できなくしちゃえばいいのです！__

#5. Applicaitongateway用Azureポリシーをデプロイする

Azure ポリシーは、自分で作成することもできますし、Azureのサンプルを利用することや、コミュニティが作成したポリシーを利用することもできます。
ApplicaitonGatewayのSKUをV1に固定するポリシーは、Azureのサンプルリポジトリにありますので、それを利用します。

[Allowed Application Gateway SKUs](https://github.com/Azure/azure-policy/tree/master/samples/Network/application-gateway-skus)

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/913b98ba-2336-0e3f-23ca-179e37e1bb77.png)|
|:--|

Azureにサインインした状態で、「Deploy to Azure」を選択しましょう。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/282ec7f1-a7ef-fca4-4b43-7c5b1d9c108d.png)|
|:--|

すると、自分のAzure環境へポリシーを持ってくることができます。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/0895a9eb-a102-0532-76aa-e08887186500.png)|
|:--|

- 定義の場所…デプロイしたいサブスクリプションを選択します。
- カテゴリ…作成するポリシーを分かりやすいカテゴリに配置します。ここでは「ApplicaitonGateway」としました。

そして下にある「作成」を選択すると…

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/ace14200-9ca6-275c-9023-b0e74ba42d04.png)|
|:--|

はい、できました！簡単ですね。

#6. ポリシーを割り当てる

ポリシーを作成しただけでは意味がありません。__作成したポリシーを割り当てしましょう。__

まず、Azureポータルから__「ポリシー」__を開いて、作成メニューの__「割り当て」__を選択します。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/aaf920cf-069d-79a1-7f45-c03b68c7b127.png)|
|:--|

__「ポリシーの割り当て」__を選択します。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/e24b3827-89d2-c9c6-dc62-2b34194f6943.png)|
|:--|

ポリシーの割り当て画面が開くので、各設定値を入れます。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/76a3a5be-95ee-c3f9-9b70-7ecbc825e923.png)|
|:--|

- スコープ…ポリシーを適用したい範囲です。今回は「test-applicationgateway」のリソースグループにのみ適用することとしました。
- 除外…スコープの範囲内で除外したいリソースがあれば選択します。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/c845fe84-eb39-2f84-5592-821bed92fbbf.png)|
|:--|

- ポリシー定義…さきほど作成した「Allowed Application Gateway SKUs」を選択します。
あとの項目はデフォルトで、__「次へ」__を選択します。

__「パラメーター」__設定画面で、次のように設定します。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/b8f42954-8741-8a07-ef04-4ed97bea0fa2.png)|
|:--|

- AllowedSKUs…ApplicationGatewayで許可するSKUを直接エディターに記載します。ここでは、最も小さなサイズだけ許可するとして、__[Standard_Small]__としました。

__「確認および作成」__を選択します。

すると…

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/1cb8e524-688d-27f9-7ef7-b2d1ebfe02f2.png)|
|:--|

はい、成功しました。これで「test_applicatongateway」で「Stanard_Small」以外でリソースを作成しようとすると、リソースの作成に失敗します。

試しにStandard_V2でApplicatonGatewayを作成しようとすると…

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/10e9e733-a632-9144-1f7d-d29212aecadd.png)|
|:--|

はい、この通り。リソースの作成に失敗します。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626338/c7b90c0e-c5df-032e-50b5-31ce55e5f897.png)|
|:--|

詳細からは、しっかり__作成したAzureポリシーによりブロックされていること__がわかります。

ちなみに、Azureポリシーは__すでに作成済みのリソースに対しては制限を行うことはできません__。
区切りの良いタイミングで設定しましょう。

# 7.終わりに
今回は高額なプランでリソースを作成できないように、Azureポリシーで作成できるリソースのSKUを制限する方法でした。
例はApplicationGatewayでしたが、同じように__仮想マシン等SKUでも設定できますので、大変大きなサイズで間違って仮想マシンを作成してしまった…とかで困ることがなくなります。__

Azureポリシーはこのほかにもいろいろなことに利用することができますので、ぜひご利用を考えてみてください！
それでは！

## 参考

公式テンプレートレポジトリ
[Azure Policy Samples](https://github.com/Azure/azure-policy)
[Allowed Application Gateway SKUs](https://github.com/Azure/azure-policy/tree/master/samples/Network/application-gateway-skus)

コミュニティテンプレートレポジトリ
[Community Policy Repo](https://github.com/Azure/Community-Policy)