アプリ開発者も検証時に IaC でお金を節約したい!

1.2K Views

May 30, 23

スライド概要

Blazor, ASP.NET Core, REST API, Orleans などの検証を行う時にはローカルの Web サーバーだけでは検証しきれないことも多く、 Azure へデプロイして色々試してみたくなりますが、無料でできないことも多いので、結構お金がかかってしまうのが痛いところです。

費用を最小限にするには、検証直前にリソースを作成して、検証終了後すぐ削除するのが望ましいですが、これは、ClickOps では大変なので、IaC を使いたくなります。

といわけで、今回はアプリを Azure にデプロイして検証するという観点で IaC を使ってみた時の知見をご紹介します。

profile-image

SIerの人。Xamarin.iOS が好き。Azure と戯れるのが仕事。Visual Studio for Mac が Win版と同等になる日を切望。Microsoft MVP Developer Technologies 2017-

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

アプリ開発者も検証時に IaC でお金を節約したい! Tomohiro Suzuki @hiro128_777 2023-5-31 C# Tokyo

2.

自己紹介 鈴木友宏 M365、Azure、Power Platform、.NET などの Microsoft 製品を用いたシステムの構築をしています。 Twitter:@hiro128_777 blog:https://hiro128.hatenablog.jp/ 2

3.

.NET アプリの検証をしてると Azure へデプロイしたくなる Blazor, ASP.NET Core, REST API, Orleans などの検証を行う時にはローカルの Web サーバー だけでは検証しきれないことも多く、 Azure へデプロイして色々試してみたくなりますが、無料で できないことも多いので、結構お金がかかってしまうのが痛いところです。 • App Service の自動的なインスタンスの入れ替え時の検証 • プライベートエンドポイントの利用の検証 etc… 費用を最小限にするには、検証直前にリソースを作成して、検証終了後すぐ削除するのが望ま しいですが、これは、ClickOps では大変なので、IaC を使いたくなります。 といわけで、今回はアプリを Azure にデプロイして検証するという観点で IaC を使ってみた時の 知見をご紹介します。 3

4.

本日お話しすること ① どのくらいお金が節約できるの? ② どのツールを使えばいいの? ③ いきなり IaC で書けばいいの? ④ ハマりポイントはどこ? 4

5.

本日のゴール ① 検証時に IaC を使うメリットを知る ② 実際に試すときにハマらないようにハマりポイントを知る 5

6.

どのくらいお金が節約できるの? 6

7.

リソース維持だけで課金されるものもあり、結構なお金が… 右の Orleans の検 証構成で、1ヶ月リ ソース維持すると おおよそ 20,000/月 なかなか辛い😭 VNet 10.0.0.0/16 Subnet(受信) 10.0.30.0/24 Subnet(送信) 10.0.21.0/24 Subnet(送信) 10.0.1.0/24 永続化ストレージ Table Storage Subnet(受信) 10.0.10.0/24 サイロ01 App Service www フロントエンド App Service サイロ02 App Service Subnet(送信) 10.0.22.0/24 7

8.

IaC で検証後すぐ消せば、実質使った分だけの課金に! 20,705 – 4,770 = 15,935円/月節約できた 8

9.

どのツールを使えばいいの? 9

10.

検証環境作成用途観点での Azure の IaC 製品の比較 開発元 有料 / 無料 可読性 記述の 容易性 Azure の 新機能への対応 HashiCorp 検証環境作成なら 無料版で充分 ○ ○ 即日対応とは限らない ARM テンプレート Microsoft 完全無料 △ X 超ダルい 即日対応 Bicep 完全無料 ○ ○ 即日対応 製品 Terraform Microsoft おすすめ!! 10

11.

Bicep は Visual Studio Code の拡張機能もあります ① インテリセンス ② 各種警告、エラー 11

12.

いきなり IaC で書けばいいの? 12

13.

Bicep を使った Azure リソースの IaC 化の手順の一例 Azure Portal 1 ClickOps で作成 ClickOps Azure リソース作成 アプリ デプロイ 動作確認 Azure Cloud Shell 2 Bicep 化する ARMテンプレート デコンパイル ローカル 不完全な Bicep ファイル 不完全な Bicep ファイル ローカルにDL 不要部分 削除・修正 完璧な Bicep ファイル Azure Cloud Shell 3 デプロイと動作確認 完璧な Bicep ファイル Azure リソース プロビジョニング アプリ デプロイ 動作確認 13

14.

ハマりポイントはどこ? 14

15.
[beta]
2-1. エクスポート→不完全な Bicep 生成まで
ARM テンプレートをエクスポート
az group export --name <作成済みのリソースグループ名> > <ファイル名>.json
PS /home/yourname> az group export --name OrleansHelloWorld > OrleansHelloWorldArm.json
WARNING: Export template operation completed with errors. Some resources were not exported. Please see details for more information.
ERROR: Could not get resources of the type 'Microsoft.Web/sites/hybridconnection'. Resources of this type will not be exported.
「エクスポートできないリソースがある」という警告なので無視してOK

ARM テンプレートを Bicep にデコンパイル
az bicep decompile --file <ARM テンプレートファイル名>.json

PS /home/yourname> az bicep decompile --file OrleansHelloWorldArm.json
/home/yourname/OrleansHelloWorldArm.bicep(22,5) : Warning BCP073: The property "maxNumberOfRecordSets" is read-only. Expressions
cannot be assigned to read-only properties. If this is an inaccuracy in the documentation, please report it to the Bicep Team.
[https://aka.ms/bicep-type-issues]
WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON to Bicep.
You may need to fix warnings and errors in the generated bicep file(s), or decompilation may fail entirely if an accurate conversion is not possible.
If you would like to report any issues or inaccurate conversions, please see https://github.com/Azure/bicep/issues.
/home/yourname/OrleansHelloWorldArm.bicep(46,62) : Warning BCP081: Resource type "Microsoft.Network/virtualNetworks@2022-11-01" does
not have types available.
色々警告出るが基本的に無視してOK

ARM テンプレートを単純にデコンパイルした不完全な Bicep が出来上がる
-rw-r--r-- 1 yourname yourname 44383 May 28 05:28 OrleansHelloWorldArm.bicep

15

16.

2-2. 依存関係に対応したリソース作成順序の調整 デコンパイルではリソース作成の順番は意識されないの でリソースの依存関係に対応したリソース作成順序の調 整が必要 例① VNet のサブネット内に App Service やストレージアカウ ントを作成したい場合は作成時にサブネットのIDが必 要になるため、まず VNet から作成し、確定したサブネッ トのIDをサブネットに配置するリソースのパラメーターとして 渡して作成されるように記述する main.bicep storage.bicep ファイル先頭 VNet 作成 storage モジュール呼び出し ストレージアカウント 作成 サブネットID サブネットID App Service モジュール呼び出し サブネットID 例② VNet のサブネット内の App Service やストレージアカウ ントのパブリックアクセスを遮断したい場合はプライベート エンドポイントを作成するが、プライベートエンドポイントの 作成時に関連付けるリソースのIDが必要になるため、リ ソース作成後に確定したIDをプライベートエンドポイントに パラメーターとして渡して作成されるように記述する app-services.bicep App service 作成 サブネットID App Service 作成完了 リソースID リソースID リソースID ストレージアカウント 作成完了 リソースID プライベートエンドポイ ント作成 ファイル末尾 16

17.

2-2-1. 例①のコード storage.bicep main.bicep app-services.bicep 17

18.

2-2-2. 例②のコード main.bicep storage.bicep app-services.bicep 18

19.

2-3. 暗黙的に作成されるリソースと設定されるパラメーター デコンパイルされた Bicep には明示的にリソース定義やパラメーターが記述されているが、Bicep を用いたデプロイ時 には Bicep のパタメーターに明示的な記述がなくても、関連するパラメータをトリガーに Azure インフラストラクチャサー ビス側で処理が発生し、暗黙的に作成されるリソースや、暗黙的に設定されるパラメーターがあるので、そのようなリ ソースの定義やパラメーターの設定は省く必要がある。ポータル上の ClickOps で明示的に作成不要なリソースは基 本的に Bicep でも作成不要だが、リファレンスにも詳しい記述がないので、 trial and error で想定通りのリソースが 作成されるよう追い込む ARM テンプレートをデコンパイルした bicep プライベートエンドポイントのネットワークイン ターフェースのリソース定義が明示的に存在 する 手修正した main.bicep 修正した bicep にはプライベートエンドポイ ントのネットワークインターフェースのリソース の定義は存在しないが、プライベートエンド ポイントの定義、プライベートDNSゾーンの 定義から、 暗黙的に作成・設定される。 (ポータル上の ClickOps でもネットワーク インターフェースは明示的に作成しない) 19

20.

2-4. 完成した Bicep は GitHub にあります 完成したBicep は GitHub にありますので、気になる方はご覧ください。 ご自身の Azure サブスクリプションにデプロイもできます。 (デプロイする場合、700円/24H くらい課金されるのでご注意を) (1時間で消せば、30円くらいです) https://github.com/TomohiroSuzuki128/OrleansHelloWorld/tree/main/IaC 20

21.
[beta]
3. リソースのプロビジョニング
リソースグループ作成
az group create -l <リージョン名> -n <リソースグループ名>
PS /home/yourname> az group create -l japaneast -n OrleansHelloWorld

Bicep をデプロイ
az deployment group create --resource-group <作成済みのリソースグループ名> --template-file ./main.bicep --parameters appName=<アプリ名>

PS /home/yourname> az deployment group create --resource-group OrleansHelloWorld --template-file ./main.bicep --parameters
appName=OrleansMyApp777
省略
"provisioningState": "Succeeded",
JSONが出力され、 “provisioningState”: “Succeeded” が表示されればデプロイ成功
"templateHash": "8562477215454227443",
"templateLink": null,
"timestamp": "2023-05-30T11:00:35.199308+00:00",
"validatedResources": null
},
"resourceGroup": "OrleansHelloWorld",
"tags": null,
"type": "Microsoft.Resources/deployments"
}
PS /home/yourname>

21

22.

終わりに ここまでの手順に慣れてしまえば、あとは、GitHub Actions のワークフローを作成 すれば、CI/CD の構築もすぐできます。 アプリ開発者でも Bicep を書くのに慣れると Azure を使うのがより楽しくなるの で、おすすめです! 22

23.

ご清聴ありがとうございました