Quickstart: Een privé-eindpunt maken met behulp van Terraform
Artikel
In deze quickstart gebruikt u Terraform om een privé-eindpunt te maken. Het privé-eindpunt maakt verbinding met een Azure SQL Database. Het privé-eindpunt is gekoppeld aan een virtueel netwerk en een privé DNS-zone (Domain Name System). De privé-DNS-zone lost het IP-adres van het privé-eindpunt op. Het virtuele netwerk bevat een virtuele machine die u gebruikt om de verbinding van het privé-eindpunt te testen met het exemplaar van de SQL Database.
Het script genereert een willekeurig wachtwoord voor de SQL-server en een willekeurige SSH-sleutel voor de virtuele machine. De namen van de gemaakte resources worden uitgevoerd wanneer het script wordt uitgevoerd.
Terraform maakt de definitie, preview en implementatie van de cloudinfrastructuur mogelijk. Met Behulp van Terraform maakt u configuratiebestanden met behulp van de HCL-syntaxis. Met de HCL-syntaxis kunt u de cloudprovider opgeven, zoals Azure, en de elementen waaruit uw cloudinfrastructuur bestaat. Nadat u uw configuratiebestanden hebt gemaakt, maakt u een uitvoeringsplan waarmee u een voorbeeld van uw infrastructuurwijzigingen kunt bekijken voordat ze worden geïmplementeerd. Zodra u de wijzigingen hebt gecontroleerd, past u het uitvoeringsplan toe om de infrastructuur te implementeren.
Maak een map waarin u de Terraform-voorbeeldcode wilt testen en uitvoeren en deze de huidige map wilt maken.
Maak een bestand met de naam main.tf en voeg de volgende code in:
Terraform
resource"random_pet""prefix" {
prefix = var.resource_group_name_prefix
length = 1
}
# Resource Groupresource"azurerm_resource_group""rg" {
location = var.resource_group_location
name = "${random_pet.prefix.id}-rg"
}
# Virtual Networkresource"azurerm_virtual_network""my_terraform_network" {
name = "${random_pet.prefix.id}-vnet"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
# Subnet 1resource"azurerm_subnet""my_terraform_subnet_1" {
name = "subnet-1"
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.my_terraform_network.name
address_prefixes = ["10.0.0.0/24"]
}
# Public IP address for NAT gatewayresource"azurerm_public_ip""my_public_ip" {
name = "public-ip-nat"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Static"
sku = "Standard"
}
# NAT Gatewayresource"azurerm_nat_gateway""my_nat_gateway" {
name = "nat-gateway"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
# Associate NAT Gateway with Public IPresource"azurerm_nat_gateway_public_ip_association""example" {
nat_gateway_id = azurerm_nat_gateway.my_nat_gateway.id
public_ip_address_id = azurerm_public_ip.my_public_ip.id
}
# Associate NAT Gateway with Subnetresource"azurerm_subnet_nat_gateway_association""example" {
subnet_id = azurerm_subnet.my_terraform_subnet_1.id
nat_gateway_id = azurerm_nat_gateway.my_nat_gateway.id
}
# Create public IP for virtual machineresource"azurerm_public_ip""my_public_ip_vm" {
name = "public-ip-vm"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Static"
sku = "Standard"
}
# Create Network Security Group and ruleresource"azurerm_network_security_group""my_terraform_nsg" {
name = "nsg-1"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
security_rule {
name = "SSH"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
# Create network interfaceresource"azurerm_network_interface""my_terraform_nic" {
name = "nic-1"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "my_nic_configuration"
subnet_id = azurerm_subnet.my_terraform_subnet_1.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.my_public_ip_vm.id
}
}
# Connect the security group to the network interfaceresource"azurerm_network_interface_security_group_association""example" {
network_interface_id = azurerm_network_interface.my_terraform_nic.id
network_security_group_id = azurerm_network_security_group.my_terraform_nsg.id
}
# Generate random text for a unique storage account nameresource"random_id""random_id" {
keepers = {
# Generate a new ID only when a new resource group is defined
resource_group = azurerm_resource_group.rg.name
}
byte_length = 8
}
# Create storage account for boot diagnosticsresource"azurerm_storage_account""my_storage_account" {
name = "diag${random_id.random_id.hex}"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
account_tier = "Standard"
account_replication_type = "LRS"
}
# Create virtual machineresource"azurerm_linux_virtual_machine""my_terraform_vm" {
name = "vm-1"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
network_interface_ids = [azurerm_network_interface.my_terraform_nic.id]
size = "Standard_DS1_v2"
os_disk {
name = "myOsDisk"
caching = "ReadWrite"
storage_account_type = "Premium_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
computer_name = "hostname"
admin_username = var.username
admin_ssh_key {
username = var.username
public_key = azapi_resource_action.ssh_public_key_gen.output.publicKey
}
boot_diagnostics {
storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint
}
}
# Create SQL server nameresource"random_pet""azurerm_mssql_server_name" {
prefix = "sql"
}
# Random password for SQL serverresource"random_password""admin_password" {
count = var.admin_password == null ? 1 : 0
length = 20
special = true
min_numeric = 1
min_upper = 1
min_lower = 1
min_special = 1
}
locals {
admin_password = try(random_password.admin_password[0].result, var.admin_password)
}
# Create SQL serverresource"azurerm_mssql_server""server" {
name = random_pet.azurerm_mssql_server_name.id
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
administrator_login = var.admin_username
administrator_login_password = local.admin_password
version = "12.0"
}
# Create SQL databaseresource"azurerm_mssql_database""db" {
name = var.sql_db_name
server_id = azurerm_mssql_server.server.id
}
# Create private endpoint for SQL serverresource"azurerm_private_endpoint""my_terraform_endpoint" {
name = "private-endpoint-sql"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
subnet_id = azurerm_subnet.my_terraform_subnet_1.id
private_service_connection {
name = "private-serviceconnection"
private_connection_resource_id = azurerm_mssql_server.server.id
subresource_names = ["sqlServer"]
is_manual_connection = false
}
private_dns_zone_group {
name = "dns-zone-group"
private_dns_zone_ids = [azurerm_private_dns_zone.my_terraform_dns_zone.id]
}
}
# Create private DNS zoneresource"azurerm_private_dns_zone""my_terraform_dns_zone" {
name = "privatelink.database.windows.net"
resource_group_name = azurerm_resource_group.rg.name
}
# Create virtual network linkresource"azurerm_private_dns_zone_virtual_network_link""my_terraform_vnet_link" {
name = "vnet-link"
resource_group_name = azurerm_resource_group.rg.name
private_dns_zone_name = azurerm_private_dns_zone.my_terraform_dns_zone.name
virtual_network_id = azurerm_virtual_network.my_terraform_network.id
}
Maak een bestand met de naam outputs.tf en voeg de volgende code in:
Terraform
output"resource_group_name" {
description = "The name of the created resource group."
value = azurerm_resource_group.rg.name
}
output"virtual_network_name" {
description = "The name of the created virtual network."
value = azurerm_virtual_network.my_terraform_network.name
}
output"subnet_name_1" {
description = "The name of the created subnet 1."
value = azurerm_subnet.my_terraform_subnet_1.name
}
output"nat_gateway_name" {
description = "The name of the created NAT gateway."
value = azurerm_nat_gateway.my_nat_gateway.name
}
output"sql_server_name" {
value = azurerm_mssql_server.server.name
}
output"admin_password" {
sensitive = true
value = local.admin_password
}
Maak een bestand met de naam provider.tf en voeg de volgende code in:
Terraform
terraform {
required_providers {
azapi = {
source = "azure/azapi"
version = "~>1.5"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
random = {
source = "hashicorp/random"
version = "~>3.0"
}
}
}
provider"azurerm" {
features {
resource_group {
prevent_deletion_if_contains_resources = false
}
}
}
Maak een bestand met de naam ssh.tf en voeg de volgende code in:
Maak een bestand met de naam variables.tf en voeg de volgende code in:
Terraform
variable"resource_group_location" {
type = string
default = "eastus"
description = "Location of the resource group."
}
variable"resource_group_name_prefix" {
type = string
default = "rg"
description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
}
variable"username" {
type = string
description = "The username for the local account that will be created on the new VM."
default = "azureuser"
}
variable"sql_db_name" {
type = string
description = "The name of the SQL Database."
default = "SampleDB"
}
variable"admin_username" {
type = string
description = "The administrator username of the SQL logical server."
default = "azureadmin"
}
variable"admin_password" {
type = string
description = "The administrator password of the SQL logical server."
sensitive = true
default = null
}
Terraform initialiseren
Voer terraform init uit om de Terraform-implementatie te initialiseren. Met deze opdracht wordt de Azure-provider gedownload die is vereist voor het beheren van uw Azure-resources.
Console
terraform init -upgrade
Belangrijkste punten:
Met -upgrade de parameter worden de benodigde providerinvoegtoepassingen bijgewerkt naar de nieuwste versie die voldoet aan de versiebeperkingen van de configuratie.
Een Terraform-uitvoeringsplan maken
Voer terraform-plan uit om een uitvoeringsplan te maken.
Console
terraform plan -out main.tfplan
Belangrijkste punten:
De terraform plan opdracht maakt een uitvoeringsplan, maar voert het niet uit. In plaats daarvan wordt bepaald welke acties nodig zijn om de configuratie te maken die is opgegeven in uw configuratiebestanden. Met dit patroon kunt u controleren of het uitvoeringsplan aan uw verwachtingen voldoet voordat u wijzigingen aanbrengt in de werkelijke resources.
Met de optionele -out parameter kunt u een uitvoerbestand voor het plan opgeven. Door de -out parameter te gebruiken, zorgt u ervoor dat het plan dat u hebt gecontroleerd precies wordt toegepast.
Een Terraform-uitvoeringsplan toepassen
Terraform uitvoeren is van toepassing om het uitvoeringsplan toe te passen op uw cloudinfrastructuur.
Console
terraform apply main.tfplan
Belangrijkste punten:
Bij de voorbeeldopdracht terraform apply wordt ervan uitgegaan dat u eerder hebt uitgevoerd terraform plan -out main.tfplan.
Als u een andere bestandsnaam voor de -out parameter hebt opgegeven, gebruikt u diezelfde bestandsnaam in de aanroep naar terraform apply.
Als u de parameter niet hebt gebruikt, roept terraform apply u deze -out aan zonder parameters.
De terraform plan opdracht maakt een uitvoeringsplan, maar voert het niet uit. In plaats daarvan wordt bepaald welke acties nodig zijn om de configuratie te maken die is opgegeven in uw configuratiebestanden. Met dit patroon kunt u controleren of het uitvoeringsplan aan uw verwachtingen voldoet voordat u wijzigingen aanbrengt in de werkelijke resources.
Met de optionele -out parameter kunt u een uitvoerbestand voor het plan opgeven. Door de -out parameter te gebruiken, zorgt u ervoor dat het plan dat u hebt gecontroleerd precies wordt toegepast.
Terraform uitvoeren is van toepassing om het uitvoeringsplan toe te passen.
Beheer een SQL Server-databaseinfrastructuur voor cloud-, on-premises en hybride relationele databases met behulp van de relationele Microsoft PaaS-databaseaanbiedingen.