轻松使用 Amazon EC2






4.94/5 (13投票s)
使用 Amazon EC2 在云中创建虚拟机
在云中创建虚拟机
如果您与 IT 行业有任何关联,那么我敢肯定您一定听说过帮助人类拯救世界的最新潮流:云计算。但这不仅仅是潮流。云计算是 IT 行业的一项重大变革,有潜力让您的业务运营更快、更智能、成本更低。
为避免混淆,以下是我对云计算的定义:
- 按需服务:服务必须随时随地按需可用。
- 自助服务:云服务用户必须管理自己的工作流程。如果需要某人填写冗长的表格、提交请求或恳求才能使服务正常运行,那就不是云计算。
- 细粒度:服务必须仅按使用量计费。在许多情况下,使用量按小时计费。
Amazon EC2 是市面上最成熟的云计算平台服务之一。本文将向您展示如何在云中创建 EC2 虚拟机并使用 RDP 连接到它们。代码是用 ASP.NET 编写的,旨在帮助那些最终希望编写自己的发行框架作为基于浏览器的解决方案的公司。
背景
Amazon EC2 是一个成熟的云计算平台。它允许您在云中配置自己的 Windows、Linux 或 Unix 虚拟机,使用费用低至 8 美分/小时。Amazon 服务还通过 SOAP API 公开,允许您从自己的 C# 应用程序创建和管理基础设施。
虽然 SOAP 接口相对容易使用,但我发现许多人仍然对其中涉及的基本概念感到困惑。人们最常见的问题是:
- 对私钥及其使用方法的困惑。
- 在检索登录 Windows 实例的密码时遇到的困难。
- 访问问题,几乎总是由于安全组配置错误。
- 在数据格式转换方面遇到的挑战,以便读取 Windows 密码并查看机器日志。
本文其余部分将讨论一个非常基础的包装器和 ASP.NET 应用程序,它们将帮助您通过浏览器启动自己的 Amazon EC2 虚拟机并通过 RDP 连接到它们。
Using the Code
在云中启动虚拟机的基础知识。
1. 验证您的连接
下载 Amazon SDK 并将其添加为项目引用。该 SDK 提供了一个包装器,将 SOAP 接口公开为一组 C# 方法调用。从 此处下载。
要使用 Amazon,您需要使用您的访问密钥和秘密访问密钥初始化 AmazonEC2
服务调用。这些参数有效地是您访问 Web 服务的用户名和密码。使用 此链接帮助您进行 EC2 注册和访问密钥设置。
// Initialize the service
AmazonEC2 service = new AmazonEC2Client(AWSAccessKey, AWSSecretAccessKey);
// Validate the service with a basic EC2 query
DescribeImagesRequest request = new DescribeImagesRequest();
request.WithOwner("self");
service.DescribeImages(request);
2. 配置访问规则
您启动的每台虚拟机都依赖于:
- 密钥对:这是一对您生成的公钥/私钥。公钥将由 Amazon 用于加密您的镜像和 Windows 密码,而私钥则由您用于解密 Windows 密码。这非常重要!如果您丢失了私钥,那么任何人也无法从云中恢复 EC2 实例的密码。
- 安全组:这些是您环境的防火墙访问规则。
以下是密钥对生成示例。请注意,它会返回一个包含您的私钥的 String
。如上所述,请勿丢失此值。
CreateKeyPairRequest request = new CreateKeyPairRequest();
request.KeyName = keyName;
CreateKeyPairResponse response = service.CreateKeyPair(request);
return response.CreateKeyPairResult.KeyPair.KeyMaterial;
3. 启动您的虚拟机
启动 EC2 实例非常简单。您需要您的密钥对、安全组和机器标识符。什么是机器标识符?Amazon 会为云中的每个可用镜像分配一个随机 ID。您可以在 此处搜索您感兴趣的镜像。
一旦您启动了一个实例,您就会收到一个实例标识符。此值可用于检索有关您的实例的未来信息,例如 DNS 地址和机器状态。
注意:您的实例可能需要相当长的时间才能完全可用。在启动过程中,虚拟机需要进行配置和重启,在这段时间内,您只能耐心等待...
RunInstancesRequest request = new RunInstancesRequest();
request.ImageId = ami;
request.MaxCount = 1;
request.MinCount = 1;
request.KeyName = keyName;
request.SecurityGroup = securityGroups;
request.InstanceType = type;
RunInstancesResponse response = service.RunInstances(request);
RunningInstance runningInstance =
response.RunInstancesResult.Reservation.RunningInstance[0];
4. 连接到您的实例
您可能会认为这是个简单的部分,但事实并非如此。
- 实例需要时间才能启动,在此期间信息非常有限。
- 您可以尝试使用
GetConsoleOutput
检索一些日志信息。您需要反复调用此方法,以确保您获得了最新的日志数据(或任何数据)。 - Windows 密码是加密的。在可用时,您需要使用
GetPasswordData
检索它,然后使用您之前生成的 PEM 私钥进行解密。
随附的代码还允许您使用动态生成的 RDP 文件连接到实例。
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.ContentType = "Content-Type=application/x-rdp rdp;charset=ISO-8859-1";
Response.AddHeader("Content-Length", content.Length.ToString());
Response.Write(content);
Response.End();
关注点
能够通过基本的浏览器界面生成虚拟机,对公司来说可以带来显著的好处。我工作的初创公司 CloudSlice.io 使用与上述类似的 C# 代码构建虚拟实验室管理环境。它们扩展了 Amazon EC2 环境,创建了一个自助服务、多用户且可共享的云环境。
历史
- 2010 年 8 月 12 日:初始发布