用EC2根据需要提供服务器

日期: 2009-05-26 作者:Prabhakar Chaganti 来源:TechTarget中国 英文

  学习基本的Amazon SimpleDB(SDB)概念,研究boto(一个用于与SDB交互的开放源码Python库)提供的一些功能。在这个“用Amazon Web Services进行云计算”系列中,学习如何使用Amazon Web Services进行云计算。了解这些服务如何为设计和构建可伸缩、可靠的应用程序提供一种可选方案。本文介绍Amazon Elastic Compute Cloud(EC2)提供的虚拟服务器。了解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提供几个命令行工具,可以使用它们方便地创建和管理映像。映像本身存储在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—–
nMIIEpAIBAAKCAQEAyRdAvihBXDu30o2uvQ1h8xdIRLHs0RjQWK4Yw5Y5DkaS41EEjnDwjO6sEY5ln
IXSuzVj1nkZ1VMPuVR3hIXHCMJLaAO77TaXZVC9yymIUAyTcQ1+hoVLlrCuVI3dEY21WQNTEbtkInlI
xMW+UhkiaKrGHmt2yYLjr754KGt7pNCpRwxPXB7brlpQ3qpapkr7XrKZppvWoG8MCmPIFx8P0Kno8Cd
mnF9lEdns6uaJZmfs4Ls9HZHpsmn0r42GbOAkJEkj7nE5zc3rXYpmCBZhjyHus0iXjS/n9oLnHWhV0a
wagjvmsQgJPYqEsBeO5pDb2IOZq5okQie1YJTd1m8k8k7m9wIDAQABAoIBAQCK0lWssOemnP8fAQHVg
J+v1wJ3wZpBhLWsvvUh1RbCvzUK8UQL/PrKh6Ga7W/0u4nmGY6J0mJmJYhWXhyATUZBInrih3uoOccC
Eff/4T/y9nmDvC+zL+xtatTA0SRdTdeu6vpPLSv1uwCUbxrbXGSnszVAbNm9dXGvsqnMK7GCYQEB4p4
FtJolDqGZdWAj1u5/AGjbCI+PbkbCAro55Sqnl95WAlogdQFmgxljWl9TEIsbrHfnYZHtKHlm1lvyeB
QdVmwLT9S7ufI1J/GAevRxrG2iEkx/IJWYGnQE0P2bXa6Ry90UyvWRPS6Zi/MDnfWoFAxnB6Ryssr+S
IAfpG6SGuM55AoGBAOr7yPcvg/66f/Xd3CbpmI8lIfsXBb9xki3pIEfYAWD/n2ToxpRYPTgrwwB1ufo
NPr7U1QfzJvAvlTXWkfp4oUnssi5sXw1okZmm01hT0j0FNvsgMG6zD8Z/9nmgrVrH+tBxVoYqrPM/WB
dnYhQXEGQq+UF2uPqoKDbsl3DkftXTBrAoGBANsTdLfHmRidkLCRKfSjnUrbJOSsU6RWGFuoqgD+DZL
ngKBTaBTd6TVONSR2JvpVJo5hyiAXQ/jQ1XtsPAuJR6fiiRvDfgF7jn1lp1tsFpNYx2R4+eqoLrHgIC
Ak1Ke8tWyoD3NgQ4FO9TDfW+QHn0dpLeWdNMUd2a1GVKp4hIoJalnAoGBAITqMryO5eyZ9XNPMQ3Zp+
+gI15xoVCunu7VJOs+ZVlGnsrp9eVKdux9TU3YiDsiQdMP8ulXn+sQHyg63It+3EyCVC8qIYHmGiV9V
aJql0rovjbB+GNFabDwBKLbkMhRt/MnBJ75SQaOmvSkImomhn7up9q9mtg9cbHPlcHHnW65VNAoGAKi
+Y7jrVVFQjJJ0PgzhgGSqug4lHSQnFJ9p/T7uxjcmIblt9nXa2Dbm9qgPGhbYX8psKHRvdzvAH6/hvp
5kL31xUIrCGdyqf9AvZf9uaXlTDBnvpiw0sbQC+62b9anD1HrNOJl2HIkNeG8cnHsYI+etbFzgqjTqu
TBua+iiy/RHLECgYALIDqaAcd7o4V+ws+WG1G9vTlcnJ6/sBpu3JyKMSdJYlbgIbvHgrfbKhEYuNh/H
XNdrI6oeW9eAruqHlH+OlUx0tCg4VIeQsz/b7kPSnY14OMAswuHHyqlZIqK4Xy/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)在云中进行可靠的消息传递。

  关于作者
 
  Prabhakar Chaganti是Ylastic的CTO,这家创业公司正在构建一个对用户的整个AWS云计算环境(EC2、S3、SQS和SimpleDB)进行体系结构设计、管理和监视的统一界面。他是两本新书Xen Virtualization和GWT Java AJAX Programming的作者。他还在VMware Global Virtual Appliance Challenge上获得了社区评选的最具创意Virtual Appliance奖。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐