用 Amazon Web Services 进行云计算,第 3 部分: 用 EC2 根据需要提供服务器
2009-11-05 00:00:00 来源:WEB开发网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) 在云中进行可靠的消息传递。
- ››Web服务器和应用服务器的区别
- ››web安全之信息刺探防范1
- ››webqq 最新加密算法
- ››webdriver 数据库验证方法
- ››WebSphere Application Server 7.0 XML Feature P...
- ››Web2.0网络时代基于社会影响力的声望值
- ››Web服务器搭建:配置Linux+Apache+Mysql+PHP(或Pe...
- ››WebLogic调整Java虚拟机性能优化参数
- ››webqq2.0协议研究(3)-ClientId生成
- ››Web.config配置文件
- ››WebBrowser组件的execWB方法——Delphi控制浏览器...
- ››Web前端设计模式--制作漂亮的弹出层
更多精彩
赞助商链接