Azure云基础架构:分步指南
#python #docker #azure #terraform

介绍

我撰写了有关how to build a cloud infrastructure的文章后,我决定实施现实世界项目,以演示如何建立自己的最佳实践。今天,我正在写有关如何在Microsoft Azure上构建后端API的云基础架构的文章。

内容

我们的项目

我们将开发的项目是由Python,Flask和PostgresQl构建的后端API,并用Docker进行了容器。您可以找到in this repository,克隆到本地计算机,然后开始构建。

注意:可以使用任何技术堆栈构建此项目,但这些步骤将保持不变。

建立云基础架构

因此,我们已经完成了该项目并准备好进行生产。现在,我们的目标是将其部署到云中。为了实现这一目标,我们需要构建云基础架构。让我们按照以下步骤构建它。

定义

我们的目标是部署此简单的后端API,使其在Internet上可用供其他人访问。

为了实现这一目标,我们需要选择一种部署方法。我已经写了一些关于in this article的文章,但假设我们想在远程服务器上使用Docker部署它。

这概述了我们从云中的要求,并基于上面的信息,我们需要:

  • docker注册表以推出和拉码头图像。
  • 远程服务器托管我们的后端API。
  • 我们的后端API的PostgreSQL数据库。
  • 存储用于保存和检索我们的后端API使用的静态文件和媒体文件。

选择

在本文中,我们选择了Microsoft Azure作为部署我们后端的云平台。您将需要在实施步骤中创建一个Azure帐户。

计划

让我们将所需的服务与Azure提供的服务保持一致,并记录我们为每种服务所需的初始配置。

我们的服务 azure服务 andrigration
Docker注册表 Azure容器注册表(ACR) 层或sku:基本
远程服务器 Azure虚拟机 OS:Ubuntu,尺寸:DS1 V2,存储:LRS
PostGressQL数据库 Azure数据库PostgreSQL Server sku:b_gen5_2,存储:5120
存储 Azure Blob存储 层:标准,类型:LRS

设计

我们的设计目前有意保持简单,而无需考虑网络或安全方面,以避免不必要的复杂性。让我们专注于当前需要的服务。

设计,如下所示,涉及访问Azure虚拟机实例的IP地址的用户。 Azure Virtual Machine实例从Azure容器注册表存储库中拉出的Docker映像运行Docker容器。此Docker映像包含我们的代码,该代码被配置为访问Azure数据库PostgreSQL Server中的PostgreSQL数据库和Azure Blob存储中的存储。

azure_infra_diagram

我使用draw.io进行此图。

实施

我们有多种选择用于在Azure上实施此云基础架构,所有这些都是有效的。但是,最佳方法将取决于您的特定要求和项目的复杂性。

  • Microsoft Azure Portal :Azure提供的Web界面,您可以通过其门户手动创建资源。
  • azure cli :Azure命令行接口允许您使用终端中的命令行创建资源。
  • Azure Resource Manager :Azure Resource Manager是Azure提供的代码(IAC)工具的基础架构,您可以在其中使用JSON提供服务。
  • Terraform :Terraform是Hashicorp提供的IAC工具。它具有一个azure提供商,可让您提供Azure资源。

在本文中,我们将使用Terraform创建Azure资源。确保安装它。

基础架构文件夹

让我们创建一个名为基础架构的新文件夹在我们项目的根目录中。这就是它将包含的:

├── secrets.auto.tfvars              # contains secrets, make sure to ignore it
├── main.tf
├── azure                            # azure module that contains azure resources
│   ├── main.tf
│   ├── blob_storage.tf
│   ├── container_registry.tf
│   ├── postgres_database.tf
│   ├── virtual_machine.tf
├── ssh                               # bring your ssh keys, make sure you ignore them
│   ├── id_rsa.pub
│   ├── id_rsa
└── scripts
    └── install_docker.sh

在Terraform上建立Azure提供商

我们需要配置Azure提供商,以便我们可以在Terraform中使用它。在 main.tf 文件中,我们将添加以下配置:

# main.tf

terraform {
  required_version = "1.3.1"
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "3.30.0"
    }
  }
}

provider "azurerm" {
  features {}
  subscription_id = var.azure.subscription_id
  tenant_id       = var.azure.tenant_id
  client_id       = var.azure.client_id
  client_secret   = var.azure.client_secret
}

要安全地存储Azure凭据,我们将创建一个名为 secrets.auto.tfvars 的文件。请确保该文件被忽略,而不承诺进行版本控制。在 secrets.auto.tfvars 文件中,我们将添加以下内容:

# secrets.auto.tfvars

azure = {
  subscription_id = ""
  tenant_id       = "" 
  client_id       = ""
  client_secret   = ""
}

运行以下命令以初始化Terraform并确保一切正常工作:

terraform init

我们将需要创建一个资源组,因此它拥有我们创建的所有资源,因此在 azure/main.tf 文件中添加了这些:

# azure/main.tf

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
    }
  }
}

resource "azurerm_resource_group" "main" {
  name     = "example-project-resource-group"
  location = "East US"
}

提供Azure虚拟机

# azure/virtual_machine.tf

resource "azurerm_linux_virtual_machine" "main" {
  name                            = "example-project-machine"
  computer_name                   = "example-project-machine"
  admin_username                  = "example-project-user"
  size                            = "Standard_DS1_v2"
  resource_group_name             = azurerm_resource_group.main.name
  location                        = azurerm_resource_group.main.location
  network_interface_ids           = [azurerm_network_interface.main.id]
  disable_password_authentication = true

  admin_ssh_key {
    username   = "example-project-user"
    public_key = file("${path.module}/ssh/id_rsa.pub")
  }

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-focal"
    sku       = "20_04-lts-gen2"
    version   = "latest"
  }

  provisioner "remote-exec" {
    connection {
      type        = "ssh"
      user        = "example-project-user"
      host        = self.public_ip_address
      private_key = file("${path.module}/ssh/id_rsa")
    }
    scripts = ["${path.module}/scripts/install_docker.sh"]
  }

}

output "MACHINE_SSH_CONNECT" { 
      value = "ssh example-project-user@${azurerm_linux_virtual_machine.main.public_ip_address}" 
}
output "MACHINE_USER" { value = "example-project-user" }
output "MACHINE_IP" { value = azurerm_linux_virtual_machine.main.public_ip_address }

提供Azure数据库PostgreSQL Server

# azure/postgres_database.tf

resource "azurerm_postgresql_server" "main" {
  name                = "example-project-database-server"
  resource_group_name = azurerm_resource_group.main.name
  location            = azurerm_resource_group.main.location

  administrator_login          = "example-project-db-user"
  administrator_login_password = var.database_server_password

  sku_name   = "B_Gen5_2"
  storage_mb = "5120"
  version    = "11"

  ssl_enforcement_enabled          = true
  ssl_minimal_tls_version_enforced = "TLS1_2"
}

resource "azurerm_postgresql_database" "main" {
  name                = "example-project-db"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_postgresql_server.main.name
  charset             = "UTF8"
  collation           = "English_United States.1252"
}

output "POSTGRES_DB" { value = "example-project-db" }
output "POSTGRES_USER" { value = "example-project-db-user@${azurerm_postgresql_server.main.fqdn}" }
output "POSTGRES_PASSWORD" { value = var.database_server_password }
output "POSTGRES_HOST" { value = azurerm_postgresql_server.main.fqdn }
output "POSTGRES_PORT" { value = "5432" }

提供Azure Blob存储

# azure/blob_storage.tf

resource "azurerm_storage_account" "main" {
  name                     = "example-project"
  account_tier             = "Standard"
  account_replication_type = "LRS"
  resource_group_name      = azurerm_resource_group.main.name
  location                 = azurerm_resource_group.main.location
}

resource "azurerm_storage_container" "main" {
  name                  = "example-project-container"
  container_access_type = "container"
  storage_account_name  = azurerm_storage_account.main.name
}

output "AZURE_ACCOUNT_NAME" { value = "example-project" }
output "AZURE_ACCOUNT_KEY" { value = azurerm_storage_account.main.primary_access_key }
output "AZURE_CUSTOM_DOMAIN" { value = azurerm_storage_account.main.primary_blob_host }
output "AZURE_CONTAINER" { value = "example-project-container" }

提供Azure容器注册表

# azure/container_registry.tf

resource "azurerm_container_registry" "main" {
  name                = "example-project-registry"
  sku                 = "Basic"
  admin_enabled       = true
  resource_group_name = azurerm_resource_group.main.name
  location            = azurerm_resource_group.main.location
}

output "ACR_URL" { value = azurerm_container_registry.main.login_server }
output "ACR_USERNAME" { value = azurerm_container_registry.main.admin_username }
output "ACR_PASSWORD" { value = azurerm_container_registry.main.admin_password }

将它们添加到主

# main.tf

module "azure" {
  source = "./azure"
}

output "azure" {
  value     = module.azure
  sensitive = true
}

应用我们的基础设施

现在所有必要的资源都可以使用,我们可以使用Terraform在Azure上使用它们。

terraform apply

获取输出

如果一切正常工作,则应设置基础架构。您现在可以从Terraform中检索输出值,该值可以在部署代码时使用。

terraform output azure

部署

您可以使用任何CI/CD工具手动或自动部署项目。有关如何执行此操作的说明,请参阅此项目的readme文件中的this section

结论

Azure是一个受欢迎的云提供商,也是行业趋势。许多组织利用Azure来构建其云基础架构。了解如何建立Azure是有价值的,但是遵循最佳实践和定义步骤以确保高质量工作至关重要。我希望这篇文章对您有所帮助,并可以随时关注我以获取更多这样的文章,或者问我与LinkedIn有关的任何内容。