DevOps部署python的AzureFunctions(Httptrigger)+DevOps部署Terraform 构建部署Infra资源

资源介绍

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环境可以查看以下链接进行查找:

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/function_app_function

后续:后续部署请详见DevOps部署python的AzureFunctions(Httptrigger)+DevOps部署Terraform 构建部署Infra资源(二)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小松很努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值