Azure Terraform(十四)Azure Key Vault 的機密管理

一,引言

  最近有網友私信我,將 Terraform 部署到 Azure 是一種將基礎結構作爲代碼進行管理的好方法,但是如何使用 Azure Key Vault 來存儲我們的 Secret ?在這篇博文中,我將給大家展示一下展示如何使用 Terraform 引用 Azure Key Vault Secret

1)這個時候就有人問了,Secret 信息爲什麼要存儲在 Azure Key Vault ?

Azure Key Vault 是在 Azure 中存儲機密的方法。它是存儲和訪問 Secret 的安全場所您可以生成、存儲和控制令牌、密碼、證書、API 密鑰和其他祕密的訪問。

讓我們一起開始今天的內容來展示如何做到這一點 ?

二,正文

1,使用 Terraform 創建 Azure Key Vault

讓我們使用Terraform 創建一個 Key Vault

data "azurerm_resource_group" "cnbate_resource_group" {
  name = "Web_Test_TF_RG"
}


resource "azurerm_key_vault" "keyvault1" {
  name                = "cnbateblogwebkv"
  resource_group_name = data.azurerm_resource_group.cnbate_resource_group.name
  tenant_id           = data.azurerm_client_config.current.tenant_id
  sku_name            = "standard"
  location            = data.azurerm_resource_group.cnbate_resource_group.location
  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = data.azurerm_client_config.current.object_id

    secret_permissions = [
      "Get",
      "List",
      "Set",
      "Delete"
    ]
  }
}

2,使用 Terraform 和 Azure CLI 創建 Secret

Terraform:

resource "azurerm_key_vault_secret" "keyvault_secret1" {
  name         = "Name1"
  value        = "cnbatelisi"
  key_vault_id = azurerm_key_vault.kv.id
}

使用 Azure CLI 創建第二個 Key Vault 機密

az keyvault secret set --vault-name cnabteblogwebkv --name Name2 --value cnbatewangwu

登錄 Azure Portal,找到資源組 " Web_Test_TF_RG " 下的名字叫 “” 的 Key vault 

下面創建的兩個 Secret :

3,引用 Terraform 中的兩個祕密

在這個例子中,我在上面添加了兩個 Secret 。我現在將展示如何在 Terraform 中引用它們。

第一個將根據 Terraform 創建的 Secret 創建一個 Storage Account。第二個將根據 Azure CLI 創建的機密創建一個存儲帳戶。

resource "azurerm_storage_account" "storage_account1" {
  name                     = azurerm_key_vault_secret.keyvault_secret1.value
  resource_group_name      = data.azurerm_resource_group.cnbate_resource_group.name
  location                 = data.azurerm_resource_group.cnbate_resource_group.location
  account_tier             = "Standard"
  account_replication_type = "LRS"

  depends_on = [
    data.azurerm_resource_group.cnbate_resource_group,
    azurerm_key_vault_secret.keyvault_secret1
  ]
}

對於第二個示例,我將使用 datasource 引用 Azure CLI 創建的 keyvault_secret2

data "azurerm_key_vault_secret" "keyvault_secret2" {
  name         = "Name2"
  key_vault_id = azurerm_key_vault.keyvault1.id
}

resource "azurerm_storage_account" "storage_account2" {
  name                     = data.azurerm_key_vault_secret.keyvault_secret2.value
  resource_group_name      = data.azurerm_resource_group.cnbate_resource_group.name
  location                 = data.azurerm_resource_group.cnbate_resource_group.location
  account_tier             = "Standard"
  account_replication_type = "LRS"

  depends_on = [
    data.azurerm_resource_group.cnbate_resource_group
  ]
}

完整代碼:

terraform {
  # backend "azurerm" {
  #   storage_account_name = "cnbatestorestatefile004"
  #   container_name       = "terraform-state"
  #   key                  = "cnbate.terraform.stats"
  # }

  required_providers {
    azurerm = {
    }
  }
}

provider "azurerm" {
  features {}
}

locals {
  location_eastAsia = "East Asia"
}

data "azurerm_client_config" "current" {

}

data "azurerm_resource_group" "cnbate_resource_group" {
  name = "Web_Test_TF_RG"
}


resource "azurerm_key_vault" "keyvault1" {
  name                = "cnbateblogwebkv"
  resource_group_name = data.azurerm_resource_group.cnbate_resource_group.name
  tenant_id           = data.azurerm_client_config.current.tenant_id
  sku_name            = "standard"
  location            = data.azurerm_resource_group.cnbate_resource_group.location
  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = data.azurerm_client_config.current.object_id

    secret_permissions = [
      "Get",
      "List",
      "Set",
      "Delete"
    ]
  }
}

resource "azurerm_key_vault_secret" "keyvault_secret1" {
  name         = "Name1"
  value        = "cnbatelisi"
  key_vault_id = azurerm_key_vault.keyvault1.id
}


resource "azurerm_storage_account" "storage_account1" {
  name                     = azurerm_key_vault_secret.keyvault_secret1.value
  resource_group_name      = data.azurerm_resource_group.cnbate_resource_group.name
  location                 = data.azurerm_resource_group.cnbate_resource_group.location
  account_tier             = "Standard"
  account_replication_type = "LRS"

  depends_on = [
    data.azurerm_resource_group.cnbate_resource_group,
    azurerm_key_vault_secret.keyvault_secret1
  ]
}

data "azurerm_key_vault_secret" "keyvault_secret2" {
  name         = "Name2"
  key_vault_id = azurerm_key_vault.keyvault1.id
}

resource "azurerm_storage_account" "storage_account2" {
  name                     = data.azurerm_key_vault_secret.keyvault_secret2.value
  resource_group_name      = data.azurerm_resource_group.cnbate_resource_group.name
  location                 = data.azurerm_resource_group.cnbate_resource_group.location
  account_tier             = "Standard"
  account_replication_type = "LRS"

  depends_on = [
    data.azurerm_resource_group.cnbate_resource_group
  ]
}
Terraform Code

登錄 Azure Portal,查看利用Terraform 創建好的 Storage Account

Bingo!!!!! 🎉🎉🎉✌️✌️

三,結尾

  在這篇博文中,主要向大家展示瞭如何使用 Azure Key Vault 來存儲 Terraform 創建的 Secret。我希望您覺得這很有用。本文所分享的內容也存在着很多我自己的一些理解,有理解不到位的,望包含,並且指出不足之處!!!!!

參考鏈接:Terraform Key vault

作者:Allen 

版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章