Udostępnij za pośrednictwem


Szybki start: tworzenie magazynu kluczy platformy Azure i klucza przy użyciu narzędzia Terraform

Azure Key Vault to usługa w chmurze, która zapewnia bezpieczny magazyn wpisów tajnych, takich jak klucze, hasła i certyfikat. Ten artykuł koncentruje się na procesie wdrażania pliku Terraform w celu utworzenia magazynu kluczy i klucza.

Narzędzie Terraform umożliwia definiowanie, wyświetlanie wersji zapoznawczej i wdrażanie infrastruktury chmury. Za pomocą narzędzia Terraform tworzysz pliki konfiguracji przy użyciu składni HCL. Składnia listy HCL umożliwia określenie dostawcy chmury — takiego jak platforma Azure — oraz elementów tworzących infrastrukturę chmury. Po utworzeniu plików konfiguracji utworzysz plan wykonywania , który umożliwia wyświetlenie podglądu zmian infrastruktury przed ich wdrożeniem. Po zweryfikowaniu zmian należy zastosować plan wykonywania w celu wdrożenia infrastruktury.

W tym artykule dowiesz się, jak:

Wymagania wstępne

Wdrożenie kodu Terraform

  1. Utwórz katalog, w którym chcesz przetestować i uruchomić przykładowy kod programu Terraform i utworzyć go jako bieżący katalog.

  2. Utwórz plik o nazwie providers.tf i wstaw następujący kod:

    terraform {
      required_version = ">=1.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
      }
    }
    provider "azurerm" {
      features {}
    }
    
  3. Utwórz plik o nazwie main.tf i wstaw następujący kod:

    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    resource "azurerm_resource_group" "rg" {
      name     = random_pet.rg_name.id
      location = var.resource_group_location
    }
    
    data "azurerm_client_config" "current" {}
    
    resource "random_string" "azurerm_key_vault_name" {
      length  = 13
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    locals {
      current_user_id = coalesce(var.msi_id, data.azurerm_client_config.current.object_id)
    }
    
    resource "azurerm_key_vault" "vault" {
      name                       = coalesce(var.vault_name, "vault-${random_string.azurerm_key_vault_name.result}")
      location                   = azurerm_resource_group.rg.location
      resource_group_name        = azurerm_resource_group.rg.name
      tenant_id                  = data.azurerm_client_config.current.tenant_id
      sku_name                   = var.sku_name
      soft_delete_retention_days = 7
    
      access_policy {
        tenant_id = data.azurerm_client_config.current.tenant_id
        object_id = local.current_user_id
    
        key_permissions    = var.key_permissions
        secret_permissions = var.secret_permissions
      }
    }
    
    resource "random_string" "azurerm_key_vault_key_name" {
      length  = 13
      lower   = true
      numeric = false
      special = false
      upper   = false
    }
    
    resource "azurerm_key_vault_key" "key" {
      name = coalesce(var.key_name, "key-${random_string.azurerm_key_vault_key_name.result}")
    
      key_vault_id = azurerm_key_vault.vault.id
      key_type     = var.key_type
      key_size     = var.key_size
      key_opts     = var.key_ops
    
      rotation_policy {
        automatic {
          time_before_expiry = "P30D"
        }
    
        expire_after         = "P90D"
        notify_before_expiry = "P29D"
      }
    }
    
  4. Utwórz plik o nazwie variables.tf i wstaw następujący kod:

    variable "resource_group_location" {
      type        = string
      description = "Location for all resources."
      default     = "eastus"
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
      default     = "rg"
    }
    
    variable "vault_name" {
      type        = string
      description = "The name of the key vault to be created. The value will be randomly generated if blank."
      default     = ""
    }
    
    variable "key_name" {
      type        = string
      description = "The name of the key to be created. The value will be randomly generated if blank."
      default     = ""
    }
    
    variable "sku_name" {
      type        = string
      description = "The SKU of the vault to be created."
      default     = "standard"
      validation {
        condition     = contains(["standard", "premium"], var.sku_name)
        error_message = "The sku_name must be one of the following: standard, premium."
      }
    }
    
    variable "key_permissions" {
      type        = list(string)
      description = "List of key permissions."
      default     = ["List", "Create", "Delete", "Get", "Purge", "Recover", "Update", "GetRotationPolicy", "SetRotationPolicy"]
    }
    
    variable "secret_permissions" {
      type        = list(string)
      description = "List of secret permissions."
      default     = ["Set"]
    }
    
    variable "key_type" {
      description = "The JsonWebKeyType of the key to be created."
      default     = "RSA"
      type        = string
      validation {
        condition     = contains(["EC", "EC-HSM", "RSA", "RSA-HSM"], var.key_type)
        error_message = "The key_type must be one of the following: EC, EC-HSM, RSA, RSA-HSM."
      }
    }
    
    variable "key_ops" {
      type        = list(string)
      description = "The permitted JSON web key operations of the key to be created."
      default     = ["decrypt", "encrypt", "sign", "unwrapKey", "verify", "wrapKey"]
    }
    
    variable "key_size" {
      type        = number
      description = "The size in bits of the key to be created."
      default     = 2048
    }
    
    variable "msi_id" {
      type        = string
      description = "The Managed Service Identity ID. If this value isn't null (the default), 'data.azurerm_client_config.current.object_id' will be set to this value."
      default     = null
    }
    
  5. Utwórz plik o nazwie outputs.tf i wstaw następujący kod:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "azurerm_key_vault_name" {
      value = azurerm_key_vault.vault.name
    }
    
    output "azurerm_key_vault_id" {
      value = azurerm_key_vault.vault.id
    }
    

Inicjowanie narzędzia Terraform

Uruchom narzędzie terraform init, aby zainicjować wdrożenie narzędzia Terraform. Polecenie to pobiera dostawcę Azure wymaganego do zarządzania zasobami Azure.

terraform init -upgrade

Kluczowe punkty:

  • Parametr -upgrade uaktualnia niezbędne wtyczki dostawcy do najnowszej wersji, która jest zgodna z ograniczeniami wersji konfiguracji.

Tworzenie planu wykonania programu Terraform

Uruchom terraform plan w celu utworzenia planu wykonania.

terraform plan -out main.tfplan

Kluczowe punkty:

  • Polecenie terraform plan tworzy plan wykonania, ale nie wykonuje go. Zamiast tego, określa, jakie działania są niezbędne do stworzenia konfiguracji określonej w plikach konfiguracyjnych. Ten wzorzec pozwala Ci zweryfikować, czy plan wykonania spełnia Twoje oczekiwania, zanim wprowadzisz jakiekolwiek zmiany do rzeczywistych zasobów.
  • Opcjonalny parametr -out pozwala określić plik wyjściowy dla planu. Użycie parametru -out zapewnia, że plan, który przejrzałeś, zostanie dokładnie zastosowany.

Zastosuj plan wykonawczy Terraform

Uruchom terraform apply, aby zastosować plan wykonania do Twojej infrastruktury chmurowej.

terraform apply main.tfplan

Kluczowe punkty:

  • Przykładowe polecenie terraform apply zakłada, że wcześniej uruchomiono polecenie terraform plan -out main.tfplan.
  • Jeśli podałeś inną nazwę pliku dla parametru -out, użyj tej samej nazwy pliku w wywołaniu terraform apply.
  • Jeśli nie użyłeś parametru -out, wywołaj terraform apply bez żadnych parametrów.

Weryfikowanie wyników

  1. Pobierz nazwę magazynu kluczy platformy Azure.

    azurerm_key_vault_name=$(terraform output -raw azurerm_key_vault_name)
    
  2. Uruchom az keyvault key list, aby wyświetlić informacje o kluczach skarbca kluczy.

    az keyvault key list --vault-name $azurerm_key_vault_name
    

Uprzątnij zasoby

Jeśli zasoby utworzone za pomocą narzędzia Terraform nie są już potrzebne, wykonaj następujące czynności:

  1. Uruchom terraform plan i określ flagę destroy.

    terraform plan -destroy -out main.destroy.tfplan
    

    Kluczowe punkty:

    • Polecenie terraform plan tworzy plan wykonania, ale nie wykonuje go. Zamiast tego, określa, jakie działania są niezbędne do stworzenia konfiguracji określonej w plikach konfiguracyjnych. Ten wzorzec pozwala Ci zweryfikować, czy plan wykonania spełnia Twoje oczekiwania, zanim wprowadzisz jakiekolwiek zmiany do rzeczywistych zasobów.
    • Opcjonalny parametr -out pozwala określić plik wyjściowy dla planu. Użycie parametru -out zapewnia, że plan, który przejrzałeś, zostanie dokładnie zastosowany.
  2. Uruchom terraform apply, aby zastosować plan wykonania.

    terraform apply main.destroy.tfplan
    

Rozwiązywanie problemów z programem Terraform na platformie Azure

Rozwiązywanie typowych problemów podczas korzystania z narzędzia Terraform na platformie Azure

Dalsze kroki