Inicio rápido: Creación de un punto de conexión privado con Terraform
Artikulua
En este inicio rápido, usará Terraform para crear un punto de conexión privado. El punto de conexión privado se conecta a una instancia de Azure SQL Database. El punto de conexión privado está asociado a una red virtual y a una zona del Sistema de nombres de dominio (DNS) privada. La zona DNS privada resuelve la dirección IP del punto de conexión privado. La red virtual contiene una máquina virtual que se usa para probar la conexión del punto de conexión privado a la instancia de SQL Database.
El script genera una contraseña aleatoria para SQL Server y una clave SSH aleatoria para la máquina virtual. Los nombres de los recursos creados se generan al ejecutarse el script.
Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.
Cree un directorio en el que probar y ejecutar el código de ejemplo de Terraform y conviértalo en el directorio actual.
Cree un archivo denominado main.tf e inserte el siguiente código:
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
}
Cree un archivo denominado outputs.tf e inserte el siguiente código:
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
}
Cree un archivo denominado provider.tf e inserte el siguiente código:
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
}
}
}
Cree un archivo denominado ssh.tf e inserte el siguiente código:
Cree un archivo denominado variables.tf e inserte el siguiente código:
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
}
Inicialización de Terraform
Para inicializar la implementación de Terraform, ejecute terraform init. Este comando descarga el proveedor de Azure necesario para administrar los recursos de Azure.
Consola
terraform init -upgrade
Puntos clave:
El parámetro -upgrade actualiza los complementos de proveedor necesarios a la versión más reciente que cumpla con las restricciones de versión de la configuración.
El comando terraform plan crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales.
El parámetro -out opcional permite especificar un archivo de salida para el plan. El uso del parámetro -out garantiza que el plan que ha revisado es exactamente lo que se aplica.
Aplicación de un plan de ejecución de Terraform
Ejecute terraform apply para aplicar el plan de ejecución a su infraestructura en la nube.
Consola
terraform apply main.tfplan
Puntos clave:
El comando terraform apply de ejemplo asume que ejecutó terraform plan -out main.tfplan previamente.
Si especificó un nombre de archivo diferente para el parámetro -out, use ese mismo nombre de archivo en la llamada a terraform apply.
Si no ha utilizado el parámetro -out, llame a terraform apply sin ningún parámetro.
Cuando ya no necesite los recursos creados a través de Terraform, realice los pasos siguientes:
Ejecute el comando terraform plan y especifique la marca destroy.
Consola
terraform plan -destroy -out main.destroy.tfplan
Puntos clave:
El comando terraform plan crea un plan de ejecución, pero no lo ejecuta. En su lugar, determina qué acciones son necesarias para crear la configuración especificada en los archivos de configuración. Este patrón le permite comprobar si el plan de ejecución coincide con sus expectativas antes de realizar cambios en los recursos reales.
El parámetro -out opcional permite especificar un archivo de salida para el plan. El uso del parámetro -out garantiza que el plan que ha revisado es exactamente lo que se aplica.
Administre una infraestructura de base de datos de SQL Server para bases de datos relacionales locales e híbridas en la nube mediante las ofertas de bases de datos relacionales PaaS de Microsoft.