「幻兽帕鲁5天爆卖15亿」 用Terraform一分钟搭建自己专属的《幻兽帕鲁》世界

简介: 幻兽帕鲁是一款多人在线的全新开放世界生存游戏。随着游戏越来越火爆,出现了很多搭建游戏服务器的需求。对于游戏玩家或者游戏运营商,有没有简单高效地在云上部署幻兽帕鲁游戏服务器方式呢?本文基于 Terraform 提供了一种自动化在阿里云上部署幻兽帕鲁的方案,用户通过简单的配置文件,即可在数分钟内完成游戏服务器的搭建。

幻兽帕鲁是一款多人在线的全新开放世界生存游戏。随着游戏越来越火爆,在线人数的激增导致官方服务不稳定,影响玩家游戏体验。对于游戏玩家或者游戏运营商,有没有简单高效地在云上部署幻兽帕鲁游戏服务器方式呢?本文基于 Terraform 提供了一种自动化在阿里云上部署幻兽帕鲁的方案,用户通过简单的配置文件,即可在数分钟内完成游戏服务器的搭建。

image.png


1. 快速开始

1.1. 安装 Terraform

参阅《在本地安装和配置Terraform》一文安装并配置环境。

1.2. 配置模板 📝

在任意一个目录中创建一个 main.tf 文件,将如下内容写入其中:

provider "alicloud" {
  region  ="cn-hangzhou"}
variable "name" {
  default ="terraform-palworld"}
data "alicloud_zones""example" {
  available_resource_creation ="Instance"}
resource "alicloud_vpc""example" {
  vpc_name   = var.name
  cidr_block ="10.4.0.0/16"}
resource "alicloud_vswitch""example" {
  vswitch_name = var.name
  cidr_block   ="10.4.0.0/24"  vpc_id       = alicloud_vpc.example.id
  zone_id      = data.alicloud_zones.example.zones.0.id
}
resource "alicloud_security_group""example" {
  name   = var.name
  vpc_id = alicloud_vpc.example.id
}
resource "alicloud_security_group_rule""allow_all_tcp" {
  type              ="ingress"  ip_protocol       ="all"  nic_type          ="intranet"  policy            ="accept"  port_range        ="8211"  priority          =1  security_group_id = alicloud_security_group.example.id
  cidr_ip           ="0.0.0.0/0"}
data "alicloud_instance_types""enhance" {
  availability_zone = data.alicloud_zones.example.zones.0.id
  cpu_core_count    =8  memory_size       =32}
data "alicloud_images""example" {
  name_regex ="^ubuntu_[0-9]+_[0-9]+_x64*"  owners     ="system"}
resource "alicloud_instance""enhance" {
  availability_zone = data.alicloud_zones.example.zones.0.id
  instance_name     ="terraform-palworld"  image_id          = data.alicloud_images.example.images.0.id
  instance_type     = data.alicloud_instance_types.enhance.instance_types.0.id
  security_groups   = [alicloud_security_group.example.id]
  vswitch_id        = alicloud_vswitch.example.id
  user_data         ="IyEvYmluL2Jhc2gKY2F0Pmluc3RhbGwuc2g8PEVPRgojIS9iaW4vYmFzaApzdGVhbV91c2VyPXN0ZWFtCmxvZ19wYXRoPS90bXAvcGFsX3NlcnZlci5sb2cKc3VkbyB1c2VyYWRkIC1tIC1zIC9iaW4vYmFzaCBcJHN0ZWFtX3VzZXIKc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgbXVsdGl2ZXJzZSAteSA+IFwkbG9nX3BhdGgKc3VkbyBkcGtnIC0tYWRkLWFyY2hpdGVjdHVyZSBpMzg2ID4+IFwkbG9nX3BhdGgKc3VkbyBhcHQgdXBkYXRlIC15ID4+IFwkbG9nX3BhdGgKc3VkbyBhcHQtZ2V0IHJlbW92ZSBuZWVkcmVzdGFydCAteSA+PiBcJGxvZ19wYXRoCmVjaG8gc3RlYW0gc3RlYW0vbGljZW5zZSBub3RlICcnIHwgc3VkbyBkZWJjb25mLXNldC1zZWxlY3Rpb25zIAplY2hvIHN0ZWFtIHN0ZWFtL3F1ZXN0aW9uIHNlbGVjdCAiSSBBR1JFRSIgfCBzdWRvIGRlYmNvbmYtc2V0LXNlbGVjdGlvbnMgCnN1ZG8gYXB0IGluc3RhbGwgc3RlYW1jbWQgLXkgPj4gXCRsb2dfcGF0aApzdWRvIGVjaG8gInN0ZWFtICAgQUxMPShBTEw6QUxMKSBBTEwiID4+IC9ldGMvc3Vkb2VycwpzdWRvIGxuIC1zIC91c3IvZ2FtZXMvc3RlYW1jbWQgL3Vzci9iaW4vc3RlYW1jbWQKc3RlYW1jbWQgK3F1aXQKc3RlYW1fdXNlcl9wYXRoPS9ob21lL3N0ZWFtCnN0ZWFtY21kX3BhdGg9XCQod2hpY2ggc3RlYW1jbWQpCnN1ZG8gLXUgXCRzdGVhbV91c2VyIG1rZGlyIC1wIFwkc3RlYW1fdXNlcl9wYXRoLy5zdGVhbS9zZGs2NC8gPj4gXCRsb2dfcGF0aApzdWRvIC11IFwkc3RlYW1fdXNlciBcJHN0ZWFtY21kX3BhdGggK2xvZ2luIGFub255bW91cyArYXBwX3VwZGF0ZSAyMzk0MDEwIHZhbGlkYXRlICtxdWl0ID4+IFwkbG9nX3BhdGgKc3VkbyAtdSBcJHN0ZWFtX3VzZXIgY3AgXCRzdGVhbV91c2VyX3BhdGgvU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvbGludXg2NC8qIFwkc3RlYW1fdXNlcl9wYXRoLy5zdGVhbS9zZGs2NC8Kc3VkbyAtdSBcJHN0ZWFtX3VzZXIgbm9odXAgL2hvbWUvc3RlYW0vU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvUGFsU2VydmVyLnNoID4+IFwkbG9nX3BhdGgKRU9G"}
resource "alicloud_eip_address""enhance" {
  address_name ="terraform-palworld"  bandwidth    =100}
resource "alicloud_eip_association""enhance" {
  allocation_id = alicloud_eip_address.enhance.id
  instance_id   = alicloud_instance.enhance.id
}
output "ip_address" {
  value = alicloud_eip_address.enhance.ip_address
}
resource "alicloud_ecs_command""command" {
  name ="start-palworld"# base64 encode: nohup sudo bash /install.sh &  command_content ="bm9odXAgc3VkbyBiYXNoIC9pbnN0YWxsLnNoICY="  description     ="For Terraform Palworld"  type            ="RunShellScript"  working_dir     ="/root"}
resource "alicloud_ecs_invocation""run-command" {
  command_id  = alicloud_ecs_command.command.id
  instance_id = [alicloud_instance.enhance.id]
}

1.3. 一键启动 🚀

在命令行中执行 terraform apply -auto-approve,之后只需要等待半分钟左右,恭喜你拥有一个幻兽帕鲁的游戏私服器!命令行中最后一行输出了公网IP地址即服务端的地址:

在游戏客户端中将上一步骤中输出的IP地址填入:

点击连接后即可登陆到游戏中同好友一起愉快玩耍 ~

1.4. 一键释放 ♻️

在命令行中执行 terraform destroy,即可轻松、自动地销毁所有云上资源,不会有任何资源残留:

2. 实现过程

Terraform 是一个广泛使用的 IaC 工具,它允许开发者通过代码描述和管理基础设施资源,不同的 Provider 集成了不同云厂商的 OpenAPI 服务:

阿里云是 Hashicorp Terraform 的重要合作伙伴之一,目前阿里云的 Terraform Provider 已覆盖一百二十多款产品、七百多个资源类型,在覆盖度上已经基本涵盖了云产品的各类服务。本教程使用阿里云 Terraform Provider 进行游戏服务器的自动化部署。

2.1. 架构规划

作为一个简单的教学案例,本架构采用单地域单可用区部署(如图所示的右侧链路),在一个可用区中部署了ECS实例作为游戏服务器。该架构利用专有网络 VPC、交换机和安全组以及 EIP 等基础设施,实现了公网环境下的系统通信。如果考虑长期运营和持续发展,可以考虑基于CLB的负载均衡,随着业务压力变大增加计算资源(如图左侧所示)。

2.2. 代码实现

完成云上的基础设施架构规划后,即可到 阿里云 Terraform 文档中心 寻找需要资源类型使用文档。以 EIP 产品下的资源 alicloud_eip_association 为例,文档详细地给出了该资源类型属性说明和示例:

除了创建云上基础设施,我们还需要在创建出来的 ECS 实例中部署游戏服务程序以提供游戏服务。这里用到的游戏安装脚本如下:

#!/bin/bashsteam_user=steam
log_path=/tmp/pal_server.log
sudo useradd -m-s /bin/bash $steam_usersudo add-apt-repository multiverse -y > $log_pathsudo dpkg --add-architecture i386 >> $log_pathsudo apt update -y >> $log_pathsudo apt-get remove needrestart -y >> $log_pathecho steam steam/license note '' | sudo debconf-set-selections 
echo steam steam/question select "I AGREE" | sudo debconf-set-selections 
sudo apt install steamcmd -y >> $log_pathsudoecho"steam   ALL=(ALL:ALL) ALL" >> /etc/sudoers
sudoln-s /usr/games/steamcmd /usr/bin/steamcmd
steamcmd +quit
steam_user_path=/home/steam
steamcmd_path=$(which steamcmd)sudo-u$steam_usermkdir-p$steam_user_path/.steam/sdk64/ >> $log_pathsudo-u$steam_user$steamcmd_path+login anonymous +app_update 2394010 validate +quit >> $log_pathsudo-u$steam_usercp$steam_user_path/Steam/steamapps/common/PalServer/linux64/* $steam_user_path/.steam/sdk64/
sudo-u$steam_user nohup $steam_user_path/Steam/steamapps/common/PalServer/PalServer.sh >> $log_path

我们通过alicloud_instance 这一资源上 user_data 字段,将游戏服务的安装脚本进行 base64 编码导入到 ECS 实例中。然后通过 alicloud_ecs_commandalicloud_ecs_invocation 这两个资源类型,通过执行 nohup sudo bash /install.sh & 来启动安装脚本。

resource "alicloud_instance""enhance" {
  availability_zone = data.alicloud_zones.example.zones.0.id
  instance_name     ="terraform-palworld"  image_id          = data.alicloud_images.example.images.0.id
  instance_type     = data.alicloud_instance_types.enhance.instance_types.0.id
  security_groups   = [alicloud_security_group.example.id]
  vswitch_id        = alicloud_vswitch.example.id
# 这里定义了安装脚本,base64反编码即可取到脚本文件  user_data         ="IyEvYmluL2Jhc2gKY2F0Pmluc3RhbGwuc2g8PEVPRgojIS9iaW4vYmFzaApzdGVhbV91c2VyPXN0ZWFtCmxvZ19wYXRoPS90bXAvcGFsX3NlcnZlci5sb2cKc3VkbyB1c2VyYWRkIC1tIC1zIC9iaW4vYmFzaCBcJHN0ZWFtX3VzZXIKc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgbXVsdGl2ZXJzZSAteSA+IFwkbG9nX3BhdGgKc3VkbyBkcGtnIC0tYWRkLWFyY2hpdGVjdHVyZSBpMzg2ID4+IFwkbG9nX3BhdGgKc3VkbyBhcHQgdXBkYXRlIC15ID4+IFwkbG9nX3BhdGgKc3VkbyBhcHQtZ2V0IHJlbW92ZSBuZWVkcmVzdGFydCAteSA+PiBcJGxvZ19wYXRoCmVjaG8gc3RlYW0gc3RlYW0vbGljZW5zZSBub3RlICcnIHwgc3VkbyBkZWJjb25mLXNldC1zZWxlY3Rpb25zIAplY2hvIHN0ZWFtIHN0ZWFtL3F1ZXN0aW9uIHNlbGVjdCAiSSBBR1JFRSIgfCBzdWRvIGRlYmNvbmYtc2V0LXNlbGVjdGlvbnMgCnN1ZG8gYXB0IGluc3RhbGwgc3RlYW1jbWQgLXkgPj4gXCRsb2dfcGF0aApzdWRvIGVjaG8gInN0ZWFtICAgQUxMPShBTEw6QUxMKSBBTEwiID4+IC9ldGMvc3Vkb2VycwpzdWRvIGxuIC1zIC91c3IvZ2FtZXMvc3RlYW1jbWQgL3Vzci9iaW4vc3RlYW1jbWQKc3RlYW1jbWQgK3F1aXQKc3RlYW1fdXNlcl9wYXRoPS9ob21lL3N0ZWFtCnN0ZWFtY21kX3BhdGg9XCQod2hpY2ggc3RlYW1jbWQpCnN1ZG8gLXUgXCRzdGVhbV91c2VyIG1rZGlyIC1wIFwkc3RlYW1fdXNlcl9wYXRoLy5zdGVhbS9zZGs2NC8gPj4gXCRsb2dfcGF0aApzdWRvIC11IFwkc3RlYW1fdXNlciBcJHN0ZWFtY21kX3BhdGggK2xvZ2luIGFub255bW91cyArYXBwX3VwZGF0ZSAyMzk0MDEwIHZhbGlkYXRlICtxdWl0ID4+IFwkbG9nX3BhdGgKc3VkbyAtdSBcJHN0ZWFtX3VzZXIgY3AgXCRzdGVhbV91c2VyX3BhdGgvU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvbGludXg2NC8qIFwkc3RlYW1fdXNlcl9wYXRoLy5zdGVhbS9zZGs2NC8Kc3VkbyAtdSBcJHN0ZWFtX3VzZXIgbm9odXAgL2hvbWUvc3RlYW0vU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvUGFsU2VydmVyLnNoID4+IFwkbG9nX3BhdGgKRU9G"}
resource "alicloud_ecs_command""command" {
  name ="start-palworld"# 这里定义了启动命令,base64反编码为 nohup sudo bash /install.sh &  command_content ="bm9odXAgc3VkbyBiYXNoIC9pbnN0YWxsLnNoICY="  description     ="For Terraform Palworld"  type            ="RunShellScript"  working_dir     ="/root"}
resource "alicloud_ecs_invocation""run-command" {
  command_id  = alicloud_ecs_command.command.id
  instance_id = [alicloud_instance.enhance.id]
}

2.3. 镜像复用

通过上述的 Terraform 模板,我们可以快速在阿里云上创建出一台 ECS 实例,并且通过自动化的脚本安装好了幻兽帕鲁的游戏服务端。初次安装时会下载一系列的依赖软件程序,安装较为耗时,并且占用较大带宽资源。因此这里安装完成后,我们建议对进行该 ECS 实例进行镜像打包方便后续复用。这里我们同样可以通过 Terraform 来自动化构建这一个 ECS 镜像,仅需要五行即可创建出刚刚配置好的实镜像:

resource "alicloud_image""default" {
  instance_id       = alicloud_instance.default.id
  image_name        ="terraform-palworld"  description       ="terraform-palworld"}

之后,在同一账号下的在其它任意环境中即可通过 DataSource 查询的方式指定该镜像,不再需要执行游戏服务端的安装,可以直接复用镜像,真正做到秒级的一键启动。这种复用镜像的方式,游戏运营商可以做到高效、自动化地在分钟级别部署上百台游戏服务器

# 通过 name 的正则筛选找到打包的镜像data "alicloud_images""example" {
  name_regex ="^terraform-palworld$"}
# 创建新的实例resource "alicloud_instance""enhance" {
  availability_zone = data.alicloud_zones.example.zones.0.id
  instance_name     ="terraform-palworld"# 引用已打包出的镜像资源  image_id          = data.alicloud_images.example.images.0.id
  instance_type     = data.alicloud_instance_types.enhance.instance_types.0.id
  security_groups   = [alicloud_security_group.example.id]
  vswitch_id        = alicloud_vswitch.example.id
}
resource "alicloud_ecs_command""command" {
  name ="start-palworld"# nohup /home/steam/Steam/steamapps/common/PalServer/PalServer.sh &  command_content ="bm9odXAgL2hvbWUvc3RlYW0vU3RlYW0vc3RlYW1hcHBzL2NvbW1vbi9QYWxTZXJ2ZXIvUGFsU2VydmVyLnNoICY="  description     ="For Terraform Palworld"  type            ="RunShellScript"  working_dir     ="/root"}
resource "alicloud_ecs_invocation""run-command" {
  command_id  = alicloud_ecs_command.command.id
  instance_id = [alicloud_instance.enhance.id]
}

3. 简单小结

本文提供了一个使用 Terraform 在阿里云上部署幻兽帕鲁游戏服务器的解决方案,用户通过该方案可在分钟级别时间内即可完成服务部署。该方案仅作一个抛砖引玉的演示案例,目前基于 Terraform 对云上基础设施的管理方式,已经成为海内外客户的在面对瞬息万变的市场,加速应用迭代、提升用云管理水平的重要工具手段之一。有关于其它真实的客户案例,可以参阅我们的客户案例文档

4. 额外彩蛋

阿里云提供新用户免费试用服务器和网络资源,也许能免费搭建您的幻兽帕鲁服务器:

ECS免费资源申请:点击前往

网络免费资源申请:点击前往

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
数据采集 存储 缓存
如何设计一个网络爬虫?
网络爬虫也被称为机器人或蜘蛛,它被搜索引擎用于发现网络上的新内容或更新内容。内容可以是网页、图片、视频、PDF文件等。网络爬虫开始时会收集一些网页,然后跟随这些网页上的链接收集新的内容
|
5月前
|
监控 关系型数据库 MySQL
索引失效场景(阿里高频踩坑点)
MySQL索引可显著提升查询性能,但存在多种失效场景:数据类型不匹配、索引列使用函数、LIKE以%开头、复合索引未遵循最左前缀、OR条件中部分无索引、NULL值查询、频繁更新导致索引失衡、ORDER BY/GROUP BY未用索引列、配置或版本差异及过度依赖索引。阿里等大厂高频踩坑点需特别警惕。合理设计索引并结合执行计划优化,才能保障高效查询。(238字)
|
缓存 数据管理 Shell
鸿蒙5开发宝藏案例分享---性能分析简介
鸿蒙开发资源大揭秘!文中整理了HarmonyOS官方提供的100+场景化案例,涵盖性能优化、UI设计、设备适配等全链路内容。重点解析三大神级案例:折叠屏悬停交互、万人列表流畅滚动和服务卡片实时刷新,附带完整代码与避坑指南。通过精准搜索、代码移植和调试技巧,高效利用这些宝藏资源,助你省时省力避开开发陷阱。更有抖音级短视频流畅度优化方案等彩蛋等待探索!
|
7月前
|
JSON 缓存 API
淘宝天猫商品详情API秘籍!轻松获取SKU属性数据
淘宝商品详情API(taobao.item.get)可获取商品标题、价格、SKU、库存等全量信息,支持RESTful调用,返回JSON数据,适用于电商导购与竞品分析。需企业实名认证,申请权限后通过签名加密请求。Python示例展示如何调用接口,配合fields参数可优化性能,应对频率限制与数据延迟建议轮询+缓存策略。
|
Linux C语言
Linux读写锁源码分析
本文分析了读写锁的实现原理与应用场景,基于glibc 2.17源码。读写锁通过读引用计数、写线程ID、条件变量等实现,支持读优先(默认)和写优先模式。读优先时,写锁可能饥饿;写优先时,读线程需等待写锁释放。详细解析了`pthread_rwlock_t`数据结构及加解锁流程,并通过实验验证:2000个读线程与1个写线程测试下,读优先导致写锁饥饿,写优先则正常抢占锁。
407 19
|
JSON JavaScript 中间件
Koa框架下的RESTful API设计与实现
在现代 Web 开发中,构建高效、可维护的 API 是至关重要的。Koa 是一个流行的 Node.js Web 应用框架,它具有简洁、灵活和强大的特性,非常适合用于设计和实现 RESTful API。
|
人工智能
歌词结构的艺术:写歌词的技巧和方法深度剖析,妙笔生词AI智能写歌词软件
歌词是音乐的灵魂伴侣,其结构蕴含独特艺术魅力。掌握歌词结构技巧是创作者成功的关键。开头需迅速吸引听众,主体部分通过叙事、抒情或对话形式展开,结尾则点睛收尾。创作时可借助《妙笔生词智能写歌词软件》,利用 AI 功能优化歌词,提供丰富模板和案例,助力灵感涌现,轻松掌握歌词结构艺术。
|
Android开发 iOS开发 UED
探索iOS与安卓的用户体验设计差异
本篇文章深入探讨了iOS和安卓两大移动操作系统在用户体验设计上的核心差异。通过对比分析,揭示两个系统的设计哲学、交互模式以及视觉语言如何影响用户的感知和使用习惯。文章不仅聚焦于设计理念和技术实现,还关注用户反馈和市场趋势,以期为设计师提供跨平台设计的洞见。
|
前端开发 JavaScript .NET
【转】BarTender与ASP.NET的集成小结(条码标签打印编程)
话说自从上次发了篇NHibernate的资料后,好久没有写东西了,半年来一直在忙一个项目,做完项目后,发现很多东西虽然当时做了,懂了,但是很快就会模糊了,于是又再想起总结的重要性~~没啥地方好放资料的,放在博客园也是一个不错的选择~~   本人也是新手,写的不好的地方,请多原谅。
2993 0

热门文章

最新文章