Schnellstart: Erstellen eines privaten Endpunkts mit Terraform
Artikel
In diesem Schnellstart verwenden Sie Terraform zum Erstellen eines privaten Endpunkts. Der private Endpunkt ist mit einer Azure SQL-Datenbank verbunden. Der private Endpunkt ist einer VM und einer privaten DNS-Zone (Domain Name System) zugeordnet. Die private DNS-Zone löst die IP-Adresse des privaten Endpunkts auf. Das virtuelle Netzwerk enthält eine VM, mit der Sie die Verbindung des privaten Endpunkts zur Instanz der SQL-Datenbank testen.
Das Skript generiert ein zufälliges Kennwort für den SQL-Server und einen zufälligen SSH-Schlüssel für die VM. Die Namen der erstellten Ressourcen werden angezeigt, wenn das Skript ausgeführt wird.
Mit Terraform können Sie eine Cloudinfrastruktur definieren, eine Vorschau der Cloudinfrastruktur anzeigen und die Cloudinfrastruktur bereitstellen. Terraform ermöglicht das Erstellen von Konfigurationsdateien mit HCL-Syntax. Mit der HCL-Syntax können Sie den Cloudanbieter (beispielsweise Azure) und die Elemente angeben, aus denen sich Ihre Cloudinfrastruktur zusammensetzt. Nach der Erstellung Ihrer Konfigurationsdateien erstellen Sie einen Ausführungsplan, mit dem Sie eine Vorschau Ihrer Infrastrukturänderungen anzeigen können, bevor diese bereitgestellt werden. Nach der Überprüfung der Änderungen wenden Sie den Ausführungsplan an, um die Infrastruktur bereitzustellen.
Erstellen Sie ein Verzeichnis, in dem der Terraform-Beispielcode getestet und ausgeführt werden soll, und legen Sie es als aktuelles Verzeichnis fest.
Erstellen Sie eine Datei namens main.tf, und fügen Sie den folgenden Code ein:
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
}
Erstellen Sie eine Datei namens outputs.tf, und fügen Sie den folgenden Code ein:
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
}
Erstellen Sie eine Datei namens provider.tf, und fügen Sie den folgenden Code ein:
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
}
}
}
Erstellen Sie eine Datei namens ssh.tf, und fügen Sie den folgenden Code ein:
Erstellen Sie eine Datei namens variables.tf, und fügen Sie den folgenden Code ein:
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
}
Initialisieren von Terraform
Führen Sie zum Initialisieren der Terraform-Bereitstellung terraform init aus. Mit diesem Befehl wird der Azure-Anbieter heruntergeladen, der zum Verwalten Ihrer Azure-Ressourcen erforderlich ist.
Konsole
terraform init -upgrade
Die wichtigsten Punkte:
Der Parameter -upgrade aktualisiert die erforderlichen Anbieter-Plug-Ins auf die neueste Version, die den Versionseinschränkungen der Konfiguration entspricht.
Erstellen eines Terraform-Ausführungsplans
Führen Sie terraform plan aus, um einen Ausführungsplan zu erstellen.
Konsole
terraform plan -out main.tfplan
Die wichtigsten Punkte:
Durch den Befehl terraform plan wird ein Ausführungsplan erstellt, aber nicht ausgeführt. Stattdessen werden die Aktionen ermittelt, die erforderlich sind, um die in Ihren Konfigurationsdateien angegebene Konfiguration zu erstellen. Mit diesem Muster können Sie überprüfen, ob der Ausführungsplan Ihren Erwartungen entspricht, bevor Sie Änderungen an den eigentlichen Ressourcen vornehmen.
Der optionale Parameter -out ermöglicht die Angabe einer Ausgabedatei für den Plan. Durch die Verwendung des Parameters -out wird sichergestellt, dass genau der von Ihnen überprüfte Plan angewendet wird.
Anwenden eines Terraform-Ausführungsplans
Führen Sie terraform apply aus, um den Ausführungsplan auf Ihre Cloudinfrastruktur anzuwenden.
Konsole
terraform apply main.tfplan
Die wichtigsten Punkte:
Der Beispielbefehl terraform apply setzt voraus, dass Sie zuvor terraform plan -out main.tfplan ausgeführt haben.
Wenn Sie einen anderen Dateinamen für den Parameter -out angegeben haben, verwenden Sie denselben Dateinamen im Aufruf von terraform apply.
Wenn Sie den Parameter -out nicht verwendet haben, rufen Sie terraform apply ohne Parameter auf.
Wenn Sie die über Terraform erstellten Ressourcen nicht mehr benötigen, führen Sie die folgenden Schritte aus:
Führen Sie terraform plan aus, und geben Sie das Flag destroy an.
Konsole
terraform plan -destroy -out main.destroy.tfplan
Die wichtigsten Punkte:
Durch den Befehl terraform plan wird ein Ausführungsplan erstellt, aber nicht ausgeführt. Stattdessen werden die Aktionen ermittelt, die erforderlich sind, um die in Ihren Konfigurationsdateien angegebene Konfiguration zu erstellen. Mit diesem Muster können Sie überprüfen, ob der Ausführungsplan Ihren Erwartungen entspricht, bevor Sie Änderungen an den eigentlichen Ressourcen vornehmen.
Der optionale Parameter -out ermöglicht die Angabe einer Ausgabedatei für den Plan. Durch die Verwendung des Parameters -out wird sichergestellt, dass genau der von Ihnen überprüfte Plan angewendet wird.
Führen Sie zum Anwenden des Ausführungsplans den Befehl terraform apply aus.
Verwalten einer SQL Server-Datenbankinfrastruktur für Cloud-, lokale und hybride relationale Datenbanken auf Grundlage der Microsoft PaaS-Angebote für relationale Datenbanken.
Sie erhalten Informationen zu den Azure RBAC-Berechtigungen, die zum Bereitstellen eines privaten Endpunkts und eines Private Link-Diensts erforderlich sind.