1. はじめに
1-1 ご挨拶
初めまして、井村と申します。
今更ですが Azure リソースをデプロイするドメイン固有言語 (DSL) であるBicepが使いやすいそうです。プライベートエンドポイントはよく利用するAzureサービスなので今回デプロイしてみました。備忘録として記事にします。
1-2 対象読者
- Azureに興味がある
- Bicepに興味がある
1-3 成果物
プライベートエンドポイントをデプロイすると自動的にNICが生成されます。今回はストレージアカウント用のプライベートエンドポイント、ストレージアカウント、プライベートDNSゾーンをデプロイします。

図1 システム構成
※事前にAzureアカウントは作成済みです。Azure CLI、Bicepはインストール済みです。
2. テンプレートの構成について
今回利用するBicepテンプレートは以下になります。
main.bicep
// ---- 変数宣言 ----
@description('システムコード')
param systemCode string = 'hawk'
@description('リージョンはリソースグループと同様')
param location string = resourceGroup().location
@description('仮想ネットワーク名')
param virtualNetworkName string = 'vnet-${systemCode}'
@description('サブネット名')
param snetName string = 'snet-${systemCode}-private-endpoint'
@description('仮想ネットワーク用のプレフィックス')
param addressPrefix string = '10.0.0.0/16'
@description('サブネット用のプレフィックス')
param subnetPrefix string = '10.0.0.0/24'
@description('ストレージアカウント名')
param storageAccountsName string = 'st${systemCode}${uniqueString(resourceGroup().id)}'
@description('プライベートエンドポイント名')
param privateEndpointName string = 'private-endpoint-${storageAccountsName}'
@description('プライベートDNSゾーン名')
param privateDnsZonesName string = 'pdnsz-privatelink.${environment().suffixes.storage}'
@description('仮想ネットワークリンク名')
param virtualNetworkLinkName string = '${privateDnsZonesName}-${virtualNetworkName}'
// ---- 仮想ネットワーク作成 ----
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2020-11-01' = {
name: virtualNetworkName
location: location
properties: {
addressSpace: {
addressPrefixes: [
addressPrefix
]
}
subnets: [
{
name: snetName
properties: {
addressPrefix: subnetPrefix
}
}
]
}
resource subnet1 'subnets' existing = {
name: snetName
}
}
// ---- プライベートDNSゾーン作成 ----
resource privateDnsZones 'Microsoft.Network/privateDnsZones@2018-09-01' = {
name: privateDnsZonesName
location: 'global'
resource storageAccountsRecord 'A' = {
name: storageAccountsName
properties: {
ttl: 3600
aRecords: [
{
ipv4Address: first(first(privateEndpoint.properties.customDnsConfigs).ipAddresses)
}
]
}
}
resource link 'virtualNetworkLinks' = {
name: virtualNetworkLinkName
location: 'global'
properties: {
registrationEnabled: false
virtualNetwork: {
id: virtualNetwork.id
}
}
}
}
// ---- ストレージアカウント作成 ----
resource storageAccounts 'Microsoft.Storage/storageAccounts@2022-05-01' = {
name: storageAccountsName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
}
resource spc 'privateEndpointConnections' = {
name: storageAccountsName
properties: {
privateEndpoint: {}
privateLinkServiceConnectionState: {
status: 'Approved'
}
}
}
}
// ---- プライベートエンドポイント作成 ----
resource privateEndpoint 'Microsoft.Network/privateEndpoints@2020-11-01' = {
name: privateEndpointName
location: location
properties: {
privateLinkServiceConnections: [
{
name: privateEndpointName
properties: {
privateLinkServiceId: storageAccounts.id
groupIds: [
'blob'
]
}
}
]
subnet: {
id: virtualNetwork::subnet1.id
}
}
}
3. 構築
それでは、構築始めます。リソースグループはAzure CLIで作成します。
3-1 リソースグループの作成
# Azureへログイン
az login
# 変数宣言
systemCode=hawk
myResourceGroup="rg-$systemCode"
location=japaneast
# リソースグループの作成
az group create -l $location -n $myResourceGroup
3-2 各Azureサービスの作成
項番2で記述したBicepテンプレートを利用して各Azureサービスをデプロイします。
# Azureへログイン
az login
# 変数宣言
systemCode=hawk
myResourceGroup="rg-$systemCode"
location=japaneast
# Azureサービスの作成
az deployment group create --resource-group $myResourceGroup --template-file main.bicep
4. 設定確認
デプロイされた各Azureサービスにて私が今まで気にしてなかったり、勉強になった部分を紹介いたします。
4-1 プライベートDNSゾーン
4-1-1 レコード
Aレコードの名前を変数storageAccountsNameで定義、IPアドレスをプライベートエンドポイントから取得しています。

resource storageAccountsRecord 'A' = {
name: storageAccountsName
properties: {
ttl: 3600
aRecords: [
{
ipv4Address: first(first(privateEndpoint.properties.customDnsConfigs).ipAddresses)
}
]
}
4-1-2 仮想ネットワークリンク
このような設定がありましたね。勉強不足でございました。
以下リンクの抜粋になります。
「zure でプライベート DNS ゾーンを作成したら、仮想ネットワークをそれにリンクする必要があります。 リンクされると、その仮想ネットワークでホストされている VM はプライベート DNS ゾーンにアクセスできるようになります。」
仮想ネットワーク リンクとは

resource link 'virtualNetworkLinks' = {
name: virtualNetworkLinkName
location: 'global'
properties: {
registrationEnabled: false
virtualNetwork: {
id: virtualNetwork.id
}
}
}
4-2 ストレージアカウント
4-2-1 エンドポイントコネクション(接続)
こちらも必須でしたので設定しました。

resource spc 'privateEndpointConnections' = {
name: storageAccountsName
properties: {
privateEndpoint: {}
privateLinkServiceConnectionState: {
status: 'Approved'
}
}
}
5. 動作確認
Azureポータルから手動で仮想マシンを作成しました。その仮想マシンにログインし、ドメイン名からIPアドレスを確認しました。
結果、プライベートIPアドレスを取得することができました。
6. デプロイ時のエラー
今回Bicepテンプレートを用いてデプロイすると以下のエラーメッセージが表示されます。
操作の詳細は以下になります。
プロビジョニングステータスが「Failed」となっています。
色々と調べてみましたが、これといった記事がみつかりませんでした。
リソースのメタデータプロパティでリソース自体の機能には問題ないらしい。。たしかにプロビジョニング操作は「Create」で動作確認にも影響はありませんでした。情報を求む。
7. おわりに
本記事を最後まで読んで頂きましてありがとうございます。
デプロイエラーが発生し、結論を出すまでの過程において様々な情報を読み漁りました。
日々勉強だなと思いました。
8. 参考記事
- 仮想ネットワーク リンクとは
- Microsoft.Storage storageAccounts/privateEndpointConnections
- Bicep での子リソースの名前と種類の設定
- Bicep を使って仮想ネットワーク リソースを作成する
- Microsoft.Network privateDnsZones/A
- azure-quickstart-templates/quickstarts/microsoft.web/private-webapp-with-app-gateway-and-apim/main.bicep
- よくある Azure デプロイ エラーのトラブルシューティングに関する記事
- Azure プライベート エンドポイントの接続に関する問題のトラブルシューティング