ROS CDK魔法书:建立你的游戏王国(Csharp篇)
引言
在虚拟游戏的世界里,数字化的乐趣如同流动的音符,谱写着无数玩家的共同回忆。而在这片充满创意与冒险的乐园中,您的使命就是将独特的游戏体验与丰富的技术知识相结合,打造出令人难以忘怀的作品。当面对如何实现这一宏伟蓝图时,您或许会想:如何将一款简单而富有趣味的游戏部署到云端,使更多玩家共享这份乐趣?
别担心,现在您手中握有一把开启无限可能的大门钥匙——阿里云资源编排服务(Resource Orchestration Service,简称ROS)的云开发套件(Cloud Development Kit,简称CDK)。借助这一强大的工具,您可以轻松创建和管理云资源,将您的2048小游戏安全、快速地部署到云端,以便让它在浩瀚的网络中闪耀光芒。
在接下来的文章中,我们将一起踏上这段旅程,通过将2048小游戏部属到阿里云的实例,让您借助ROS CDK的魔法,为您的梦想游戏搭建起一个坚实的云基础。无需复杂的配置,也不必担心繁琐的操作,我们将以最简单的方式,带您一步步揭开部署游戏的面纱,实现从本地到云端的无缝迁移。
背景
什么是ROS CDK?
想象一下,您是一位游戏设计师,面前有一个崭新的游戏世界等待您去构建。在传统的开发过程中,您可能需要逐步搭建每一个元素,反复测试和优化,这不仅费时费力,还需要应对大量的技术细节。然而,假设您拥有一本魔法书,只需一段简短的代码,就能轻松生成整个游戏的架构,这本魔法书便是阿里云资源编排服务(Resource Orchestration Service,简称ROS)的云开发套件(Cloud Development Kit,简称CDK)。
ROS CDK 是一个强大的开发框架,允许您使用熟悉的编程语言来定义、构建和部署云资源。通过ROS CDK,您能够将游戏基础设施转化为代码(Infrastructure as Code, IaC),就像编写游戏逻辑一样轻松创建和配置云资源。
借助这个框架,您无需再逐一配置每个组件,而是能够编写直观的代码描述游戏的整体结构。这些代码随后会被转换为具体的云资源配置,比如云服务器(ECS)、对象存储服务(OSS)以及数据库服务等,并快速在云端部署。这种简化的流程使得整个开发过程更加高效且可重复,帮助开发者轻松实现跨团队的协作与分享。
将基础设施代码化,不仅降低了人为错误的风险,还让云服务管理变得如同玩游戏般简单。ROS CDK 为快速开发、升级和扩展游戏应用提供了无与伦比的便利,使您能把更多的精力投入到创意和设计中,而不是被繁琐的操作所困扰。简而言之,ROS CDK 赋予您在云端构建游戏世界的无尽可能性,让您的创意得以在这片广阔的数字海洋中翱翔。
什么是ECS?
在这个广袤无垠的云霄之域,你是一名追寻智慧与力量的幻术师,渴望孕育出无数绚丽多彩的应用与服务。在这神秘的征途上,你需要一个强大的支持者,为你的创世之路提供源源不断的计算资源——这便是ECS(弹性计算服务)。
ECS宛如一座巍峨耸立的云端堡垒,拥有着无数灵活且可扩展的魔法隔间(实例),每一个隔间都蕴含着强大的运算能量,能够随心所欲地变幻组合,以适应你的任何需求。无论是轻巧的文字咒语(轻量级应用),还是巨大的虚拟巨兽(复杂计算任务),ECS都能迅速响应,助你一臂之力。
将你的应用部署在ECS上,仿佛为它们施下了一个永恒的召唤咒。不论是刮风下雨,亦或是雷霆万钧,ECS都将为你提供高度可靠的计算能力,确保每一个念头都能在瞬间化为现实,推动你的奇幻世界不断发展壮大。
如同天际星辰的引导者,ECS让你对计算资源进行灵巧的调配与管理。它的智能监控与弹性伸缩能力如同召唤的法术,让你在流动的需求中完全掌控,无需担忧资源的紧缺与浪费。而那些强大的安全护盾(网络隔离与访问控制)则守护着你的应用免受外敌的侵犯,确保你的魔法研究与创意成果在安全的环境中悄然绽放。
在阿里云这片充满灵气的领域,ECS已经成为每位幻术师实现创世梦想、探索无尽可能的最佳伙伴。无论你的梦想多么宏伟、挑战多么艰巨,ECS将始终是你可以倚靠的庇护所,让你在云端尽情释放智慧与创造力。因此,尊敬的幻术师,当你准备在云海中绘制你的未来蓝图时,ECS定会成为你不可或缺的助手,为你书写更辉煌的篇章。
准备工作
语言要求
在进入IaC魔法世界前,我们还需要一些准备工作。为了安装ROS CDK,请确保Node.js、TypeScript以及C#满足以下版本要求:
- Node.js:14.17.0及以上
- TypeScript:3.8及以上
- C#语言请确保本地存在.NET Core3.1版本,并且.NET SDK版本在5.0及以上
初始化工程项目
首先让我们获取魔杖(安装ROS CDK)。
注意:请确保你安装的 ros-cdk-cli 版本在 1.0.50 以上,可以通过运行 npm list -g
确认。
在你的魔法实践中,每当你打算开始一个全新的咒法项目,你都需要在你的魔法工作台(编程环境)上准备一些基础元素。就好比在开始一场远征前的准备过程,你需要确保你有一张图(项目框架),一些指南(配置)以及能够让你进出神秘地域(云平台)的通行证(凭证信息)。
初始化工程就好比是在你的魔法工作台上铺好一张干净的魔法制图纸,上面标注了将要完成的奇迹蓝图的基本轮廓。在你的电脑上,这就是创建一个包含必要文件结构的新目录,给魔法师们(开发者)提供了一个可以施展咒语(编码)的场所。
配置凭证信息则像是在你的魔法袍上缝上一枚能够开启云之城门的徽章,这枚徽章(AccessKey)凭证证明了你有权利指挥云中的能量流动,操纵存储在云中的宝藏。在阿里云的世界里,这意味着你需要在本地环境中配置好用于鉴权的AccessKey ID和Secret AccessKey。这样一来,当你使用ROS CDK这个强大的咒法工具时,它能够确保你是有权操控这些云资源的魔法师,而不是一个无意闯入的冒险者。
那么让我们在施展更高级魔法之前,先布置一下仪式现场。
- 执行以下命令,创建工程目录并初始化工程:
mkdir demo cd demo ros-cdk init --language=csharp --generate-only=true
- 执行以下命令,配置阿里云凭证信息:
ros-cdk config
- 根据界面提示输入配置信息:
endpoint(optional, default:https://ros.aliyuncs.com): defaultRegionId(optional, default:cn-hangzhou): [1] AK [2] StsToken [3] RamRoleArn [4] EcsRamRole [0] CANCEL Authenticate mode [1...4 / 0]: 1 accessKeyId:************************ accessKeySecret:****************************** ✅ Your cdk configuration has been saved successfully!
配置内容说明如下:
- endpoint:ROS服务地址。默认值为https://ros.aliyuncs.com。
- defaultRegionId:ROS资源栈部署的地域。默认值为cn-hangzhou。
- Authenticate mode:鉴权方式。本示例的鉴权方式为AccessKey,您需要输入AccessKey ID和AccessKey Secret。关于如何获取AccessKey,请参见交互式配置(快速配置)。
万事俱备,让我们开始ROS CDK魔法之旅。
最佳实践:云端部署2048小游戏
接下来,我们将通过一个最佳实践案例来演示如何在云端服务器部署2048小游戏。
进行如下步骤之前请确保你已完成所有必须的准备工作,包括环境配置和初始化项目工程。
安装依赖
首先,我们需要安装开发 CDK 项目时所需的依赖。
进入在「准备工作」中初始化的项目,并修改 src/Demo/Demo.csproj
文件内容如下(请根据你蹦迪的实际dotnet核心包版本修改):
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<!-- Roll forward to future major versions of the netcoreapp as needed -->
<RollForward>Major</RollForward>
</PropertyGroup>
<ItemGroup>
<!-- CDK Construct Library dependencies -->
<PackageReference Include="AlibabaCloud.SDK.ROS.CDK.Core" Version="1.1.0" />
<PackageReference Include="AlibabaCloud.SDK.ROS.CDK.Ecs" Version="1.1.0" />
<!-- jsii Roslyn analyzers (un-comment to obtain compile-time checks for missing required props
<PackageReference Include="Amazon.Jsii.Analyzers" Version="*" PrivateAssets="all" />
-->
</ItemGroup>
</Project>
添加资源
接着,我们要为项目中添加资源。本示例涉及到的资源有:
- ALIYUN::ECS::SecurityGroup
- ALIYUN::ECS::SecurityGroupIngress
- ALIYUN::ECS::Instance
- ALIYUN::ECS::VPC
- ALIYUN::ECS::VSwitch
- ALIYUN::ECS::RunCommand
本项目涉及到的收费项有:
- ECS按量付费
进入项目目录,并修改 src/Demo/DemoStack.cs
的内容如下:
using System.Collections.Generic;
using AlibabaCloud.SDK.ROS.CDK.Core;
using AlibabaCloud.SDK.ROS.CDK.Ecs;
namespace Demo
{
public class DemoStack : Stack
{
public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
{
// The code that defines your stack goes here
new RosInfo(this, RosInfo.Description, "Deploy 2048 game through ROS CDK.");
var zoneId = new RosParameter(this, "ZoneId", new RosParameterProps{
Type = RosParameterType.STRING
});
var vpc = new Vpc(this, "Vpc", new VPCProps{
CidrBlock = "192.168.0.0/16"
});
var sg = new SecurityGroup(this, "SecurityGroup", new SecurityGroupProps{
VpcId = vpc.Ref
});
var vsw = new VSwitch(this, "VSwitch", new VSwitchProps{
CidrBlock = "192.168.0.0/24",
ZoneId = zoneId.Value,
VpcId = vpc.Ref
});
var instance = new Instance(this, "Instance", new InstanceProps{
VpcId = vpc.Ref,
VSwitchId = vsw.Ref,
SecurityGroupId = sg.Ref,
ZoneId = zoneId.Value,
InstanceType = "ecs.c6e.large",
ImageId = "centos_7_8",
SystemDiskCategory = "cloud_essd",
IoOptimized = "optimized"
});
var sgIngress = new SecurityGroupIngress(this, "SecurityGroupIngress", new SecurityGroupIngressProps{
IpProtocol = "tcp",
PortRange = "80/80",
SourceCidrIp = "0.0.0.0/0",
SecurityGroupId = sg.Ref,
NicType = "intranet"
});
var runCommand = new RunCommand(this, "RunCommand", new RunCommandProps{
InstanceIds = new IResolvable[] { instance.AttrInstanceId },
CommandContent = "yum install -y httpd wget\nsystemctl start httpd\nwget 'https://computenest-artifacts-cn-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/1853370294850618/cn-beijing/1697533575326/2048.tgz' -O 2048.tgz\ntar xvf 2048.tgz\nmv 2048/* /var/www/html && rm -rf 2048",
Type = "RunShellScript",
Timeout = 3600,
Sync = true
});
runCommand.AddDependency(sgIngress);
new RosOutput(this, "Url", new RosOutputProps{
Value = "http://" + instance.AttrPublicIp.ToString() + ":80"
});
}
}
}
部署资源栈
执行以下命令以部署资源栈:
ros-cdk deploy --parameters ZoneId=cn-hangzhou-i --sync=true
--sync=true
会将资源栈信息同步返回至终端显示。成功后,命令行终端返回如下信息:
Create bucket(cdk-tcbgaxxxx-assets-cn-hangzhou) successfully!
Upload file(./cdk.out/DemoStack.template.json) to bucket(cdk-tcbgaxxxx-assets-cn-hangzhou) successfully!
DemoStack: deploying...
|DemoStack |2024-09-09T08:56:47 | CREATE_COMPLETE | ALIYUN::ECS::SecurityGroup | sg-bp121z2wd687mdxxxxxx | SecurityGroup
|DemoStack |2024-09-09T08:56:47 | CREATE_COMPLETE | ALIYUN::ECS::SecurityGroupIngress | sg-bp121z2wd687mdxxxxxx | SecurityGroupIngress
|DemoStack |2024-09-09T08:56:47 | CREATE_COMPLETE | ALIYUN::ECS::Instance | i-bp16t9mt9b0uscixxxxx | Instance
|DemoStack |2024-09-09T08:56:47 | CREATE_COMPLETE | ALIYUN::ECS::VPC | vpc-bp10y18ke2x6v0bjxxxxx | Vpc
|DemoStack |2024-09-09T08:56:47 | CREATE_COMPLETE | ALIYUN::ECS::VSwitch | vsw-bp1qfb9u90cuyu69xxxxx | VSwitch
|DemoStack |2024-09-09T08:56:47 | CREATE_COMPLETE | ALIYUN::ECS::RunCommand | t-hz04w6ckiuxxxxx | RunCommand
Outputs:
Key: Url Value: http://121.40.xxx.xx:80 Description: No description given
✅ The deployment(sync create stack) has completed!
Status: CREATE_COMPLETE
StatusReason: Stack CREATE completed successfully
StackId: 40c92773-33fb-4249-bd46-3ab6xxxxxxxx
等待部署完成后,复制Outputs中的链接并在浏览器中打开,即可畅玩2048!
删除资源栈
执行以下命令以删除资源栈:
ros-cdk destroy --sync=true
CDK 会二次确认即将删除的资源栈:
The following stack(s) will be destroyed(Only deployed stacks will be displayed).
DemoStack
Please confirm.(Y/N)
输入 y
并回车,删除成功会显示如下信息:
✅ The task(sync destroy stack) has finished!
status: DELETE_COMPLETE
StatusReason: Stack DELETE completed successfully
StackId: 40c92773-33fb-4249-bd46-3ab6xxxxxxxx