在 AWS OpsWorks Stacks Linux 实例上使用 SDK for Ruby - AWS OpsWorks

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

在 AWS OpsWorks Stacks Linux 实例上使用 SDK for Ruby

重要

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

本主题介绍如何在 AWS OpsWorks Stacks Linux 实例上使用 SDK for Ruby 以从 Amazon S3 存储桶下载文件。AWS OpsWorksStacks 将在每个 Linux 实例上自动安装 SDK for Ruby。但是,当您创建服务的客户端对象时,必须为其他服务提供一组合适的 AWS 凭证 AWS::S3.new 或等效内容。

发送到 Amazon S3 存储桶的内容可能包含客户内容。有关删除敏感数据的更多信息,请参阅如何清空 S3 存储桶?如何删除 S3 存储桶?

在 Vagrant 实例上使用 SDK for Ruby说明如何通过将凭证存储在节点对象中并在配方代码中引用属性来减小公开凭证的风险。当您在 Amazon EC2 实例上运行配方时,更好的选择是 IAM 角色

IAM 角色的工作原理与 IAM 用户的很类似。它具有授权使用各种 Amazon Web Service 的附加策略。但是,您将角色分配给 Amazon EC2 实例而不是个体。随后,此实例上运行的应用程序将获取附加策略所授予的权限。使用角色,凭证绝不会显示在您的代码中,甚至不会间接显示。本主题介绍如何使用 IAM 角色在 Amazon EC2 实例上运行 在 Vagrant 实例上使用 SDK for Ruby 中的配方。

您可使用 kitchen-ec2 驱动程序来运行此配方与 Test Kitchen,如示例 9:使用 Amazon EC2 实例中所述。但是,在 Amazon EC2 实例上安装 SDK for Ruby 会有点复杂,而对于 AWS OpsWorks Stacks 来说无需考虑这一点。默认情况下,所有 AWS OpsWorks Stacks Linux 实例都已安装。为简便起见,此示例使用 AWS OpsWorks Stacks 实例。

第一步是设置 IAM 角色。此示例采用最简单的方法,即使用 AWS OpsWorks Stacks 在您创建第一个堆栈时创建的 Amazon EC2 角色。它被命名为 aws-opsworks-ec2-role。但是,AWS OpsWorks Stacks 不会将策略附加到该角色,因此默认情况下,它不授予任何权限。

您必须将 AmazonS3ReadOnlyAccess 策略附加到 aws-opsworks-ec2-role 角色才能授予相应的权限。有关如何将策略附加到 IAM 实体的更多信息,请参阅IAM 用户指南中的添加 IAM 身份权限(控制台)

在创建或更新堆栈时指定角色。使用自定义层设置堆栈,如在 Linux 实例上运行配方中所述,增加了一步。在添加堆栈页面上,确认默认 IAM 实例配置文件设置为aws-opsworks-ec双角色。 AWS OpsWorksStacks 随后会将该角色分配至该堆栈的所有实例。

设置说明书的过程与在 Linux 实例上运行配方使用的过程类似。下面是一个简短摘要;您应参阅该示例以了解详细信息。

设置说明书
  1. 创建一个名为 s3bucket_ops 的目录并导航到该目录。

  2. 创建一个包含以下内容的 metadata.rb 文件,并将该文件保存到 s3bucket_ops

    name "s3bucket_ops" version "0.1.0"
  3. recipes 中创建 s3bucket_ops 目录。

  4. 创建包含以下配方的 default.rb 文件,并将该文件保存到 recipes 目录。

    Chef::Log.info("******Downloading a file from Amazon S3.******") ruby_block "download-object" do block do require 'aws-sdk' s3 = AWS::S3.new myfile = s3.buckets['cookbook_bucket'].objects['myfile.txt'] Dir.chdir("/tmp") File.open("myfile.txt", "w") do |f| f.syswrite(myfile.read) f.close end end action :run end
  5. 创建 .zips3bucket_ops 存档,然后将该存档上传到 Amazon S3 存储桶。为简单起见,请公开存档,然后记录存档的 URL 以供将来使用。您也可以将说明书存储在私有 Amazon S3 存档或几个其他存储库类型中。有关更多信息,请参阅 说明书存储库

此配方类似于上一示例使用的配方,但存在以下差别。

  • 由于 AWS OpsWorks Stacks 已安装 SDK for Ruby,因此 chef_gem 资源已被删除。

  • 配方不会将任何凭证传递到 AWS::S3.new

    凭证将基于实例的角色自动分配到应用程序。

  • 配方使用 Chef::Log.info 将消息添加到 Chef 日志。

按下面所示为本示例创建堆栈。您也可以使用现有 Windows 堆栈。只需更新说明书即可,如下文所述。

创建 堆栈
  1. 打开 AWS OpsWorks Stacks 控制台,然后单击 Add Stack (添加堆栈)

  2. 指定以下设置,接受其他设置的默认值,然后单击 Add Stack

    • 名称 - RubySDK

    • 默认 SSH 密钥 - Amazon EC2 密钥对

    如果您需要创建 Amazon EC2 密钥对,请参阅 Amazon EC2 密钥对。请注意,该密钥对必须属于与实例相同的 Amazon Web Services Region。本示例使用了默认的美国西部(俄勒冈州)区域。

  3. 单击 Add a layer 并将采用以下设置的自定义层添加到堆栈。

    • 名称 - S3Download

    • 短名称 - s3download

    实际上任何层类型均适用于 Linux 堆栈,但本示例不需要由其他层类型安装的任何程序包,因此自定义层是最简单的方法。

  4. 向层添加全天候实例 (采用默认设置) 并启动该实例

您现在可以安装并运行配方

运行配方
  1. 编辑堆栈以启用自定义说明书,然后指定以下设置。

    • 存储库类型 -Http 存档

    • 存储库 URL -您之前记录的说明书存档 URL。

    对其他设置使用默认值,然后单击 Save 更新堆栈配置。

  2. 运行“Update Custom Cookbooks”堆栈命令,这会将当前版本的自定义说明书安装到堆栈的实例上。如果您的说明书存在早期版本,此命令会覆盖该版本。

  3. 通过在 Recipes to execute 设置为 s3bucket_ops::default 的情况下运行 Execute Recipes 堆栈命令来执行配方。此命令将使用一个包含 s3bucket_ops::default 的运行列表来启动 Chef 运行。

    注意

    您通常可以让 AWS OpsWorks Stacks 通过向您的配方分配适当的生命周期事件来自动运行配方。您可以通过手动触发事件来运行此类配方。您可以使用堆栈命令触发设置和配置事件,使用部署命令触发部署和取消部署事件。

配方成功运行后,您可以对其进行验证。

验证 s3bucket_ops
  1. 第一步是检查 Chef 日志。您的堆栈应有一个名为 opstest1 的实例。在 Instances 页面上,单击实例 Log 列中的 show,显示 Chef 日志。向下滚动以在底部附近查找您的日志消息。

    ... [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/attributes/customize.rb in the cache. [2014-07-31T17:01:45+00:00] INFO: Storing updated cookbooks/opsworks_cleanup/metadata.rb in the cache. [2014-07-31T17:01:46+00:00] INFO: ******Downloading a file from Amazon S3.****** [2014-07-31T17:01:46+00:00] INFO: Processing template[/etc/hosts] action create (opsworks_stack_state_sync::hosts line 3) ...
  2. 使用 SSH 登录实例并列出 /tmp 的内容。