

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 示例 9：使用亚马逊 EC2 实例
<a name="cookbooks-101-basics-ec2"></a>

**重要**  
该 AWS OpsWorks Stacks 服务于 2024 年 5 月 26 日终止，新客户和现有客户均已禁用。我们强烈建议客户尽快将其工作负载迁移到其他解决方案。如果您对迁移有疑问，请通过 re [AWS : Post 或通过 Pre](https://repost.aws/) mium Su [AWS pp](https://aws.amazon.com/support) ort 与 AWS 支持 团队联系。

到目前为止，您一直在本地运行实例 VirtualBox。虽然这既快速又简单，但你最终会想在 Amazon EC2 实例上测试你的食谱。特别是，如果你想在亚马逊 Linux 上运行配方，则只能在亚马逊上使用 EC2。你可以使用类似的系统（例如 CentOS）进行初步实施和测试，但要在 Amazon Linux 上全面测试你的配方，唯一的方法是使用亚马逊 EC2 实例。

本主题介绍如何在 Amazon EC2 实例上运行配方。您使用 Test Kitchen 和 Vagrant 的方式与前面几节的方式大同小异，但有如下两个区别：
+ 驱动程序为 [https://rubygems.org/gems/kitchen-ec2](https://rubygems.org/gems/kitchen-ec2) 而不是 Vagrant。
+ 必须使用启动 Amazon EC2 实例所需的信息来配置食谱`.kitchen.yml`文件。

**注意**  
另一种替代方法是使用 `vagrant-aws` Vagrant 插件。有关更多信息，请参阅 [Vagrant AWS 提供程序](https://github.com/mitchellh/vagrant-aws)。

您需要有 AWS 证书才能创建亚马逊 EC2 实例。如果您还没有 Amazon Web Services account，可以按如下方式获取一个。

## 注册获取 AWS 账户
<a name="sign-up-for-aws"></a>

如果您没有 AWS 账户，请完成以下步骤来创建一个。

**报名参加 AWS 账户**

1. 打开[https://portal.aws.amazon.com/billing/注册。](https://portal.aws.amazon.com/billing/signup)

1. 按照屏幕上的说明操作。

   在注册时，将接到电话或收到短信，要求使用电话键盘输入一个验证码。

   当您注册时 AWS 账户，就会创建*AWS 账户根用户*一个。根用户有权访问该账户中的所有 AWS 服务 和资源。作为最佳安全实践，请为用户分配管理访问权限，并且只使用根用户来执行[需要根用户访问权限的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 注册过程完成后会向您发送一封确认电子邮件。您可以随时前往 [https://aws.amazon.com/](https://aws.amazon.com/)并选择 “**我的账户”，查看您当前的账户活动并管理您的账户**。

## 创建具有管理访问权限的用户
<a name="create-an-admin"></a>

注册后，请保护您的安全 AWS 账户 AWS 账户根用户 AWS IAM Identity Center，启用并创建管理用户，这样您就不会使用 root 用户执行日常任务。

**保护你的 AWS 账户根用户**

1.  选择 **Root 用户**并输入您的 AWS 账户 电子邮件地址，以账户所有者的身份登录。[AWS 管理控制台](https://console.aws.amazon.com/)在下一页上，输入您的密码。

   要获取使用根用户登录方面的帮助，请参阅《AWS 登录 用户指南》**中的 [Signing in as the root user](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 为您的根用户启用多重身份验证（MFA）。

   有关说明，请参阅 I [A *M* 用户指南中的为 AWS 账户 根用户启用虚拟 MFA 设备（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**创建具有管理访问权限的用户**

1. 启用 IAM Identity Center。

   有关说明，请参阅**《AWS IAM Identity Center 用户指南》中的[启用 AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，为用户授予管理访问权限。

   有关使用 IAM Identity Center 目录 作为身份源的教程，请参阅《[用户*指南》 IAM Identity Center 目录中的使用默认设置配置AWS IAM Identity Center 用户*访问权限](https://docs.aws.amazon.com/singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理访问权限的用户身份登录**
+ 要使用您的 IAM Identity Center 用户身份登录，请使用您在创建 IAM Identity Center 用户时发送到您的电子邮件地址的登录 URL。

  有关使用 IAM Identity Center 用户[登录的帮助，请参阅*AWS 登录 用户指南*中的登录 AWS 访问门户](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**将访问权限分配给其他用户**

1. 在 IAM Identity Center 中，创建一个权限集，该权限集遵循应用最低权限的最佳做法。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Create a permission set](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 将用户分配到一个组，然后为该组分配单点登录访问权限。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Add groups](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)。

您应该[创建一个有权访问 Amazon 的 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)， EC2 并将该用户的访问权限和密钥保存到工作站上的安全位置。Test Kitchen 将使用这些凭证来创建实例。向 Test Kitchen 提供凭证的首选方法是将密钥分配给工作站上的以下环境变量。

**警告**  
IAM 用户具有长期凭证，这会带来安全风险。为帮助减轻这种风险，我们建议仅向这些用户提供执行任务所需的权限，并在不再需要这些用户时将其移除。
+ AWS\$1ACCESS\$1KEY — 你的用户的访问密钥，看起来像这样AKIAIOSFODNN7EXAMPLE。
+ AWS\$1SECRET\$1KEY — 你的用户的密钥，看起来像这样wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY。

这种方法通过将包含您的凭证的项目上传到公共存储库，从而可减少意外泄露您的账户的几率。

**设置说明书**

1. 要使用 `kitchen-ec2` 驱动程序，必须将 `ruby-dev` 软件包安装在您的系统上。以下示例命令演示了如何使用 `aptitude` 将软件包安装在 Ubuntu 系统上。

   ```
   sudo aptitude install ruby1.9.1-dev 
   ```

1. `kitchen-ec2` 驱动程序是一个 Gem，可通过如下方法进行安装：

   ```
   gem install kitchen-ec2
   ```

   根据您的工作站，此命令可能需要 `sudo`，或者您也可以使用 Ruby 环境管理器 (如 [RVM](https://rvm.io/))。此过程已使用 0.8.0 版的 `kitchen-ec2` 驱动程序进行测试，但已推出更新版本。要安装某个[特定版本](https://rubygems.org/gems/kitchen-ec2/versions)，请运行 `gem install kitchen-ec2 -v <version number>`。

1. 您必须指定 Test Kitchen 可用于连接实例的 Amazon EC2 SSH 密钥对。如果您没有 Amazon EC2 密钥对，请参阅 [Amazon EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)，了解如何创建密钥对。请注意，该密钥对必须属于与实例相同的 Amazon Web Services Region。示例使用美国西部（北加利福尼亚）。

   选定密钥对后，创建 `opsworks_cookbooks` 的子目录 (名为 `ec2_keys`)，并将该密钥对的私有密钥 (`.pem`) 文件复制到该子目录中。请注意，将私有密钥置于 `ec2_keys` 中只是略微简化代码的一个便捷方法而已；它可以是您系统上的任何位置。

1. 创建 `opsworks_cookbooks` 的名为 `createdir-ec2` 的子目录并导航到该子目录。

1. 将包含以下内容的 `metadata.rb` 文件添加到 `createdir-ec2`。

   ```
   name "createdir-ec2"
   version "0.1.0"
   ```

1. 按照[示例 1：安装软件包](cookbooks-101-basics-packages.md)中所述初始化 Test Kitchen。以下部分介绍如何配置`.kitchen.yml`，这对于Amazon EC2 实例来说要复杂得多。

1. 将 `recipes` 子目录添加 `createdir-ec2` 中。

## 为亚马逊配置.kitchen.yml EC2
<a name="w2ab1c14c71b9c15c17c31c37"></a>

您可以使用`kitchen-ec2`驱动程序启动适当配置`.kitchen.yml`的 Amazon EC2 实例所需的信息进行配置。以下是面向美国西部（北加利福尼亚）区域中 Amazon Linux 实例的 `.kitchen.yml` 文件示例。

```
driver:
  name: ec2
  aws_ssh_key_id: US-East1
  region: us-west-1
  availability_zone: us-west-1c
  require_chef_omnibus: true
  security_group_ids: sg........
  subnet_id: subnet-.........
  associate_public_ip: true
  interface: dns

provisioner:
  name: chef_solo

platforms:
  -name: amazon
  driver:
    image_id: ami-xxxxxxxx
  transport:
    username: ec2-user
    ssh_key: ../ec2_keys/US-East1.pem

suites:
  - name: default
    run_list:
      - recipe[createdir-ec2::default]
    attributes:
```

您可以使用 `provisioner` 和 `suites` 部分的默认设置，但必须修改默认的 `driver` 和 `platforms` 设置。此示例使用了最少的设置列表，并接受了其余部分的默认值。有关`kitchen-ec2`设置的完整列表，请参阅 Kitche [n:: Ec2：适用于亚马逊 EC2的测试厨房驱动程序](https://github.com/test-kitchen/kitchen-ec2)。

此示例设置了以下 `driver` 属性。它假设您已将用户的访问密钥和秘密密钥分配给标准环境变量 (如前所述)。默认情况下，该驱动程序将使用这些密钥。否则，您必须通过将 `aws_access_key_id` 和 `aws_secret_access_key` 添加至 `driver` 属性中来显式指定密钥，并设置为适当的密钥值。

**name**  
(必选) 必须将此属性设置为 `ec2`。

**aws\$1ssh\$1key\$1id**  
（必填）Amazon EC2 SSH 密钥对名称，在本示例`US-East1`中命名。

**transport.ssh\$1key**  
(必选) 您为 `aws_ssh_key_id` 指定的密钥的私有密钥 (`.pem`) 文件。对于本示例，该文件名为 `US-East1.pem`，且位于 `../opsworks/ec2_keys` 目录中。

**region**  
(必选) 实例的 Amazon Web Services Region。示例使用美国西部（北加利福尼亚），用 `us-west-1`）表示。

**availability\$1zone**  
(可选) 实例的可用区。如果您忽略了此设置，则 Test Kitchen 将使用指定区域的默认可用区，为美国西部（北加利福尼亚）的 `us-west-1b`。但是，默认区域可能不适用于您的账户。在这种情况下，您必须显式指定一个可用区。如果发生这种情况，用于准备相应示例的账户不支持 `us-west-1b`，因此示例会显式指定 `us-west-1c`。

**require\$1chef\$1omnibus**  
如果设置为 `true`，此设置可确保使用 omnibus 安装程序将 `chef-client` 安装至所有平台实例。

**security\$1group\$1ids**  
（可选） IDs 要应用于实例的安全组列表。此设置会将 `default` 安全组应用于实例。确保安全组入口规则允许入站 SSH 连接，否则 Test Kitchen 无法与实例进行通信。如果您使用 `default` 安全组，则可能需要对其进行相应编辑。有关更多信息，请参阅 [Amazon EC2 安全组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)。

**subnet\$1id**  
实例的目标子网的 ID (如果适用)。

**associate\$1public\$1ip**  
如果您希望能够从互联网访问实例，可以让 Amazon 将公有 IP 地址与该实例 EC2 相关联。

**接口**  
您用于访问实例的主机名配置类型。有效值为 `dns`、`public`、`private` 或 `private_dns`。如果您不指定此属性的值，则 `kitchen-ec2` 会按如下顺序设置主机名配置。如果您忽略此属性，则不会设置配置类型。  

1. DNS 名称

1. 公有 IP 地址

1. 私有 IP 地址

1. 私有 DNS 名称

**重要**  
您不用将您的账户凭证用于访问密钥和秘密密钥，而应该创建一个用户，并向 Test Kitchen 提供这些凭证。有关更多信息，请参阅[管理 AWS 访问密钥的最佳实践](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html)。  
注意不要将其`.kitchen.yml`放在可公开访问的位置，例如将其上传到公共存储库 GitHub 或 Bitbucket 存储库。这样做会暴露您的凭证，并可能危及您的账户安全。

`kitchen-ec2` 驱动程序为以下平台提供默认支持：
+ ubuntu-10.04
+ ubuntu-12.04
+ ubuntu-12.10
+ ubuntu-13.04
+ ubuntu-13.10
+ ubuntu-14.04
+ centos-6.4
+ debian-7.1.0
+ windows-2012r2
+ windows-2008r2

如果您要使用这些平台中的一个或多个，请将相应的平台名称添加至 `platforms`。`kitchen-ec2` 驱动程序将自动选择适当的 AMI，并生成一个 SSH 用户名。您可以使用其他平台 (此示例使用 Amazon Linux)，但是必须显式指定如下 `platforms` 属性。

**name**  
平台名称。此示例使用 Amazon Linux，因此 `name` 设置为 `amazon`。

**driver**  
`driver` 属性，它包括以下内容：  
+ `image_id`-平台的 AMI，必须属于指定区域。该示例使用 `ami-ed8e9284`，这是来自美国西部（北加利福尼亚）区域的 Amazon Linux AMI。
+ `transport.username`- Test Kitchen 将用于与实例进行通信的 SSH 用户名。

  将 `ec2-user` 用于 Amazon Linux。其他人 AMIs 可能有不同的用户名。

将 `.kitchen.yml` 中的代码替换为示例，并将相应值分配给特定于账户的属性，例如 `aws_access_key_id`。

## 运行配方
<a name="w2ab1c14c71b9c15c17c31c39"></a>

此示例使用来自[迭代](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-iteration)的配方。

**运行配方**

1. 使用以下代码创建名为 `default.rb` 的文件，并将其保存至说明书的 `recipes` 文件夹。

   ```
   directory "/srv/www/shared" do
     mode 0755
     owner 'root'
     group 'root'
     recursive true
     action :create
   end
   ```

1. 运行 `kitchen converge` 以执行该配方。请注意，由于启动和初始化 Amazon EC2 实例需要时间，因此完成此命令所需的时间比前面的示例长。

1.  前往 [Amazon EC2 控制台](https://console.aws.amazon.com/ec2/)，选择美国西部（加利福尼亚北部）区域，然后在导航窗格中点击**实例**。您将会在列表中看到新创建的实例。

1. 运行`kitchen login`以登录实例，就像您对正在运行的实例所做的那样 VirtualBox。您将在 `/srv` 下看到新创建的目录。也可以使用您常用的 SSH 客户端连接到实例。