示例 9:使用 Amazon EC2 实例 - AWS OpsWorks

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

示例 9:使用 Amazon EC2 实例

重要

AWS OpsWorks Stacks 不再接受新客户。在 2024 年 5 月 26 日之前,现有客户将能够正常使用 OpsWorks 控制台、API、CLI 和 CloudFormation 资源,届时它们将停产。为准备此过渡,我们建议您尽快将堆栈过渡到AWS Systems Manager。有关更多信息,请参阅 AWS OpsWorks Stacks 生命周期终止常见问题解答将 AWS OpsWorks Stacks 应用程序迁移到 AWS Systems Manager Application Manager

到目前为止,您一直在本地运行实例 VirtualBox。虽然这种方法简单快捷,但最终您要在 Amazon EC2 实例上测试您的配方。具体而言,如果要在 Amazon Linux 上运行配方,则它仅在 Amazon EC2 上可用。您可以使用类似的系统 (例如 CentOS) 进行初步实施和测试,但是在 Amazon Linux 上全面测试您的配方的唯一方法是使用 Amazon EC2 实例。

本主题介绍了如何在 Amazon EC2 实例上运行配方。您使用 Test Kitchen 和 Vagrant 的方式与前面几节的方式大同小异,但有如下两个区别:

  • 驱动程序为 kitchen-ec2 而不是 Vagrant。

  • 必须使用启动 Amazon EC2 实例所需的信息配置说明书的 .kitchen.yml 文件。

注意

另一种替代方法是使用 vagrant-aws Vagrant 插件。有关更多信息,请参阅 Vagrant AWS 提供程序

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

注册 AWS 账户

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

注册 AWS 账户
  1. 打开 https://portal.aws.amazon.com/billing/signup

  2. 按照屏幕上的说明进行操作。

    在注册时,将接到一通电话,要求使用电话键盘输入一个验证码。

    当您注册 AWS 账户时,系统将会创建一个 AWS 账户根用户。根用户有权访问该账户中的所有 AWS 服务 和资源。作为安全最佳实践,请为管理用户分配管理访问权限,并且只使用根用户执行需要根用户访问权限的任务

注册过程完成后,AWS 会向您发送一封确认电子邮件。在任何时候,您都可以通过转至 https://aws.amazon.com/ 并选择我的账户来查看当前的账户活动并管理您的账户。

创建管理用户

注册 AWS 账户 后,保护您的 AWS 账户根用户,启用 AWS IAM Identity Center,创建一个管理用户,以避免使用根用户执行日常任务。

保护您的 AWS 账户根用户
  1. 选择根用户并输入您的 AWS 账户电子邮件地址,以账户所有者身份登录 AWS Management Console。在下一页上,输入您的密码。

    要获取使用根用户登录方面的帮助,请参阅《AWS 登录 用户指南》中的以根用户身份登录

  2. 对您的根用户启用多重身份验证(MFA)。

    有关说明,请参阅《IAM 用户指南》中的为 AWS 账户 根用户启用虚拟 MFA 设备(控制台)

创建管理用户
  1. 启用 IAM Identity Center

    有关说明,请参阅《AWS IAM Identity Center 用户指南》中的启用 AWS IAM Identity Center

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

    有关使用 IAM Identity Center 目录 作为身份源的教程,请参阅《AWS IAM Identity Center 用户指南》中的使用默认 IAM Identity Center 目录 配置用户访问权限

作为管理用户登录
  • 要使用您的 IAM Identity Center 用户身份登录,请使用您在创建 IAM Identity Center 用户时发送到您的电子邮件地址的登录网址。

    要获取使用 IAM Identity Center 用户登录方面的帮助,请参阅《AWS 登录 用户指南》中的登录 AWS 访问门户

您应该创建一个有权访问 Amazon EC2 的 IAM 用户,并将该用户的访问权限和密钥保存到工作站上的安全位置。Test Kitchen 将使用这些凭证来创建实例。向 Test Kitchen 提供凭证的首选方法是将密钥分配给工作站上的以下环境变量。

警告

IAM 用户拥有长期证书,这会带来安全风险。为了帮助降低这种风险,我们建议您仅向这些用户提供他们执行任务所需的权限,并在不再需要这些用户时将其删除。

  • AWS_ACCESS_KEY - 您用户的访问密钥,它类似于 AKIAIOSFODNN7EXAMPLE。

  • AWS_SECRET_KEY — 你的用户的密钥,看起来像 wjalrxutnfemi/k7mdeng/ CYEXAMPLEKEY。bPxRfi

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

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

    sudo aptitude install ruby1.9.1-dev
  2. kitchen-ec2 驱动程序是一个 Gem,可通过如下方法进行安装:

    gem install kitchen-ec2

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

  3. 您必须指定 Test Kitchen 可用于连接至相应实例的 Amazon EC2 SSH 密钥对。如果没有 密钥对,请参阅 Amazon EC2 密钥对,以获取有关如何创建密钥对的信息。请注意,该密钥对必须属于与实例相同的 Amazon Web Services Region。示例使用美国西部(北加利福尼亚)。

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

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

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

    name "createdir-ec2" version "0.1.0"
  6. 按照示例 1:安装软件包中所述初始化 Test Kitchen。以下部分介绍如何配置 .kitchen.yml,这对于 Amazon EC2 实例来说要复杂得多。

  7. recipes 子目录添加 createdir-ec2 中。

针对 Amazon EC2 配置 .kitchen.yml

您使用 kitchen-ec2 驱动程序启动适当配置的 Amazon EC2 实例所需的信息来配置 .kitchen.yml。以下是面向美国西部(北加利福尼亚)区域中 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:

您可以使用 provisionersuites 部分的默认设置,但必须修改默认的 driverplatforms 设置。此示例使用了最少的设置列表,并接受了其余部分的默认值。有关 kitchen-ec2 设置的完整列表,请参阅 Kitchen::Ec2:面向 Amazon EC2 的 Test Kitchen 驱动程序

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

name

(必选) 必须将此属性设置为 ec2

aws_ssh_key_id

(必选) Amazon EC2 SSH 密钥对名称,在该示例中名为 US-East1

transport.ssh_key

(必选) 您为 aws_ssh_key_id 指定的密钥的私有密钥 (.pem) 文件。对于本示例,该文件名为 US-East1.pem,且位于 ../opsworks/ec2_keys 目录中。

region

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

availability_zone

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

require_chef_omnibus

如果设置为 true,此设置可确保使用 omnibus 安装程序将 chef-client 安装至所有平台实例。

security_group_ids

(可选) 应用于实例的安全组 ID 的列表。此设置会将 default 安全组应用于实例。确保安全组入口规则允许入站 SSH 连接,否则 Test Kitchen 无法与实例进行通信。如果您使用 default 安全组,则可能需要对其进行相应编辑。有关更多信息,请参阅 Amazon EC2 Security Groups

subnet_id

实例的目标子网的 ID (如果适用)。

associate_public_ip

如果您希望能够通过 Internet 访问实例,则可以利用 Amazon EC2 将公有 IP 地址与该实例相关联。

接口

您用于访问实例的主机名配置类型。有效值为 dnspublicprivateprivate_dns。如果您不指定此属性的值,则 kitchen-ec2 会按如下顺序设置主机名配置。如果您忽略此属性,则不会设置配置类型。

  1. DNS 名称

  2. 公有 IP 地址

  3. 私有 IP 地址

  4. 私有 DNS 名称

重要

您不用将您的账户凭证用于访问密钥和秘密密钥,而应该创建一个用户,并向 Test Kitchen 提供这些凭证。有关更多信息,请参阅管理 AWS 访问密钥的最佳实践

注意不要将其.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

如果您要使用这些平台中的一个或多个,请将相应的平台名称添加至 platformskitchen-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。其他 AMI 可能具有不同的用户名。

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

运行配方

此示例使用来自迭代的配方。

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

    directory "/srv/www/shared" do mode 0755 owner 'root' group 'root' recursive true action :create end
  2. 运行 kitchen converge 以执行该配方。请注意,由于启动和初始化 Amazon EC2 实例需要时间,因此与以前的示例相比,该命令需要更长的时间才能完成。

  3. 转到 Amazon EC2 控制台,选择美国西部(北加利福尼亚)区域,并在导航窗格中单击 实例。您将会在列表中看到新创建的实例。

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