WEB开发网
开发学院服务器云计算 用 Amazon Web Services 进行云计算,第 3 部分: ... 阅读

用 Amazon Web Services 进行云计算,第 3 部分: 用 EC2 根据需要提供服务器

 2009-11-05 00:00:00 来源:WEB开发网   
核心提示:Amazon EC2Amazon Elastic Compute Cloud (EC2) 是 Amazon 提供的云计算环境的基本平台,通过使用 EC2,用 Amazon Web Services 进行云计算,第 3 部分: 用 EC2 根据需要提供服务器,可以在任何时候根据个人或企业的需要简便地创建、启动和供应虚拟实

Amazon EC2

Amazon Elastic Compute Cloud (EC2) 是 Amazon 提供的云计算环境的基本平台。通过使用 EC2,可以在任何时候根据个人或企业的需要简便地创建、启动和供应虚拟实例。根据实例的类型和每小时的实际使用量付费。虚拟服务器在 Amazon 数据中心的安全环境中运行。

EC2 可以为 Web 范围的应用程序提供以下功能:

动态地配置计算需求。

根据需要调整计算能力。

在当今这个 Web 驱动的环境中,网站通信量可能一下冲到高峰(比如因为 Yahoo 主页上提到了您的网站),一小时后又落入谷底。现在,可以以弹性的方式快速地提高和降低计算能力。这个新的弹性计算模型提供一些非常有价值的特性:

可靠性EC2 能够轻松地供应实例并在不再需要实例时销毁它们。 简单性EC2 基于简单的概念,为系统设计提供很强的灵活性。Amazon 提供所需的所有构建块;可以根据自己应用程序的用例组合它们。安全性EC2 提供很高的安全水平。所有实例都在 Amazon 的数据中心中运行,还可以通过配置防火墙规则把访问限制在您信任的组。灵活性可以把实例放在不同的地理位置,使用生命周期独立于实例的持久存储卷,从而增强应用程序的灵活性。低成本EC2 服务以非常低廉的费率满足您的所有服务器需求。

框架

本节介绍支撑 EC2 框架的概念。

Amazon Machine Images

Amazon Machine Image (AMI) 是基于 Linux® 的打包的服务器环境,可以运行您需要的任何软件或应用程序。它们是 EC2 提供的弹性计算环境的核心。当前的 EC2 版本支持基于 Linux 的 AMI,但是也初步支持使用 OpenSolaris 作为 EC2 环境中的操作系统:

有三种机器映像:

私有的您创建的映像,在默认情况下是私有的。可以授权其他用户启动您的私有映像。
公共的用户创建并发布到 Amazon Web Services 社区的映像,任何用户都可以基于它们启动实例,按照自己喜欢的方式使用它们。Amazon Web Services Developer Connection 网站列出所有公共映像。
付费的可以创建提供特殊功能的映像,其他用户可以启动它们,但是要按照使用时间向您付费。

Amazon 提供几个命令行工具,可以使用它们方便地创建和管理映像。映像本身存储在 Amazon Simple Storage Service (S3) 上。在向 EC2 注册映像时,给映像分配一个惟一的 ID,可以使用这个 ID 识别映像和从映像启动实例。有几种创建自己的映像的方法。可以以一个现有的公共映像为基础,按照以下步骤创建新的 AMI:

用自己的 SSH 密钥对从现有的 AMI 启动一个实例。

通过 SSH 连接实例。

根据自己的希望定制实例。

使用 Amazon 的工具把正在运行的实例重新打包为新的 AMI。

使用 Amazon 的工具把这个映像上传到 S3。

使用 Amazon 的工具向 EC2 注册这个新的映像。

从这个新的映像启动一个新实例,重新定制和重新打包,直到满意为止。

另一种方法是使用 EC2 社区提供的脚本之一创建新的 AMI。可以使用脚本从头创建 AMI。流行的脚本包括:

Eric Hammond 提供的基于 Ubuntu 和 Debian 的 AMI 创建脚本。可以使用他的网站上提供的预构建映像,也可以使用脚本从头创建映像。

如果需要能够运行 Ruby on Rails 应用程序的映像,可以使用 Paul Dowman 提供的脚本创建基于 Ubuntu 的映像,这种映像可以在 EC2 上运行 Rails 应用程序。

RightScale 提供基于 Ubuntu 和 CentOS 脚本,可以使用它们从头创建自己的映像。

实例

实例 是使用 AMI 作为模板的正在运行的虚拟实例。可以使用 Amazon 提供的工具启动实例、查看实例的详细信息和终止实例。还可以使用用不同语言编写的许多第三方库控制实例的生命周期。

实例可以基于 32 位或 64 位平台,可以是以下类型之一。Amazon 还用 EC2 计算单位确定每个实例类型的级别。每个 EC2 计算单位 (ECU) 相当于一个 1.0-1.2 GHz 2007 Opteron 或 2007 Intel® Xeon™ 处理器的处理能力。

小实例 (m1.small)1.7 GB 内存,一个 EC2 计算单位(一个虚拟核,一个 EC2 计算单位),160 GB 实例存储,32 位平台,中等 I/O 性能大实例 (m1.large) 7.5 GB 内存,四个 EC2 计算单位(两个虚拟核,每个核两个 EC2 计算单位),850 GB 实例存储,64 位平台,高 I/O 性能超大实例 (m1.xlarge)15 GB 内存,八个 EC2 计算单位(四个虚拟核,每个核两个 EC2 计算单位),1,690 GB 实例存储,64 位平台,高 I/O 性能中等实例 (c1.medium) 1.7 GB 内存,五个 EC2 计算单位(两个虚拟核,每个核 2.5 个 EC2 计算单位),350 GB 实例存储,32 位平台,中等 I/O 性能超大实例 (c1.xlarge)7 GB 内存,20 个 EC2 计算单位(八个虚拟核,每个核 2.5 个 EC2 计算单位),1,690 GB 实例存储,64 位平台,高 I/O 性能

因为根据使用实例的实际时间付费,所以很容易根据应用程序当前的负载提高或降低计算需求。不需要提前保留大量计算能力。

安全组

在 EC2 环境中启动的所有实例都在一个安全组中运行。每个安全组定义自己的防火墙规则,为在组中运行的实例指定访问限制。可以根据 IP 地址或无类域间路由 (CIDR) 规则授予或限制访问权,CIDR 规则允许指定端口范围和传输协议。还可以控制对指定的安全组的访问,从而自动地允许或拒绝这些安全组中运行的所有实例访问您的实例。

安全密钥对

安全密钥对是在启动实例时指定的公共/私有 SSH 密钥对。必须提供安全密钥对,才能登录启动的实例的控制台。EC2 把密钥对的公共部分添加到启动的实例中,然后用户可以使用私有密钥通过 ssh 登录实例。

安全密钥对不同于 Amazon Web Services 访问键 ID 和安全密钥;后者可以从 account information page 上获得,用于在使用 API 向 Amazon Web Services 发出请求时惟一地识别用户。安全密钥对主要用于让用户能够安全地登录实例,而不需要使用密码。

可用区(Availability zones)

EC2 由位于不同地理位置的多个数据中心组成,这有助于应对故障。可以把自己启动的实例放在不同的位置。位置是地理区域,其中包含可用区。当前的 EC2 版本允许访问美国东部的一个区域,其中有三个可用区。Amazon 对一个区域中的每个可用区采取隔离措施,从而避免一个可用区中的故障影响其他可用区。

通过在不同的可用区中启动实例,可以避免应用程序受到在单一位置发生的故障的影响。如果在启动实例时没有指定可用区,Amazon 会根据当前的系统健康状态和能力自动选择可用区。

弹性 IP 地址

在 EC2 启动实例时,自动地为每个实例分配一个私有 IP 地址和一个公共 IP 地址。当然,可以使用公共 IP 地址通过 Internet 访问实例。但是,在每次启动实例时,这个地址都会变。如果使用某种动态 DNS 映射把 DNS 名称连接到 IP 地址,那么把变化传播到整个 Internet 花费的时间可能长达 24 小时。为了解决这个问题,EC2 引入了弹性 IP 地址的概念。弹性 IP 地址是与您的 EC2 账户相关联的静态 IP 地址,而不是与实例相关联;除非显式地把它释放回 EC2,它会一直与您的账户相关联。

还可以在实例之间重新映射弹性 IP 地址。因此,在任何实例出现故障时,只需启动另一个实例并重新映射它(或使用现有的实例),从而快速响应实例故障。在任何时候,只能有一个实例映射到弹性 IP 地址。

Elastic Block Store (EBS)

EBS 是 Amazon 创建的新型持久存储,可以用它创建卷,然后把卷作为块级设备连接到正在运行的一个实例。还可以从这些卷创建快照,以后可以从快照重新创建卷。每个快照代表一个卷在一个特定时间点的状态。一些文件和数据需要超过实例寿命的长期持久化;可以把它们存储在 EBS 卷上,然后可以把卷连接或重新连接到任何实例。

注意,在任何时候每个 EBS 卷只能连接到一个实例。但是,一个实例可以同时连接任意数量的卷。每个 EBS 卷位于一个可用区中。卷连接的实例必须在同一个可用区中。一个账户只能有最多 20 个 EBS 卷,但是如果需要使用更多的卷,可以 请求 Amazon Web Services 提高限额。

EC2 入门

要想开始使用 EC2,首先需要创建一个 Amazon Web Services 账户。本系列的 第 2 部分 详细介绍了如何创建 Amazon Web Services 账户。创建账户之后,必须按照以下步骤为账户启用 Amazon EC2 服务:

登录 Amazon Web Services 账户。

导航到 Amazon EC2。

选择页面右边的 Sign Up For This Web Service。

提供必需的信息并完成注册过程。

与任何 Amazon Web Services 的所有通信都要通过 SOAP 接口或查询/REST 接口。在本文中,将使用查询/REST 接口与 EC2 通信。需要获得自己的访问键,可以通过在 Web Services Account information 页面上选择 View Access Key Identifiers 获得访问键。

现在设置了 Amazon Web Services 并为账户启用了 EC2 服务。

与 EC2 交互

对于这个示例,我们使用 Amazon 提供的命令行工具和第三方开放源码 Ruby 库 right_aws 与 EC2 交互。在本文中,我们要:

设置本地 EC2 开发环境。

启动一个现有的 AMI。

定制 AMI 以安装 right_aws 库和所需的其他软件。

重新打包 AMI,把 AMI 上传给 S3,然后注册它。

启动新的定制 AMI。

通过在 Ruby shell 中运行代码片段熟悉 right_aws API。

设置本地 EC2 开发环境

Amazon EC2 工具需要 Java™ 技术,所以要安装 Java。

下载 Amazon EC2 AMI Tools 和 Amazon EC2 API Tools。

把工具存档文件解压到您选择的目录中。

需要设置一些环境变量并把工具目录添加到 shell 路径中,这样就可以在执行命令行命令时找到它们。清单 1 给出一个示例。

下面的命令针对 Linux。如果您使用 Microsoft® Windows®,可以改用等效的命令。可以从 account information page 下载 EC2 X.509 证书和 EC2 私有密钥文件。



清单 1. 设置 EC2 开发环境
$ export EC2_HOME=path_to_the_directory_with_the_tools 
 
$ export JAVA_HOME=path_to_the_directory_with_your_java_sdk 
 
# Add the directory to your PATH 
$ export PATH=$PATH:$EC2_HOME/bin 
 
# Export variables with the paths to your private key file and X.509 certificate 
$ export EC2_PRIVATE_KEY=path_to_your_private_key 
$ export EC2_CERT=path_to_your_x509_certificate 

运行以下命令列出 EC2 命令行工具的版本,从而确认所有设置都是正确的。

清单 2. 检查设置
$ ec2-ami-tools-version 
1.3-20041 20071010 

需要创建在命令行 shell 中启动和连接实例所需的 SSH 密钥对。清单 3 中的命令创建一个新的密钥对,然后在屏幕上显示密钥对的名称、它的指纹和私有密钥数据。

清单 3. 创建新的 SSH 密钥对
$ ec2-add-keypair devworks 
 
KEYPAIR devworks    29:d1:90:7b:3d:a4:99:52:41:e0:1f:21:d5:20:97:d3:f0:33:fd:76 
-----BEGIN RSA PRIVATE KEY----- 
MIIEowIBAAKCAQEAyxaeXt6nb+qzboVW/3ax7An8CUJjDqwNi/PZm4lGOAzOHGnuPlDXeh1GpJ9f 
hky7Bg6VEY2VfS5G6UtmIzsGf/JlquzVl/x3uyriOzeCIw+m07aSgUOBn3qW/74IZxYYkxCYdBci 
eZeKpr8Mpvuz2sfurRzQOkUeHyuEaiD1RRS7DGxxUXfpVYhGjPltfNW2xRSMLTaOZzRwRdS0cHUU 
hC+GOKFDkp8nqQpd8iGUtp2G2DI1pxRN4MbeFZHWMh5tcIo1NTc7pkFPGEwrq6pO6gIsEOLqGpTL 
+2AxJY5WToZQoTWieOVwLpjJU9fnufRs0Mt/M/TP6SGK/YkrQOprOwIDAQABAoIBAFj1UGvX9dnl 
IbHAwInoUSlGelsH9GIB5XEvYFtr9xEoMsRpdk1flfNMjZwgn3Qxeh6+Fnf438lUkwUv3M6D1WYI 
JJaJZUpM8ZlPwIcV2nBHM9k6+NOcYVQdG7VsZTvahusscssvMw+13KsLtpwSVwb3WsoDfAZ6LiaT 
Jk5in20hTiipC0pz0K9DgQ//76r20ysUFpCymj4EvQrRkk5kBtsiMixsJzimpUOrSmrRHcORKEin 
FKM6y/DFE33zhP8BNDQRaDLGni0Ip+/jP3EHmia41SSbnwzRcbXMfH5fL3KAyRsCE0ocHY+cjUng 
HPYxl1ffdLZuEW3wJDQFuTS/v4ECgYEA9r7HVVnrS2303zclzCTGen/W/SVbpflSKEYJOZpa8RtQ 
uFMOewfkTbBzfavLMVBYB8uAmcWIz5JAFSzlBaKDRCnouUeeDiDJVJd8Asbn1gCE8UVETUOthy50 
R90RTtPNMmyP7AnoSMTuzsbwVORus7IJvceWHQBB4KCh652UansCgYEA0rSmvdquidkXf5iFpebc 
6Wh/qy+L1dkgz7+HTZIMW7kxA4EfJFnqaQRPqJ5XYcLvk2IzxNQKJlZvtBhCfVYhPJ2uB2Yqxv0p 
0LXGC01fZSyhbYGfaxVymA3HMc2ULBbaFMyhO7l7zkz+G+qkylych59zJBSoUxSFStpgNL7NhkEC 
gYAPJIorLMeJ64eZo1LIgoFDx1C0XHSRbQmjuxiZ1mU6YsjDZyV+W2+hbPDJh5+CuUGNyOlthnfs 
9TbFlenAPMb9iezkYgbLKyvv6xQLP5W+xm1iOTQF4d9mam1sc566TblMHOmAPONqg9t8CS16qEI6 
+PQsF3GY+gkQ9gq54QPYvQKBgDgwjsrQd30xVI/lV7a/Uyg3gtxe6JaVuadNN0LbcMpBH64EkA58 
oANzb97SoxDiEEuog4+40CAbKtzHH2wXPPPSROeaOkwolS8gWnkHICp19XKjf6Tp6k5cVkOUxC/h 
xDSJwXGQ7FA+vgEp2NpSSjfssKLtk1ncfhNRGxjVzS9BAoGBALbBLS4Nbjs2Fco+okNQPNfJNSvW 
yWV7a6ngfRzW8B+BO6V1QRIR44bwv/Z74oQ7ttt8KoZENB5yzZwaVWpFlOjSO/4Nx++Ef4pY5aPS 
zNpXcXCZgUdA67qmOILvrG7bnDR60dcBZVBl7CjnpTlccg7MD4CBsFJx+hGRPD2yIV94 
-----END RSA PRIVATE KEY----- 

把输出中从 -----BEGIN RSA PRIVATE KEY----- 开始的部分保存到一个本地文件中。这就是启动实例和用 SSH 访问实例所用的私有密钥。一定要保证这个文件不被泄露,不丢失。如果使用这个密钥启动一个实例,以后丢失了密钥,就无法再使用 shell 连接它。把密钥文件命名为 pk-devworks,修改文件的权限以提高安全性。

清单 4. 修改私有密钥文件的权限
$ chmod 600 pk-devworks 

现在,开发环境已经设置好了。

启动第一个实例

现在,从 RightScale 提供的一个基于 CentOS 的公共映像启动第一个实例。这个映像的 AMI ID 是 ami-d8a347b1。


清单 5. 启动实例
$ ec2-run-instances –k devworks -n 1 ami-d8a347b1 
 
RESERVATION   r-2691404f   710193521658  default 
INSTANCE    i-7f923516   ami-d8a347b1          pending 
devworks    0        m1.small    2008-09-07T18:05:34+0000 
us-east-1c   aki-9b00e5f2 

刚启动的实例总是处于 pending 状态。因为这个实例仍然处于启动过程中,所以还不能访问它。在这种状态下,可以查看这个实例的相关信息:

启动时间 — 以 UTC 形式显示的实例启动时间。

实例类型 — 在启动时没有指定实例类型,所以 EC2 自动选择默认的 m1.small 实例。

可用区 — 在启动时没有指定可用区,所以 EC2 根据当前的系统健康状态和可用性选择一个可用区。

内核 — 还显示这个实例使用的 Linux 内核。可以在启动时指定内核,也可以为 AMI 预先配置默认内核。

安全组 — 这个实例放在 default 安全组中。可以创建安全组,向它们授予访问权限,把实例放在这些组中。必须在启动时指定安全组。实例启动之后,就无法改变组名,但是可以改变授予组的权限。

现在,可以列出正在运行的实例,检查它们当前的状态。


清单 6. 列出实例
$ ec2-describe-instances 
 
RESERVATION   r-2691404f   710193521658  default 
INSTANCE    i-7f923516   ami-d8a347b1  ec2-67-202-28-68.compute-1.amazonaws.com 
domU-12-31-38-00-34-C8.compute-1.internal    running devworks    0 
m1.small  2008-09-07T18:05:34+0000    us-east-1c   aki-9b00e5f 

可以看到实例正在运行,还可以看到关于实例的更多信息,比如:

公共 DNS 名称 — 可以使用这个 DNS 名称通过 Internet 连接这个实例。

私有 DNS 名称 — 这个 DNS 名称用于在 Amazon 数据中心环境中的 EC2 本地网络中解析这个实例。

使用 SSH 连接第一个实例

现在可以使用 SSH 连接实例,这需要使用私有密钥和实例的公共 DNS 名称。


清单 7. 使用 SSH 连接实例
$ ssh -i pk-devworks root@ec2-67-202-28-68.compute-1.amazonaws.com 
 
The authenticity of host 'ec2-67-202-28-68.compute-1.amazonaws.com (10.252.59.54)' 
can't be established. 
RSA key fingerprint is ae:e5:00:54:75:65:1c:c5:44:53:72:b9:e0:b5:26:a9. 
Are you sure you want to continue connecting (yes/no)? yes 
 
Warning: Permanently added 'ec2-67-202-28-68.compute-1.amazonaws.com,10.252.59.54' 
(RSA) to the 
list of known hosts. 
 
 
[root@domU-12-31-38-00-34-C8:~] 

在登录之后,可能会看到一条错误消息,但是可以不理会它。这个 AMI 在启动之后要运行一些定制的 RightScale 脚本,但是没有找到它们。

定制实例和重新打包

RightScale AMI 非常全面,包含基本映像所需的所有内容。它已经包含安装在 /home/ec2 目录中的 EC2 命令行工具。

添加安全证书。使用 清单 1 中使用的文件。

清单 8. 把证书复制到实例中
$ scp -i pk-devworks path_to_your_private_key_cert 
root@ec2-67-202-28-68.compute-1.amazonaws.com:/home/ec2/ 
 
$ scp -i pk-devworks path_to_your_x509_cert 
root@ec2-67-202-28-68.compute-1.amazonaws.com:/home/ec2/ 

设置环境变量,从而使用它作为自己私有的 EC2 映像。编辑 /etc/profile.d/env.sh 文件并设置每个变量。账号和访问键可以从 Web services account information 页面获得,证书和私有密钥是前一步中复制到实例的文件。

清单 9. 定制实例环境
$ vim /etc/profile.d/env.sh 
 
export EC2_HOME=/home/ec2 
export EC2_CERT= 
export EC2_PRIVATE_KEY= 
export AWS_ACCOUNT_NUMBER= 
export AWS_ACCESS_KEY_ID= 
export AWS_SECRET_ACCESS_KEY= 
export PATH=$PATH:/home/ec2/bin/ 
 
# Turn off the rightscripts so you don’t get the error on login. 
$ chkconfig --level 4 rightscale off 
 
# Change the login message 
$ echo “Welcome to my devworks test EC2 image” > /etc/motd 

这个映像已经安装了 Ruby,但是需要安装本文后面与 EC2 交互时要使用的 Ruby 库。首先,更新安装的 gems,然后安装 right_aws gems 和所需的所有依赖项。

清单 10. 安装 Ruby gems
$ gem update 
$ gem install right_aws 

现在可以重新打包这个实例,把它上传给 S3,向 EC2 注册它。首先,用名称 devworks-ec2 重新打包它,忽略 /mnt 和 /tmp 文件夹。还必须指定 EC2 私有密钥、EC2 安全证书和 Amazon Web Services 账号。

清单 11. 重新打包实例
$ ec2-bundle-vol -d /mnt -c /home/ec2/your_ec2_x509_cert  
-k /home/ec2/your_ec2_private_key -u your_aws_account_number 
-e /mnt,/tmp -s 10240 -r i386 -p devworks-ec2 

重新打包过程将在 /mnt 目录中创建一批文件。把这些文件上传到 S3,它们组成新创建的 AMI。映像将放在您指定的 bucket 中。把以下命令中的 –b 参数替换为您希望存储映像文件的 bucket 的名称。

清单 12. 把映像上传到 S3
$ ec2-upload-bundle -b your_s3_bucket -m /mnt/devworks-ec2.manifest.xml 
-a your_aws_access_key -s your_aws_secret_key 

您的 AMI 现在存储在 S3 中了。然后需要向 EC2 注册它,从而获得 AMI 的 ID,以后可以使用这个 ID 启动映像。

清单 13. 向 EC2 注册映像
$ ec2-register -K /home/ec2/your_ec2_private_key 
-C /home/ec2/your_ec2_x509_cert your_s3_bucket/devworks-ec2.manifest.xml 
 
IMAGE  ami-58c42031 

退出 SSH 会话,终止正在运行的实例。

清单 14. 终止实例
$ ec2-terminate-instances i-7f923516 
INSTANCE    i-7f923516   running shutting-down 

在下一节中,将从刚创建的 AMI 启动一个新实例,本文后面使用这个实例和 right_aws 库体验 EC2。

用 Ruby 体验 EC2

RightScale 提供一个 Ruby 库 right_aws,可以使用它从 Ruby 访问 Amazon 的 EC2 服务。他们自己的产品也使用这个经过充分测试的库,这个库覆盖 EC2 的所有方面,包括最近引入的 EBS。这个库和 HTTP 库 RightScale:HttpConnection 一起打包为一个 rubygem,具有健壮的重试和错误处理功能。本文只涉及这个库提供的一部分 EC2 功能。强烈建议您阅读库提供的文档,全面了解这个 API。您应该研究 right_aws 库和支持库 right_http_connection 的各个配置选项。

我们将使用 Rightscale::Ec2 类,它提供与 EC2 交互的主要接口。使用这个 Ruby 库的中介是 irb 控制台。把消息发送给 Rightscale::Ec2 对象,然后查看 EC2 返回的响应消息。这有助于熟悉 API 和体验 EC2 概念。

从新的 AMI 启动一个实例。实例处于运行状态之后,使用 SSH 连接实例。然后,开始在这个实例中使用 irb 控制台。

清单 15. 启动新实例并使用 SSH 连接它
$ ec2-run-instances -k devworks -n 1 ami-58c42031 
 
RESERVATION   r-5795443e   710193521658  default 
INSTANCE    i-1a9e3973   ami-58c42031          pending devworks  0 
m1.small    2008-09-07T21:06:37+0000    us-east-1c   aki-9b00e5f2 
 
$ ec2-describe-instances 
 
RESERVATION   r-949544fd   710193521658  default 
INSTANCE    i-5a9d3a33   ami-58c42031   
ec2-75-101-208-95.compute-1.amazonaws.com    
domU-12-31-38-00-78-04.compute-1.internal    
running devworks    0        m1.small  
2008-09-07T21:14:27+0000    us-east-1c   aki-9b00e5f2 
 
$ ssh -i pk-devworks root@ec2-75-101-208-95.compute-1.amazonaws.com 

启动 Ruby shell 并创建一个 Rightscale::Ec2 对象。

清单 16. 启动 Ruby shell 并创建新的 Rightscale::Ec2 对象
$ irb 
irb(main):001:0> require 'rubygems' 
=> true 
irb(main):002:0> require 'right_aws' 
=> true 
irb(main):003:0> @ec2 = Rightscale::Ec2.new( 
ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']) 

在此之后,使用刚创建的变量 @ec2 体验 EC2。这个示例使用库的默认配置。可用配置选项的列表见文档。

获取实例的列表,这会返回一组散列,提供每个实例的相关信息。这个库的几乎所有 API 调用都产生这种格式的响应。清单 17 给出一个示例。

清单 17. 描述实例
irb(main):004:0> @ec2.describe_instances() 
 
=> [{:aws_launch_time=>"2008-09-07T21:14:27.000Z", :aws_kernel_id=>"aki-9b00e5f2", 
:ssh_key_name=>"devworks", :aws_reservation_id=>"r-949544fd", 
:aws_availability_zone=>"us-east-1c", 
:aws_state=>"running", :aws_instance_id=>"i-5a9d3a33", :aws_groups=>["default"], 
:aws_image_id=>"ami-58c42031", 
:aws_product_codes=>[], :dns_name=>"ec2-75-101-208-95.compute-1.amazonaws.com", 
:aws_state_code=>"16", 
:private_dns_name=>"domU-12-31-38-00-78-04.compute-1.internal", 
:aws_instance_type=>"m1.small", 
:aws_reason=>"", :ami_launch_index=>"0"}] 

获取映像的列表。

清单 18. 描述映像
irb(main):005:0> @ec2.describe_images_by_owner([ENV['AWS_ACCOUNT_NUMBER']]) 
 
=> [{:aws_location=>"ylastic_images/devworks-ec2.manifest.xml", 
 :aws_kernel_id=>"aki-9b00e5f2", :aws_state=>"available", :aws_is_public=>false, 
:aws_architecture=>"i386", :aws_id=>"ami-58c42031", :aws_image_type=>"machine"}] 

创建一个安全组,可以使用它放置实例和限制或授予访问权。

清单 19. 创建一个新的安全组并列出组
irb(main):006:0> @ec2.create_security_group("devworks", 
  "Devworks Article Security Group") 
 
=> true 
 
irb(main):008:0> @ec2.describe_security_groups() 
 
=> [{:aws_group_name=>"devworks", :aws_description=>"Devworks Article Security 
  Group", 
:aws_perms=>[]}] 

创建一个新的安全密钥对并列出账户中的所有密钥对。

清单 20. 创建新的安全密钥对并列出密钥对
irb(main):018:0> @ec2.create_key_pair('mykeypair') 
 
=> {:aws_key_name=>"mykeypair", 
:aws_fingerprint=>"c6:62:22:9e:99:05:6a:17:13:06:e0:86:f9:55:2a:78:ff:99:6b:fa", 
 
:aws_material=>"-----BEGIN RSA PRIVATE KEY----- 
\nMIIEpAIBAAKCAQEAyRdAvihBXDu30o2uvQ1h8xdIRLHs0RjQWK4Yw5Y5DkaS41EEjnDwjO6sEY5l\n 
IXSuzVj1nkZ1VMPuVR3hIXHCMJLaAO77TaXZVC9yymIUAyTcQ1+hoVLlrCuVI3dEY21WQNTEbtkI\nlI 
xMW+UhkiaKrGHmt2yYLjr754KGt7pNCpRwxPXB7brlpQ3qpapkr7XrKZppvWoG8MCmPIFx8P0K\no8Cd 
mnF9lEdns6uaJZmfs4Ls9HZHpsmn0r42GbOAkJEkj7nE5zc3rXYpmCBZhjyHus0iXjS/n9oL\nHWhV0a 
wagjvmsQgJPYqEsBeO5pDb2IOZq5okQie1YJTd1m8k8k7m9wIDAQABAoIBAQCK0lWssOem\nP8fAQHVg 
J+v1wJ3wZpBhLWsvvUh1RbCvzUK8UQL/PrKh6Ga7W/0u4nmGY6J0mJmJYhWXhyATUZBI\nrih3uoOccC 
Eff/4T/y9nmDvC+zL+xtatTA0SRdTdeu6vpPLSv1uwCUbxrbXGSnszVAbNm9dXGvsq\nMK7GCYQEB4p4 
FtJolDqGZdWAj1u5/AGjbCI+PbkbCAro55Sqnl95WAlogdQFmgxljWl9TEIsbrHf\nYZHtKHlm1lvyeB 
QdVmwLT9S7ufI1J/GAevRxrG2iEkx/IJWYGnQE0P2bXa6Ry90UyvWRPS6Zi/MD\nfWoFAxnB6Ryssr+S 
IAfpG6SGuM55AoGBAOr7yPcvg/66f/Xd3CbpmI8lIfsXBb9xki3pIEfYAWD/\n2ToxpRYPTgrwwB1ufo 
NPr7U1QfzJvAvlTXWkfp4oUnssi5sXw1okZmm01hT0j0FNvsgMG6zD8Z/9\nmgrVrH+tBxVoYqrPM/WB 
dnYhQXEGQq+UF2uPqoKDbsl3DkftXTBrAoGBANsTdLfHmRidkLCRKfSj\nUrbJOSsU6RWGFuoqgD+DZL 
ngKBTaBTd6TVONSR2JvpVJo5hyiAXQ/jQ1XtsPAuJR6fiiRvDfgF7j\n1lp1tsFpNYx2R4+eqoLrHgIC 
Ak1Ke8tWyoD3NgQ4FO9TDfW+QHn0dpLeWdNMUd2a1GVKp4hIoJal\nAoGBAITqMryO5eyZ9XNPMQ3Zp+ 
+gI15xoVCunu7VJOs+ZVlGnsrp9eVKdux9TU3YiDsiQdMP8ulX\n+sQHyg63It+3EyCVC8qIYHmGiV9V 
aJql0rovjbB+GNFabDwBKLbkMhRt/MnBJ75SQaOmvSkImomh\n7up9q9mtg9cbHPlcHHnW65VNAoGAKi 
+Y7jrVVFQjJJ0PgzhgGSqug4lHSQnFJ9p/T7uxjcmIblt9\nXa2Dbm9qgPGhbYX8psKHRvdzvAH6/hvp 
5kL31xUIrCGdyqf9AvZf9uaXlTDBnvpiw0sbQC+62b9a\nD1HrNOJl2HIkNeG8cnHsYI+etbFzgqjTqu 
TBua+iiy/RHLECgYALIDqaAcd7o4V+ws+WG1G9vTlc\nJ6/sBpu3JyKMSdJYlbgIbvHgrfbKhEYuNh/H 
XNdrI6oeW9eAruqHlH+OlUx0tCg4VIeQsz/b7kPS\nY14OMAswuHHyqlZIqK4Xy/R6SQmsc/CUXWPk5I 
UesJk5f1V1NXIqqwv6+nlEucdjgYUd5w==\n-----END RSA PRIVATE KEY-----"} 
 
 
irb(main):020:0> @ec2.describe_key_pairs() 
 
=> [{:aws_key_name=>"mykeypair", 
:aws_fingerprint=>"c6:62:22:9e:99:05:6a:17:13:06:e0:86:f9:55:2a:78:ff:99:6b:fa"}] 

创建一个新的 EBS 卷。指定这个卷的可用区为 us-east-1c。创建之后,这个卷只能连接到在同一可用区中运行的实例。卷最初处于 “creating” 状态。创建过程完成之后,卷将处于 “available” 状态。

清单 21. 创建新的 EBS 卷并列出卷
irb(main):024:0> @ec2.create_volume('', 1, 'us-east-1c') 
 
=> {:aws_status=>"creating", :aws_created_at=>Mon Sep 08 00:29:35 UTC 2008, 
:zone=>"us-east-1c", :aws_size=>1, :snapshot_id=>nil, :aws_id=>"vol-2f34d146"} 
 
irb(main):026:0> @ec2.describe_volumes() 
 
=> {:aws_status=>"available", :aws_created_at=>Mon Sep 08 00:29:35 UTC 2008, 
:zone=>"us-east-1c", :aws_size=>1, :snapshot_id=>nil, :aws_id=>"vol-2f34d146"} 

把这个卷作为块设备 /dev/sdj 连接到当前实例并用 ext3 文件系统进行格式化,这样就可以实际使用它了。

清单 22. 连接新的 EBS 卷并建立文件系统
irb(main):031:0> @ec2.attach_volume('vol-2f34d146', 'i-5a9d3a33', '/dev/sdj') 
 
=> {:aws_instance_id=>"i-5a9d3a33", :aws_device=>"/dev/sdj", 
:aws_attachment_status=>"attaching", :aws_id=>"vol-2f34d146", 
:aws_attached_at=>Mon Sep 08 00:34:03 UTC 2008} 
 
 
$ mkfs.ext3 /dev/sdj 
mke2fs 1.39 (29-May-2006) 
/dev/sdj is entire device, not just one partition! 
Proceed anyway? (y,n) y  
Filesystem label= 
OS type: Linux 
Block size=4096 (log=2) 
Fragment size=4096 (log=2) 
131072 inodes, 262144 blocks 
13107 blocks (5.00%) reserved for the super user 
First data block=0 
Maximum filesystem blocks=268435456 
8 block groups 
32768 blocks per group, 32768 fragments per group 
16384 inodes per group 
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376 
 
Writing inode tables: done               
Creating journal (8192 blocks): done 
Writing superblocks and filesystem accounting information: done 
 
This filesystem will be automatically checked every 39 mounts or 
180 days, whichever comes first. Use tune2fs -c or -i to override. 

把刚格式化的块设备挂装到一个文件系统文件夹。

清单 23. 把卷挂装到本地目录并使用它
$ mount /dev/sdj /mnt/my-vol 
 
$ echo “Hello Devworks” > /mnt/my-vol/test.txt 
 
# cat /mnt/my-vol/test.txt 
 
Hello Devworks 

现在,可以像系统上的其他任何块设备一样使用这个 EBS 卷。可以读写这个卷。使用完之后,可以让卷脱离正在运行的实例,以后可以把它重新连接到另一个实例或同一个实例。这种持久存储可以提高 EC2 的效用。在许多方面都可以使用这种资产,比如存储数据库数据和 Web 服务器日志等需要超过实例寿命长期存在的数据。

可以创建 EBS 卷的快照,快照包含卷在一个特定时间点的内容。快照本身自动存储在 S3 上,由 EC2 以累积方式创建。卷的第一个快照是完整的拷贝,但是以后的快照只存储更改集。当前,每个 Amazon Web Services 账户最多只能有 500 个快照。如果需要保留更多的快照,可以请求提高账户限额。


清单 24. 从 EBS 卷创建快照
irb(main):007:0> @ec2.create_snapshot('vol-2f34d146') 
 
=> {:aws_status=>"pending", :aws_volume_id=>"vol-2f34d146", 
:aws_started_at=>Mon Sep 08 00:49:15 UTC 2008, :aws_progress=>"", 
:aws_id=>"snap-13db3c7a"} 

EC2 在后台创建快照。可以定期列出自己的所有快照,从而确认快照创建过程已经成功完成。


清单 25. 列出 EBS 快照
irb(main):008:0> @ec2.describe_snapshots() 
 
=> [{:aws_status=>"completed", :aws_volume_id=>"vol-2f34d146", 
:aws_started_at=>Mon Sep 08 00:49:15 UTC 2008, :aws_progress=>"100%", 
:aws_id=>"snap-13db3c7a"}] 

最后,可以让卷脱离实例。以后可以把它重新连接到同一个实例或另一个实例。


清单 26. 脱离 EBS 卷
irb(main):006:0> @ec2.detach_volume('vol-2f34d146') 
 
=> {:aws_instance_id=>"i-5a9d3a33", :aws_device=>"/dev/sdj", 
:aws_attachment_status=>"detaching", :aws_id=>"vol-2f34d146", 
:aws_attached_at=>Mon Sep 08 00:34:03 UTC 2008} 

结束语

本文介绍了 Amazon 的 EC2 服务及其基本概念。了解了 right_aws(一个用于与 EC2 交互的开放源码 Ruby 库)提供的一些功能。我们讨论了许多内容,但是 EC2 是一个非常大的复杂主题。强烈建议您通过 Amazon EC2 开发人员指南 了解更多信息。

这个 “用 Amazon Web Services 进行云计算” 系列的 第 4 部分 讨论如何使用 Amazon Simple Queue Service (SQS) 在云中进行可靠的消息传递。

Tags:Amazon Web Services

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接