使用 Terraform 在 GCP 上一键部署 EMQX MQTT Broker

news2024/12/21 23:04:32

引言

MQTT 是一种轻量级的消息传递协议,适用于物联网应用实现设备间通信。 作为一款主流的开源 MQTT Broker,EMQX 能够提供高扩展性、可靠性和安全性的 MQTT 消息传递服务。

借助广泛应用的基础设施即代码(IaC)工具 Terraform,您可以轻松在 GCP 上自动部署 EMQX MQTT Broker,从而简化和规范 MQTT 基础设施的设置和管理。

本文将指导您如何设置 GCP 项目、创建服务账户、编写 Terraform 配置文件,实现轻松部署 EMQX MQTT Broker。

准备工作

在开始之前,请做好以下准备:

  • 注册 Google Cloud Platform 账户
  • 在您的本地机器上安装 Google Cloud SDK
  • 在您的本地机器上安装 Terraform
  • 对 GCP、Terraform 和 MQTT 有基本的了解

配置 GCP 环境

按照以下步骤配置 GCP 环境:

  1. 创建新的 GCP 项目或使用已有的项目(Project)。
  2. 为您的项目启用所需的 API(Compute Engine API)。
  3. 为 Terraform 创建具有所需权限的服务账户。建议使用 Compute Engine Admin 角色。
  4. 下载 JSON 密钥文件。

使用 Terraform 在 GCP 上部署 EMQX

配置 Terraform

在您的 Terraform 代码中配置 GCP Provider,并使用服务账户密钥文件进行认证。

provider "google" {
  credentials = file("<PATH-TO-KEY-FILE>")
  project     = "<PROJECT-ID>"
  region     = "<REGION>"
  zone       = "<ZONE>"
}

配置网络

这一步需要了解 GCP 相关的三个基本术语:项目、VPC 和子网(Subnet)。这些术语的定义如下:

  • 项目是 GCP 中的顶层组织单元,包含所有的资源。
  • VPC 是在 GCP 项目内定义的私有网络,允许您创建和管理 IP 地址、子网和路由表。
  • 子网是将 VPC 网络划分为更小、更易于管理的部分的一种方式。它们可以为特定的资源分配 IP 地址,并定义不同的网络段。

它们之间的关系可以用下图来说明:

项目、VPC 和子网(Subnet)

创建 VPC 网络

我们需要创建一个 VPC 网络,为您的网络相关资源提供连接,其中包括:

  • Compute Engine 虚拟机实例
  • Container Engine 容器
  • App Engine Flex 服务
  • 其他网络相关资源
resource "google_compute_network" "vnet" {
  project                 = "<PROJECT>"
  name                    = "<NAME>"
  auto_create_subnetworks = false
}

在 VPC 中创建子网

每个 VPC 网络都被划分为若干子网,这里我们创建一个子网。

resource "google_compute_subnetwork" "sn" {
  name          = "<NAME>"
  ip_cidr_range = cidrsubnet(var.address_space, 8, 1)

  region  = var.region
  network = google_compute_network.vnet.id
}

创建防火墙规则

每个网络都有自己的防火墙,控制着实例之间以及实例与外部的访问。除非创建防火墙规则允许访问实例,否则所有到实例的流量,包括来自其他实例的流量,都会被防火墙阻止。

“ports” 定义了一些与 MQTT 相关的端口,例如 “1883”、“8883”、“8083”、“8084”。

resource "google_compute_firewall" "fw" {
  name          = "<NAME>"
  network       = google_compute_network.vnet.name
  source_ranges = ["0.0.0.0/0"]

  allow {
    protocol = "icmp"
  }

  allow {
    protocol = "tcp"
    ports    = "<PORTS>"
  }
}

配置 EMQX 集群

为每个 EMQX 节点创建虚拟机实例

虚拟机实例可以用于部署应用、运行服务或执行计算任务。

在下面的示例中,我们创建了一个名为 example-instance 的 google_compute_instance 资源,并指定了 name、machine_type、boot_disk、network_interface 属性。

resource "google_compute_instance" "example" {
  name         = "example-instance"
  machine_type = "n1-standard-1"

  boot_disk {
    initialize_params {
      image = ""ubuntu-os-cloud/ubuntu-2004-lts""
    }
  }

  network_interface {
    network = google_compute_network.example.name
    subnetwork = google_compute_subnetwork.example.name
    access_config {
      // Ephemeral external IP
    }
  }
}

启动 EMQX 节点

创建虚拟机实例后,需要初始化每个 EMQX 节点。首先,您必须初始化并复制 init.sh 到每个节点。然后下载 EMQX 包并在每个节点上执行刚才复制的 init.sh。最后,分别启动 EMQX。

resource "null_resource" "init" {
  depends_on = [google_compute_instance.example]

  count = "<INSTANCE-COUNT>"
  connection {
    type        = "ssh"
    host        = "<HOST-LIST>"
    user        = "ubuntu"
    private_key = "<YOUR-PRIVATE-KEY>"
  }

  # config init script
  provisioner "file" {
    content = templatefile("${path.module}/scripts/init.sh", { local_ip = <PRIVATE-IPS>[count.index],
      emqx_lic = <EMQX-LICENSE>, emqx_ca = <EMQX-CA> emqx_cert = <EMQX-CERT>, emqx_key = <PRIVATE-KEY> })
    destination = "/tmp/init.sh"
  }

  # download EMQX package
  provisioner "remote-exec" {
    inline = [
      "curl -L --max-redirs -1 -o /tmp/emqx.zip <EMQX-PACKAGE-URL>"
    ]
  }

  # init system
  provisioner "remote-exec" {
    inline = [
      "chmod +x /tmp/init.sh",
      "/tmp/init.sh",
      "sudo mv /tmp/emqx <HOME>",
    ]
  }

  # start EMQX 
  provisioner "remote-exec" {
    inline = [
      "sudo <HOME>/bin/emqx start"
    ]
  }
}

将 EMQX 节点加入集群

随机选择 EMQX 集群中的一个节点,然后逐个将其他节点加入该节点。

resource "null_resource" "emqx_cluster" {
  depends_on = [null_resource.init]

  count = "<INSTANCE-COUNT>-1"

  connection {
    type        = "ssh"
    host        = <OTHERS>[count.index % <OTHERS>]
    user        = "ubuntu"
    private_key = "<YOUR-PRIVATE-KEY>"
  }

  provisioner "remote-exec" {
    inline = [
      "/home/ubuntu/emqx/bin/emqx_ctl cluster join emqx@${local.another_emqx}"
    ]
  }
}

配置负载均衡

配置负载均衡

在上面的示例中:

  1. 创建了一个 google_compute_http_health_check 资源,用于配置健康状态检查。
  2. 创建了一个 google_compute_target_pool 资源,它引用了实例组和健康状态检查。
  3. 创建了一个 google_compute_forwarding_rule 资源,它设置了转发规则,将 1883 端口的入站流量路由到目标池。
  4. 还可以为其它端口(“8883”、“8083”、“8084”、“18083”)添加更多的 google_compute_forwarding_rule。
resource "google_compute_http_health_check" "example" {
  name               = "example-health-check"
  check_interval_sec = 30
  timeout_sec        = 5
  port         = 8081
  request_path = "/status"
}

resource "google_compute_target_pool" "example" {
  name = "example-target-pool"

  instances = [
    google_compute_instance_group.example.self_link
  ]

  health_checks = [
    google_compute_http_health_check.example.name
  ]
}

resource "google_compute_forwarding_rule" "example-1883" {
  name       = "example-forwarding-rule"
  target     = google_compute_target_pool.example.self_link
  port_range = "1883"
  ip_protocol = "TCP"
}

resource "google_compute_forwarding_rule" "example-8883" {
  ...
}

初始化并应用 Terraform

terraform init
terraform plan
terraform apply

应用成功后,将输出以下内容:

Outputs:
loadbalancer_ip = ${loadbalancer_ip}
tls_ca = <sensitive>
tls_cert = <sensitive>
tls_key = <sensitive>

您现在可以通过相应的端口访问不同的服务了。

Dashboard: ${loadbalancer_ip}:18083
MQTT: ${loadbalancer_ip}:1883
MQTTS: ${loadbalancer_ip}:8883
WS: ${loadbalancer_public_ip}:8083
WSS: ${loadbalancer_public_ip}:8084

结语

使用 Terraform 在 GCP 上部署 EMQX,可以让您轻松管理物联网基础设施,专注于创造物联网应用。按照本文的指引,您可以在 GCP 上快速搭建出具有强大扩展性和高可靠性的 MQTT Broker,为您的物联网项目提供支持。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/one-click-deploying-emqx-mqtt-broker-on-gcp-using-terraform

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外包干了4年,人直接废了···

有一说一&#xff0c;外包没有给很高的薪资&#xff0c;是真不能干呀&#xff01; 先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0…

【javaScript】Proxy与Object.defineProperty的区别

目录 功能方面的区别&#xff1a;Object.defineProperty对整个对象进行赋值&#xff0c;不会触发set拦截Object.defineProperty对整个对象进行遍历&#xff0c;不会触发get拦截Proxy自定义拦截行为 Proxy的优缺点优点&#xff1a;缺点 Proxy和Object.defineProperty都是JavaScr…

亿发软件:中医药信息一体化解决方案,智慧中药房煎配系统

智慧中药房是中医药服务的一种新模式&#xff0c;随着中医药信息化建设逐渐兴起&#xff0c;湖南远跃顺应时代发展需求&#xff0c;深度分析中医药行业现状&#xff0c;充分发挥研发技术创新&#xff0c;融合运用互联网、物联网、大数据等技术创新成果&#xff0c;研发出中药信…

上市后首份年报,读书郎去年净利下滑94%

又是一年高考逐梦时&#xff0c;寒窗二十四年的读书郎如何克服“偏科”症&#xff1f; 近日&#xff0c;读书郎教育控股有限公司&#xff08;下称“读书郎”,02385.HK)交出了上市后的首份年报。 3月29日&#xff0c;财报公布的首个交易日&#xff0c;其股价下跌0.27%&#xf…

起点,而非终点——我的创作纪念日

机缘 我注定遇见CSDN. 作为一位oier,在学习算法,查找题解的时候&#xff0c;第一个看到的&#xff0c;总是CSDN。 于是&#xff0c;我加入了CSDN这个家庭。 茫茫然然&#xff0c;带着无限的憧憬&#xff0c;我写下了第一篇文章&#xff1a;《你好&#xff0c;CSDN》 我的C…

什么是融合CDN?融合CDN的优势和常见的调度模式有哪些?

什么是融合CDN&#xff1f; 为了理解什么是融合CDN&#xff0c;我们先了解什么是CDN。CDN是一个地理分布的边缘服务器网络&#xff0c;其目标是提供更快、可靠的互联网内容交付。CDN通过在网络边缘缓存互联网内容来实现这一点&#xff0c;从而减少数据源和最终用户之间的物理距…

“入职半年,绩效背了C”,谈谈「绩效管理」的误区及对策

职场打工人上班吃维C&#xff0c;绩效却背C&#xff0c;苦C久矣&#xff01; 又到年中“考核季”&#xff0c;被绩效考核折磨到“头秃”的职场打工人们&#xff0c;选择将情绪释放到社交平台。 一位朋友分享了自己绩效被打C的经历&#xff1a;“茶饭不思&#xff0c;感觉自己很…

数学建模经历-程序人生

引言 即将大四毕业(现在大三末)&#xff0c;闲来无事(为了冲粽子)就写一篇记录数学建模经历的博客吧。其实经常看到一些大佬的博客里会有什么"程序人生"、"人生感想"之类的专栏&#xff0c;但是由于我只是一个小趴菜没什么阅历因此也就没有写过类似的博客…

一文详解IPv4与IPv6协议

前段时间的工作大多与通信协议相关&#xff0c;随着协议相关工作的不断深入&#xff0c;相关数据包的分析占据了不少工作时间。在数据报文分析中&#xff0c;发现大学期间IP协议内容已经重新还给了老师&#xff0c;相关知识完全没有了印象&#xff0c;这篇文章算是一篇复习文&a…

Day05 04-MySQL分库分表介绍

文章目录 第十七章 MySQL分库分表17.1 什么是分库分表17.2 为什么要分库分表17.3 垂直切分17.3.1 垂直分库17.3.2 垂直分表 17.4 水平切分17.4.1 水平分库17.4.2 水平分表17.4.3 常见的水平切分规则 第十七章 MySQL分库分表 17.1 什么是分库分表 MySQL数据库常见的优化方案中…

新的管理中心应用

大家好&#xff0c;才是真的好。 Notes/Domino 14 Drop1如约而至&#xff0c;让我们有了很多内容要写。首先是管理新特性&#xff0c;就像上篇和大家介绍的&#xff0c;感受最直接的就是新的管理中心应用AdminCentral。 以目前的Drop1环境来看&#xff0c;管理中心应用主要功…

plus.runtime.version总是13.8.4

引言 最近在uniapp中使用到了plus.runtime.version&#xff0c;但是在开发环境下一直无法获取到真正的版本号&#xff0c;他的值一直都是13.8.4&#xff0c;在全局进行搜索也没有发现哪里设置了13.8.4&#xff0c;后来查阅了相关资料才知道这并不是自己写错了。 场景复现&…

你知不知道ai如何绘画的

有没有想要自己能绘画一幅有艺术感的画呢&#xff1f;想自己也能将自己所想的事、物或景绘画出来呢&#xff1f;其实你不用担心你的绘画功底不行&#xff0c;因为现在有一门ai绘画的技术&#xff0c;它可以将你提供的信息用智能技术自动绘画&#xff0c;你也可以把它当做一门新…

数字IC前端学习笔记:仲裁轮询(一)

相关文章 数字IC前端学习笔记&#xff1a;LSFR&#xff08;线性反馈移位寄存器&#xff09; 数字IC前端学习笔记&#xff1a;跨时钟域信号同步 数字IC前端学习笔记&#xff1a;信号同步和边沿检测 数字IC前端学习笔记&#xff1a;锁存器Latch的综合 数字IC前端学习笔记&am…

【面试必问】Spring核心之面向切面编程(AOP)

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 &#x1f495;&#x1f495; 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#…

【数据结构】八大排序算法

目录 一、直接插入排序 二、希尔排序 三、选择排序 四、堆排序 五、冒泡排序 六、快速排序 1、递归版本 1.1 hoare 法 1.2 挖坑法 1.3 前后指针法 2、非递归版本 3、快速排序的优化 3.1 三数取中 3.2 小区间优化 七、归并排序 1、递归版本 2、非递归版本 八、计数排序 …

【Spring Security】的RememberMe功能流程与源码详解

文章目录 前言原理 基础版搭建初始化sql依赖引入配置类验证 源码分析 进阶版集成源码分析疑问1疑问2 鉴权 升级版集成初始化sql配置类验证 源码分析鉴权流程 扩展版 前言 之前我已经写过好几篇权限认证相关的文章了&#xff0c;有想复习的同学可以查看【身份权限认证合集】。今…

Ada Tutorial(3)SPARK2——Post condition + Loop Invariant 后置条件 + 循环不变量

文章目录 divmod循环不变量 v.s. 后置条件扩展思考 divmod -- divmod.adb package body DivMod with SPARK_Mode isprocedure DivMod(X : Positive; N : Positive; K : out Natural; Remainder : out Natural)isY : Natural : X;beginK : 0;while Y > N loopY : Y - N;K : …

MySQL 日期与时间函数

一、获取日期、时间 函数用法CURDATE()&#xff0c;CURRENT_DATE()返回当前日期&#xff0c;只包含年、月、日CURTIME() &#xff0c; CURRENT_TIME()返回当前时间&#xff0c;只包含时、分、秒NOW() &#xff0c; SYSDATE()&#xff0c;CURRENT_TIMESTAMP() &#xff0c; LOC…

为什么企业和品牌一定要创建百度百科词条呢?

在企业和品牌宣传推广方面&#xff0c;百度百科作为一个权威的知识平台&#xff0c;早已成为了宣传阶段非常重要的一环。本文伯乐网络传媒将从以下几个方面探讨为什么企业和品牌一定要创建百度百科词条。 一、提升企业和品牌知名度 在信息时代&#xff0c;信息的获取渠道变得更…