6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Azure】Bicepを用いてストレージアカウントへ接続するプライベートエンドポイントを作成する。

Posted at

1. はじめに

1-1 ご挨拶

初めまして、井村と申します。
今更ですが Azure リソースをデプロイするドメイン固有言語 (DSL) であるBicepが使いやすいそうです。プライベートエンドポイントはよく利用するAzureサービスなので今回デプロイしてみました。備忘録として記事にします。

1-2 対象読者

  • Azureに興味がある
  • Bicepに興味がある

1-3 成果物

プライベートエンドポイントをデプロイすると自動的にNICが生成されます。今回はストレージアカウント用のプライベートエンドポイント、ストレージアカウント、プライベートDNSゾーンをデプロイします。

SystemConfiguration.png

図1 システム構成

※事前にAzureアカウントは作成済みです。Azure CLI、Bicepはインストール済みです。

2. テンプレートの構成について

今回利用するBicepテンプレートは以下になります。

main.bicep
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 リソースグループの作成

bash
# Azureへログイン
az login

# 変数宣言
systemCode=hawk
myResourceGroup="rg-$systemCode"
location=japaneast

# リソースグループの作成
az group create -l $location -n $myResourceGroup

3-2 各Azureサービスの作成

項番2で記述したBicepテンプレートを利用して各Azureサービスをデプロイします。

bash
# 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アドレスをプライベートエンドポイントから取得しています。

1_qiita_dns1.png
bicep
  resource storageAccountsRecord 'A' = {
    name: storageAccountsName
    properties: {
      ttl: 3600
      aRecords: [
        {
          ipv4Address: first(first(privateEndpoint.properties.customDnsConfigs).ipAddresses)
        }
      ]
    }

4-1-2 仮想ネットワークリンク

このような設定がありましたね。勉強不足でございました。
以下リンクの抜粋になります。
「zure でプライベート DNS ゾーンを作成したら、仮想ネットワークをそれにリンクする必要があります。 リンクされると、その仮想ネットワークでホストされている VM はプライベート DNS ゾーンにアクセスできるようになります。」
仮想ネットワーク リンクとは

2_qiita_dns2.png
bicep
  resource link 'virtualNetworkLinks' = {
    name: virtualNetworkLinkName
    location: 'global'
    properties: {
      registrationEnabled: false
      virtualNetwork: {
        id: virtualNetwork.id
      }
    }
  }

4-2 ストレージアカウント

4-2-1 エンドポイントコネクション(接続)

こちらも必須でしたので設定しました。

3_qiita_st1.png
bicep
  resource spc 'privateEndpointConnections' = {
    name: storageAccountsName
    properties: {
      privateEndpoint: {}
      privateLinkServiceConnectionState: {
        status: 'Approved'
      }
    }
  }

5. 動作確認

Azureポータルから手動で仮想マシンを作成しました。その仮想マシンにログインし、ドメイン名からIPアドレスを確認しました。
結果、プライベートIPアドレスを取得することができました。

test.png

6. デプロイ時のエラー

今回Bicepテンプレートを用いてデプロイすると以下のエラーメッセージが表示されます。

4_qiita_error1.png

操作の詳細は以下になります。
プロビジョニングステータスが「Failed」となっています。
色々と調べてみましたが、これといった記事がみつかりませんでした。
リソースのメタデータプロパティでリソース自体の機能には問題ないらしい。。たしかにプロビジョニング操作は「Create」で動作確認にも影響はありませんでした。情報を求む。

5_qiita_error2.png

7. おわりに

本記事を最後まで読んで頂きましてありがとうございます。
デプロイエラーが発生し、結論を出すまでの過程において様々な情報を読み漁りました。
日々勉強だなと思いました。

8. 参考記事

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?