介绍
我撰写了有关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存储中的存储。
我使用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有关的任何内容。