BrownField/Storage/AVS-to-ANFdatastore-NewVNet/Terraform/main.tf (203 lines of code) (raw):
terraform {
required_version = "~> 1.6"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.105"
}
azapi = {
source = "Azure/azapi"
version = "~> 1.13, != 1.13.0"
}
}
}
provider "azurerm" {
features {}
alias = "AVS-to-ANFdatastore-NewVnet"
partner_id = "938cd838-e22a-47da-8a6f-bdda923e3edb"
skip_provider_registration = "true"
}
provider "azapi" {
skip_provider_registration = "true"
enable_hcl_output_for_data_source = true
}
resource "azurerm_resource_group" "deploymentRG" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.DeploymentResourceGroupName
location = var.Location
}
resource "azurerm_virtual_network" "vnetGatewayVnet" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.VNetName
location = azurerm_resource_group.deploymentRG.location
resource_group_name = azurerm_resource_group.deploymentRG.name
address_space = var.VNetAddressSpaceCIDR
}
resource "azurerm_subnet" "gatewaySubnet" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = "GatewaySubnet"
resource_group_name = azurerm_resource_group.deploymentRG.name
virtual_network_name = azurerm_virtual_network.vnetGatewayVnet.name
address_prefixes = var.VNetGatewaySubnetCIDR
}
resource "azurerm_subnet" "ANFDelegatedSubnet" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = "ANFDelegatedSubnet"
resource_group_name = azurerm_resource_group.deploymentRG.name
virtual_network_name = azurerm_virtual_network.vnetGatewayVnet.name
address_prefixes = var.VNetANFDelegatedSubnetCIDR
delegation {
name = "microsoftnetapp"
service_delegation {
name = "Microsoft.Netapp/volumes"
}
}
}
resource "azurerm_public_ip" "gatewayIP" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = "${var.GatewayName}-PIP"
resource_group_name = azurerm_resource_group.deploymentRG.name
location = azurerm_resource_group.deploymentRG.location
allocation_method = "Static"
sku = "Standard"
sku_tier = "Regional"
zones = ["1","2","3"]
}
resource "azurerm_virtual_network_gateway" "ERGateway" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.GatewayName
location = azurerm_resource_group.deploymentRG.location
resource_group_name = azurerm_resource_group.deploymentRG.name
type = "ExpressRoute"
sku = var.GatewaySku
ip_configuration {
name = "vnetGatewayConfig"
public_ip_address_id = azurerm_public_ip.gatewayIP.id
private_ip_address_allocation = "Dynamic"
subnet_id = azurerm_subnet.gatewaySubnet.id
}
}
#assumes the same subscription (need to reference different provider blocks if a separate sub is required.
data "azurerm_vmware_private_cloud" "existing" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.PrivateCloudName
resource_group_name = var.PrivateCloudResourceGroup
}
#check this is the proper way to name the authorization
resource "azurerm_vmware_express_route_authorization" "thisVnet" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = azurerm_virtual_network.vnetGatewayVnet.name
private_cloud_id = data.azurerm_vmware_private_cloud.existing.id
}
resource "azurerm_virtual_network_gateway_connection" "expressRoute" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.PrivateCloudName
location = azurerm_resource_group.deploymentRG.location
resource_group_name = azurerm_resource_group.deploymentRG.name
type = "ExpressRoute"
virtual_network_gateway_id = azurerm_virtual_network_gateway.ERGateway.id
express_route_circuit_id = data.azurerm_vmware_private_cloud.existing.circuit[0].express_route_id
authorization_key = azurerm_vmware_express_route_authorization.thisVnet.express_route_authorization_key
routing_weight = 0
express_route_gateway_bypass = true
}
resource "azurerm_netapp_account" "avs_anf_account" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.netappAccountName
location = azurerm_resource_group.deploymentRG.location
resource_group_name = azurerm_resource_group.deploymentRG.name
}
resource "azurerm_netapp_pool" "avs_anf_pool" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.netappCapacityPoolName
location = azurerm_resource_group.deploymentRG.location
resource_group_name = azurerm_resource_group.deploymentRG.name
account_name = azurerm_netapp_account.avs_anf_account.name
service_level = var.netappCapacityPoolServiceLevel
size_in_tb = var.netappCapacityPoolSize
}
resource "azurerm_netapp_volume" "anf_volume" {
name = var.netappVolumeName
location = azurerm_resource_group.deploymentRG.location
resource_group_name = azurerm_resource_group.deploymentRG.name
account_name = azurerm_netapp_account.avs_anf_account.name
pool_name = azurerm_netapp_pool.avs_anf_pool.name
volume_path = var.netappVolumeName
service_level = "Standard"
subnet_id = azurerm_subnet.ANFDelegatedSubnet.id
protocols = ["NFSv3"]
security_style = "unix"
storage_quota_in_gb = var.netappVolumeSize
snapshot_directory_visible = true
zone = var.anf_zone_number
azure_vmware_data_store_enabled = true
export_policy_rule {
rule_index = 1
allowed_clients = ["0.0.0.0/0"]
protocols_enabled = ["NFSv3"]
root_access_enabled = true
unix_read_only = false
unix_read_write = true
}
lifecycle {
ignore_changes = [zone]
}
}
/*
resource "azapi_resource" "avs_anf_volume_avsdatastoreenabled" {
depends_on = [
azurerm_netapp_pool.avs_anf_pool
]
type = "Microsoft.NetApp/netAppAccounts/capacityPools/volumes@2022-05-01"
name = var.netappVolumeName
parent_id = azurerm_netapp_pool.avs_anf_pool.id
body = jsonencode({
location = azurerm_resource_group.deploymentRG.location
properties = {
creationToken = var.netappVolumeName,
serviceLevel = var.netappCapacityPoolServiceLevel,
subnetId = azurerm_subnet.ANFDelegatedSubnet.id,
usageThreshold = var.netappVolumeSize,
protocolTypes = ["NFSv3"],
networkFeatures = "Standard",
avsDataStore = "Enabled"
exportPolicy = {
rules = [
{
ruleIndex = 1,
allowedClients = "0.0.0.0/0",
unixReadOnly = false,
hasRootAccess = true,
nfsv3 = true
}
]
}
}
})
}
*/
data "azurerm_vmware_private_cloud" "avs_privatecloud" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.PrivateCloudName
resource_group_name = var.PrivateCloudResourceGroup
}
data "azurerm_netapp_volume" "anf_datastorevolume" {
provider = azurerm.AVS-to-ANFdatastore-NewVnet
name = var.netappVolumeName
account_name = var.netappAccountName
pool_name = var.netappCapacityPoolName
resource_group_name = azurerm_resource_group.deploymentRG.name
}
resource "azapi_resource" "avs_datastore_attach_anfvolume" {
type = "Microsoft.AVS/privateClouds/clusters/datastores@2021-12-01"
depends_on = [
azurerm_virtual_network_gateway_connection.expressRoute
]
name = var.netappVolumeName
parent_id = "${data.azurerm_vmware_private_cloud.avs_privatecloud.id}/clusters/Cluster-1"
body = {
properties = {
netAppVolume = {
id = azurerm_netapp_volume.anf_volume.id
}
}
}
}