DevOps+Terraform部署Infra+Azure Functions部署
资源介绍
Terraform
Terraform是什么?
Terraform ----- 是一个基础设施管理工具,它允许我们以代码的方式构建、更改和管理基础设施。Terraform 并不局限于任何特定的云服务提供商,它可以与多个云提供商和环境协同工作。虽然 Azure,AWS 分明有针对自己云平台的资源管理、设置的解决方案。
Terraform运行模式?
在Azure中我们构建的Infra资源会形成一个ARM模板:
Azure:ARM 模板(ARM模板是一个定义项目基础结构和配置的 JavaScript 对象表示法 (JSON) 文件。 该模板使用声明性语法,使你可以指明要部署的内容,而不需要编写一系列编程命令来创建内容。 在该模板中,指定要部署的资源以及这些资源的属性。)
Terraform 版本控制?
Terraform CLI 提供一种简单机制,用于将配置文件部署到 Azure 并对其进行版本控制,使用 Terraform 基于模板的配置文件,能够以可重复、可预测的方式定义、预配和配置 Azure 资源。
AzureDevOps
使用Azure DevOps自动化编译部署,开发项目总分为以下几个阶段:
开发>提交>编译集成>测试>部署>监控反馈
我们要反复去检测,反复构建直到项目完成。人工的话太繁琐,这个时候AzureDevOps就起到了运行这个过程的作用。
AzureFunctions
运行我们的程序,在这里我们主要介绍的是Terraform,Azure Functions可以看作一个应用的项目,我们选用HTTP Trigger触发的应用,方便测试。
背景介绍
当今云科技发展迅速,很多企业公司都开始迁移本项目上云的工作,而我们上云的话首先需要构建我们项目所运行的infra环境,我们手工构建的话不仅工作量大而且容易出错,这时候我们可以用IAC,代码即设施,我们使用Terraform声明式的代码构建我们项目运行所需要的infra环境。然后我们通过DevOps在部署项目之前先将Terraform的Infra环境部署好,然后再将项目部署好,这样就很方便了。
资源准备
本地项目开发:VScode Python 3.10(都可以,这里我用的3.10) Terraform插件
Azure : Azure订阅
AzureDevOps:一个组织 一个空项目
代码书写
项目代码
打开VScode:
快捷键(Ctrl+Shift+P),找到Azure Functions:Create New project。。。
期间会让你选择到Python版本,和验证方式(选择无验证方式即可),然后我们选择HTTP Trigger触发的
一直到最后我们稍等一会就可以建成功一个项目,我们可以在本地运行一下,访问一下URL给一个参数运行成功就OK了。
Infra 代码
ok,我们的主角来了Terraform。我们来创建Azure的infra环境代码。我们在我们项目并列的文件夹新建文件夹叫做"terraforminfra",然后我们在这个文件夹下创建infra资源的代码。
我们来创建几个文件:
main.tf:创建资源的代码,我们声明的Azureinfra资源的代码。
outputs.tf:输出文件,我们可以输出一些参数,或者连接字符串等
provider.tf:required_providers的版本,这个东西调用Azure 创建资源的API,以及要声明需要连接的云是什么(Azure或者AWS…)
variables.tf:定义参数,这里面可以定义参数,比如location,resource groupname等重复利用的参数,可供main.tf文件使用。
书写infra代码
每个项目迁移上云肯定需要先有架构图的,以及infra资源文档,我们HttpTrigger
需要一个应用服务计划,存储账户,和一个Azure Functions。这样就可以跑起来一个Azure Functions项目。
main.tf:
resource "azurerm_resource_group" "name" {
name = var.azurerm_resource_group
location = var.location
}
resource "azurerm_storage_account" "example" {
name = "funcstoracont"
resource_group_name = azurerm_resource_group.name.name
location = azurerm_resource_group.name.location
account_tier = "Standard"
account_replication_type = "LRS"
tags = {
environment = "test"
}
}
resource "azurerm_service_plan" "example" {
name = "example-service-plan"
location = azurerm_resource_group.name.location
resource_group_name = azurerm_resource_group.name.name
os_type = "Linux"
sku_name = "S1"
}
resource "azurerm_linux_function_app" "example" {
name = "ls-exale-func"
location = azurerm_resource_group.name.location
resource_group_name = azurerm_resource_group.name.name
service_plan_id = azurerm_service_plan.example.id
storage_account_name = azurerm_storage_account.example.name
storage_account_access_key = azurerm_storage_account.example.primary_access_key
site_config {
application_stack {
python_version = "3.10"
}
}
}
resource "azurerm_function_app_function" "example" {
name = "example-function-app-function-ls"
function_app_id = azurerm_linux_function_app.example.id
language = "Python"
test_data = jsonencode({
"name" = "Azure"
})
config_json = jsonencode({
"bindings" = [
{
"authLevel" = "function"
"direction" = "in"
"methods" = [
"get",
"post",
]
"name" = "req"
"type" = "httpTrigger"
},
{
"direction" = "out"
"name" = "$return"
"type" = "http"
},
]
})
}
outputs.tf:
output "resource_group_name" {
value = azurerm_resource_group.name.id
}
provider.tf:
terraform {
required_providers {
azurerm = {
version = "~>3.47.0"
source = "hashicorp/azurerm"
}
}
backend "azurerm" {}
}
provider "azurerm" {
features {
}
}
variables.tf:
variable "location" {
type = string
default = "east asia"
description = "resource location default Eastasia"
}
variable "azurerm_resource_group" {
type = string
default = "lisongterraform"
description = "resourcegroup name"
}
最后的代码结构如下:
如果我们需要部署别的infra环境可以查看以下链接进行查找: