Azure Administrator(AZ-104)：Azure管理者向けの前提条件「モジュールと出力(Bicep)」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「モジュールと出力(Bicep)」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure 管理者向けの前提条件](https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/)
◇まとめとリソース
[Azure Resource Manager テンプレートを使用してリソースを構成する](https://learn.microsoft.com/ja-jp/training/modules/configure-resources-arm-templates/8-summary-resources)
◇対応するモジュール
[モジュールを使用して関連リソースをグループ化する](https://learn.microsoft.com/ja-jp/training/modules/build-first-bicep-template/7-group-related-resources-modules)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure管理者向けの前提条件「パラメーターと変数を用いた式(Bicep)」](https://qiita.com/fsd-jume/items/c5619673af9540a60a25)

## モジュールと出力(Bicep)
### モジュール
・個別のBicepファイル(モジュール)を作成し、メインのBicepテンプレートから参照可能
⇒コードの可読性の向上や再利用がしやすくなる
・メインテンプレートからモジュールにパラメーター値を渡すことが可能

**◆モジュールのコード例(モジュールに関わる部分以外は省略)**
・app Serviceアプリを作成するモジュールをメインテンプレートから参照したい場合
```:main.bicep
param mainlocation string = 'westus3’

module myModule 'modules/mymodule.bicep' = {
  name: 'MyModule'
  params: {
    location1: mainlocation
  }
}
```
**※コードの意味**
**・module**
別のBicepファイルをモジュールとして使用することをBicepに指示
　-myModule：モジュールのシンボリック名(他の部分で使用するときに参照可能)
　-modules/mymodule.bicep：モジュールファイルへのパス
　　今回の場合は「modules」フォルダの「mymodule.bicep」をモジュールとして使用
**・name**
モジュールごとのデプロイ内容を管理するための名前
**・params**
モジュール内のパラメーターをメインテンプレートで指定
今回の場合はモジュール内の「location1」パラメーターを「westus3」として指定
```:modules/mymodule.bicep
param location1 string

resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = {
  name: appServiceAppName
  location: location1
　~省略~
}
```
**※コードの意味**
**・param**
メインテンプレートから必要なパラメーターを受け取るために定義
**・location: location1**
メインテンプレートで指定した値が使用される
今回の場合は「appServiceAppName」のリージョンが「westus3」になる

**◆モジュール設計の重要な原則**
**・明確な目的**
　-用途や関連するリソースごとにモジュールで分けて定義可能
　　例)アプリケーションの監視で使用するすべてのリソースを含むモジュール
　　例)ネットワークに関連するリソースをすべて含むモジュール

**・すべてのリソースを独自のモジュールに配置しない**
　-リソースごとに個別のモジュールを作成しない

**・意味のある明確なパラメーターと出力が必要**
　-パラメータと出力はメインテンプレートとモジュールでやり取りや処理が必要かどうかの検討が必要

**・可能な限り自己完結型とする**
　-モジュール内で完結する変数はメインテンプレートで定義せずモジュール内で定義する

**・シークレットを出力しない**
　-接続文字列やキーなどのシークレット値をモジュールから出力させない

### 出力
・デプロイされたリソースから値を返す必要がある場合に使用
　例)仮想マシンをデプロイ後SSH接続のためのパブリックIPアドレスを取得したい場合
　例)あるモジュールでデプロイしたリソースの情報をメインテンプレートのパラメーターにしたい場合
・出力には固定値ではなくプロパティを指定することを推奨

**◆出力のコード例**
・デプロイした仮想マシンにおけるパブリックIPアドレスのFQDNを取得したい場合
```:Bicep
output ipFqdn string = publicIPAddress.properties.dnsSettings.fqdn
```
※コードの意味
**・output `出力名` `データ型` = `出力値`**
出力を定義していることをBicepに指示
　-publicIPAddress：仮想マシンにおけるパブリックIPアドレスリソースのシンボリック名
　-publicIPAddress.properties.dnsSettings.fqdn：「publicIPAddress」の「dnsSettings」プロパティから「fqdn」を取得

### モジュールからの出力
・モジュールでデプロイしたリソースの情報をメインテンプレートに渡すことが可能

**◆モジュールから値を出力するコード例(関係のないコードは省略)**
・モジュールで作成したapp Serviceアプリのホスト名(URL)をメインテンプレートから出力したい場合
```:modules/appService.bicep
resource appServiceApp 'Microsoft.Web/sites@2021-03-01' = {
 ~省略~
}

output appServiceAppHostName string = appServiceApp.properties.defaultHostName
```
**※コードの意味**
**・appServiceApp.properties.defaultHostName**
「appServiceApp」リソースの「defaultHostName」プロパティを取得
　-defaultHostName：アプリのデフォルトのホスト名(URL)

```:main.bicep
module appService 'modules/appService.bicep' = {
 ~省略~
}

output OutputHostName string = appService.outputs.appServiceAppHostName
```
**※コードの意味**
**・appService.<font color="red">**outputs**</font>.appServiceAppHostName**
「appService」モジュールから出力名「appServiceAppHostName」の出力値を取得

## 次の学習内容
**◆PowerShellのコマンドレットとモジュール**

https://qiita.com/fsd-jume/items/216905c46c547f49b979

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3