

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

# 在 OpsWorks Stacks Linux 实例上使用适用于 Ruby 的 SDK
<a name="cookbooks-101-opsworks-s3-opsworks"></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 支持 团队联系。

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

发送到 Amazon S3 存储桶的内容可能包含客户内容。有关删除敏感数据的更多信息，请参阅[如何清空 S3 存储桶？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)或[如何删除 S3 存储桶？](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)。

 [在 Vagrant 实例上使用 SDK for Ruby](cookbooks-101-opsworks-s3-vagrant.md)说明如何通过将凭证存储在节点对象中并在配方代码中引用属性来减小公开凭证的风险。当你在 Amazon EC2 实例上运行配方时，你还有一个更好的选择，那就是 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

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

您可使用 kitchen-ec2 驱动程序来运行此配方与 Test Kitchen，如[示例 9：使用亚马逊 EC2 实例](cookbooks-101-basics-ec2.md)中所述。但是，在亚马逊 EC2 实例上安装适用于 Ruby 的 SDK 有些复杂，对于 OpsWorks 堆栈来说，你不需要担心。默认情况下，所有 OpsWorks Stacks Linux 实例都安装了适用于 Ruby 的 SDK。因此，为简单起见，该示例使用了 OpsWorks Stacks 实例。

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

您必须将 `AmazonS3ReadOnlyAccess` 策略附加到 `aws-opsworks-ec2-role` 角色才能授予相应的权限。有关如何将策略附加到 IAM 实体的更多信息，请参阅*IAM 用户指南*中的[添加 IAM 身份权限（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)。

在创建或更新堆栈时指定角色。使用自定义层设置堆栈，如[在 Linux 实例上运行配方](cookbooks-101-opsworks-opsworks-instance.md)中所述，增加了一步。在**添加堆栈**页面上，确认**默认 IAM 实例配置文件**设置为**aws-opsworks-ec双角色**。 OpsWorks 然后，堆栈会将该角色分配给堆栈的所有实例。

设置说明书的过程与[在 Linux 实例上运行配方](cookbooks-101-opsworks-opsworks-instance.md)使用的过程类似。下面是一个简短摘要；您应参阅该示例以了解详细信息。

**设置说明书**

1. 创建一个名为 `s3bucket_ops` 的目录并导航到该目录。

1. 创建一个包含以下内容的 `metadata.rb` 文件，并将该文件保存到 `s3bucket_ops`。

   ```
   name "s3bucket_ops"
   version "0.1.0"
   ```

1. 在 `recipes` 中创建 `s3bucket_ops` 目录。

1. 创建包含以下配方的 `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
   ```

1. 创建 `.zip` 的 `s3bucket_ops` 存档，然后将该存档上传到 Amazon S3 存储桶。为简单起见，请[公开存档](https://docs.aws.amazon.com/AmazonS3/latest/UG/EditingPermissionsonanObject.html)，然后记录存档的 URL 以供将来使用。您也可以将说明书存储在私有 Amazon S3 存档或几个其他存储库类型中。有关更多信息，请参阅 [说明书存储库](workingcookbook-installingcustom-repo.md)。

此配方类似于上一示例使用的配方，但存在以下差别。
+ 由于 OpsWorks Stacks 已经安装了适用于 Ruby 的 SDK，因此该`chef_gem`资源已被删除。
+ 配方不会将任何凭证传递到 `AWS::S3.new`。

  凭证将基于实例的角色自动分配到应用程序。
+ 配方使用 `Chef::Log.info` 将消息添加到 Chef 日志。

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

**创建堆栈**

1. 打开 [OpsWorks Stacks 控制台](https://console.aws.amazon.com/opsworks/)，然后单击 **Add Stack (添加堆栈)**。

1. 指定以下设置，接受其他设置的默认值，然后单击 **Add Stack**。
   + **名称 **- RubySDK
   + **默认 SSH 密钥** — Amazon EC2 密钥对

   如果您需要创建亚马逊 EC2 密钥对，请参阅[亚马逊 EC2 密钥对](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。请注意，该密钥对必须属于与实例相同的 Amazon Web Services Region。本示例使用了默认的美国西部（俄勒冈州）区域。

1. 单击 **Add a layer** 并将采用以下设置的[自定义层添加到](workinglayers-custom.md)堆栈。
   + **名称 **- S3Download
   + **短名称 **- s3download

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

1. 向层[添加全天候实例](workinginstances-add.md) (采用默认设置) 并[启动该实例](workinginstances-starting.md)。

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

**运行配方**

1. [编辑堆栈以启用自定义说明书](workingcookbook-installingcustom-enable.md)，然后指定以下设置。
   + **存储库类型 **-**Http 存档**
   + **存储库 URL **-您之前记录的说明书存档 URL。

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

1. [运行“Update Custom Cookbooks”堆栈命令](workingstacks-commands.md)，这会将当前版本的自定义说明书安装到堆栈的实例上。如果您的说明书存在早期版本，此命令会覆盖该版本。

1. 通过在 **Recipes to execute** 设置为 **s3bucket\$1ops::default** 的情况下运行 **Execute Recipes** 堆栈命令来执行配方。此命令将使用一个包含 `s3bucket_ops::default` 的运行列表来启动 Chef 运行。
**注意**  
通常，您可以让 OpsWorks Stacks [自动运行您的配方](workingcookbook-assigningcustom.md)，方法是将它们分配给相应的生命周期事件。您可以通过手动触发事件来运行此类配方。您可以使用堆栈命令触发设置和配置事件，使用[部署命令](workingapps-deploying.md)触发部署和取消部署事件。

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

**验证 s3bucket\$1ops**

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)
   ...
   ```

1. [使用 SSH 登录实例](workinginstances-ssh.md)并列出 `/tmp` 的内容。