

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

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

**注意**  
此示例假定您已完成[在 Windows 实例上运行配方](cookbooks-101-opsworks-opsworks-windows.md)示例。如果没有，您应该先完成该示例。具体而言，它介绍了如何启用对实例的 RDP 访问。  
发送到 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)。

本主题介绍如何在 OpsWorks Stacks Windows 实例[适用于 Ruby 的 AWS SDK](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/)上使用从 S3 存储桶下载文件。

如果 Ruby 应用程序需要访问 AWS 资源，您必须向其提供一组具有适当权限的 AWS 凭证。对于配方，提供 AWS 证书的最佳选择是使用 AWS Identity and Access Management (I [AM) 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。IAM 角色的工作方式与 IAM 用户非常相似，它有一个附加的策略，用于授予使用各种 AWS 服务的权限。但是，您可以将角色分配给亚马逊弹性计算云 (Amazon EC2) 实例，而不是分配给个人。随后，此实例上运行的应用程序将获取附加策略所授予的权限。使用角色，凭证绝不会显示在您的代码中，甚至不会间接显示。

第一步是设置 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)。

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

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

**设置说明书**

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

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

   ```
   name "s3download"
   version "0.1.0"
   ```

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

1. 创建包含以下配方的 `default.rb` 文件，并将该文件保存到 `recipes` 目录。*windows-cookbooks*替换为您将用于存储待下载文件的 S3 存储桶的名称。

   ```
   Chef::Log.info("******Downloading an object from S3******")
   
   chef_gem "aws-sdk-s3" do
     compile_time false
     action :install
   end
   
   ruby_block "download-object" do
     block do
       require 'aws-sdk-s3'
       
       Aws.use_bundled_cert!
   
       s3_client = Aws::S3::Client.new(region:'us-west-2')
   
       s3_client.get_object(bucket: 'windows-cookbooks',
                        key: 'myfile.txt',
                        response_target: '/chef/myfile.txt')
     end
     action :run
   end
   ```

1. 创建 `s3download`的 `.zip` 存档，然后将该文件上传到 S3 存储桶。公开该文件并记录 URL 以供将来使用。

1. 创建一个名为 `myfile.txt` 的文本文件，然后将其上传到 S3 存储桶。这是您的配方将下载的文件，让您可以使用任何方便的存储桶。

该配方执行以下任务。

1: 安装 SDK for Ruby v2。  
该示例使用 SDK for Ruby 来下载对象。但是， OpsWorks Stacks 不会在 Windows 实例上安装此 SDK，因此配方的第一部分使用[https://docs.chef.io/chef/resources.html#chef-gem](https://docs.chef.io/chef/resources.html#chef-gem)资源来处理该任务。您可以使用此资源安装 Gem 以供 Chef 使用，其中包括配方。

2: 下载文件。  
该配方的第三部分使用 [https://docs.chef.io/chef/resources.html#ruby-block](https://docs.chef.io/chef/resources.html#ruby-block) 资源运行 SDK for Ruby v2 代码，以将 `myfile.txt` 从名为 `windows-cookbooks` 的 S3 存储桶下载到实例的 `/chef` 目录。将 `windows-cookbooks` 更改为包含 `myfile.txt` 的存储桶的名称。

**注意**  
配方是一种 Ruby 应用程序，因此您可以将 Ruby 代码放在配方的正文中；它不一定要位于 `ruby_block` 资源中。但是，Chef 会首先在配方的正文中执行 Ruby 代码，然后按顺序执行每个资源。在本示例中，如果您将下载代码放在配方的正文中，则此操作会失败，因为它依赖于，并且安装开发工具包的 `chef_gem` 资源尚未执行。`ruby_block` 资源中的代码会在资源执行时执行，并且这将发生在 `chef_gem` 资源安装 SDK for Ruby 之后。

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

**创建堆栈**

1. 打开 [OpsWorks Stacks 控制台](https://console.aws.amazon.com/opsworks/)，然后选择 **Add Stack (添加堆栈)**。指定以下设置，接受其他设置的默认值，然后选择 **Add Stack**。
   + **名称 **- S3Download
   + **区域**-美国西部（俄勒冈州）

     本示例在任何区域都有效，但我们建议将美国西部（俄勒冈州）用于教程。
   + **默认操作系统 **- Microsoft Windows Server 2012 R2

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

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

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

**运行配方**

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

   接受其他设置的默认值，然后选择 **Save** 更新堆栈配置。

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

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

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

**验证 s3download**

1. 第一步是检查 Chef 日志。您的堆栈应有一个名为 s3download1 的实例。在 **Instances** 页面上，选择实例 **Log** 列中的 **show**，显示 Chef 日志。向下滚动以在底部附近查找您的日志消息。

   ```
   ...
   [2015-05-01T21:11:04+00:00] INFO: Loading cookbooks [s3download@0.0.0]
   [2015-05-01T21:11:04+00:00] INFO: Storing updated cookbooks/s3download/recipes/default.rb in the cache.
   [2015-05-01T21:11:04+00:00] INFO: ******Downloading an object from S3******
   [2015-05-01T21:11:04+00:00] INFO: Processing chef_gem[aws-sdk] action install (s3download::default line 3)
   [2015-05-01T21:11:05+00:00] INFO: Processing ruby_block[download-object] action run (s3download::default line 8) 
   ...
   ```

1. [使用 RDP 登录实例](workinginstances-rdp.md)并检查 `c:\chef` 的内容。