招商运营方案:用 Amazon Web Services 进行云计算,第 3 部分: 用 EC2 根据需...

来源:百度文库 编辑:中财网 时间:2024/04/30 14:36:24

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:

  1. 用自己的 SSH 密钥对从现有的 AMI 启动一个实例。
  2. 通过 SSH 连接实例。
  3. 根据自己的希望定制实例。
  4. 使用 Amazon 的工具把正在运行的实例重新打包为新的 AMI。
  5. 使用 Amazon 的工具把这个映像上传到 S3。
  6. 使用 Amazon 的工具向 EC2 注册这个新的映像。
  7. 从这个新的映像启动一个新实例,重新定制和重新打包,直到满意为止。

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

  • Eric Hammond 提供的基于 UbuntuDebian 的 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 服务:

  1. 登录 Amazon Web Services 账户。
  2. 导航到 Amazon EC2
  3. 选择页面右边的 Sign Up For This Web Service
  4. 提供必需的信息并完成注册过程。

与任何 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。

  1. 下载 Amazon EC2 AMI ToolsAmazon EC2 API Tools
  2. 把工具存档文件解压到您选择的目录中。
  3. 需要设置一些环境变量并把工具目录添加到 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                

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

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

  5. 需要创建在命令行 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-----                

  6. 把输出中从 -----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. 添加安全证书。使用 清单 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/                

  2. 设置环境变量,从而使用它作为自己私有的 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                

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

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

  4. 现在可以重新打包这个实例,把它上传给 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                

  5. 重新打包过程将在 /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                

  6. 您的 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                

  7. 退出 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 概念。

  1. 从新的 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                

  2. 启动 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。这个示例使用库的默认配置。可用配置选项的列表见文档。

  1. 获取实例的列表,这会返回一组散列,提供每个实例的相关信息。这个库的几乎所有 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"}]                

  2. 获取映像的列表。

    清单 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"}]                

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

    清单 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=>[]}]                

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

    清单 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"}]                

  5. 创建一个新的 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"}                

  6. 把这个卷作为块设备 /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.                

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

    清单 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) 在云中进行可靠的消息传递。



参考资料

学习
  • 阅读本系列的其他部分:
    • 第 1 部分 “简介:选择租用而不是购买
    • 第 2 部分 “用 Amazon Simple Storage Service (S3) 在云中存储数据
    • 第 4 部分 “用 SQS 进行可靠的消息传递
    • 第 5 部分 “用 SimpleDB 在云中处理数据集

  • 了解各种 Amazon Web Services 的相关信息:
    • Amazon Simple Storage Service (S3)
    • Amazon Elastic Compute Cloud (EC2)
    • Amazon Simple Queue Service (SQS)
    • Amazon SimpleDB (SDB)
    • Service Health Dashboard 由 Amazon 团队负责更新,提供每个服务的当前状态。
    • 博客 及时提供 Amazon Web Services 的最新动态。

  • 注册 一个 Amazon Web Services 账户。

  • 可以在 Amazon Public Grid 中使用 OpenSolaris

  • Amazon Web Services Developer Connection 提供开发人员需要的所有参考资料。

  • Amazon Web Services 团队在 EC2 技术资源 上为开发人员提供技术文档、用户指南和其他参考资料。

  • EC2 开发人员指南 提供 EC2 服务的各个组件的相关信息,以及高级使用方法和配置。

  • 在 AWS Developer Connection 网站上可以找到所有 Amazon Machine Images 的列表。

  • Amazon 提供几个帮助创建和管理映像的 命令行工具

  • Web 服务帐户信息页面 上,可以管理密钥和证书、重新生成它们、查看账户活动和使用情况报告以及修改个人信息。

  • 使用 Simple Monthly Calculator 工具计算 EC2 和其他 Amazon Web Services 的每月使用成本。

  • developerWorks 上的体系结构专区 寻找提高体系结构方面的技能所需的参考资料。

  • 技术书店 浏览关于这些主题和其他技术主题的图书。


获得产品和技术
  • 下载 IBM 产品评估版,试用这些来自 DB2?、Lotus?、Rational?、Tivoli? 和 WebSphere? 的应用程序开发工具和中间件产品。


讨论
  • 参与 developerWorks blogs 并加入 developerWorks 社区


关于作者

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