

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Stacks Windows 執行個體上使用適用於 Ruby OpsWorks 的 SDK
<a name="cookbooks-101-opsworks-s3-windows"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 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 ([IAM) 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。IAM 角色的運作方式與具有連接政策的 IAM 使用者非常類似，該政策授予使用各種 AWS 服務的許可。不過，您可以將角色指派給 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體，而不是個人。該執行個體上執行的應用程式接著可以取得已連接政策所授予的許可。使用角色，登入資料絕不會出現在您的程式碼中，即使是間接也是一樣。

第一步是設定 IAM 角色。此範例採用最簡單的方法，即使用 OpsWorks Stacks 在您建立第一個堆疊時建立的 Amazon EC2 角色。它命名為 `aws-opsworks-ec2-role`。不過， OpsWorks Stacks 不會將政策連接至該角色，因此預設不會授予任何許可。

您必須將`AmazonS3ReadOnlyAccess`政策連接至`aws-opsworks-ec2-role`角色，才能授予適當的許可。如需如何將政策連接至角色的詳細資訊，請參閱《[IAM 使用者指南》中的新增 IAM 身分許可 （主控台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)。 **

您可以在建立或更新堆疊時指定角色。設定具有自訂 layer 的堆疊，如[在 Windows 執行個體上執行配方](cookbooks-101-opsworks-opsworks-windows.md)中所述，並有一項新增。在**新增堆疊**頁面上，確認**預設 IAM 執行個體描述**檔設定為 **aws-opsworks-ec2-role**。 OpsWorks Stacks 接著會將該角色指派給堆疊的所有執行個體。

設定技術指南的程序與[在 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：安裝適用於 Ruby v2 的 SDK。  
此範例使用適用於 Ruby 的 SDK 下載物件。不過， OpsWorks Stacks 不會在 Windows 執行個體上安裝此開發套件，因此配方的第一部分會使用 [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) 資源來執行適用於 Ruby 的 SDK v2 程式碼，`myfile.txt`從名為 的 S3 儲存貯體下載`windows-cookbooks`到執行個體的`/chef`目錄。將 `windows-cookbooks` 變更為包含 `myfile.txt` 的儲存貯體名稱。

**注意**  
配方是 Ruby 應用程式，因此，您可以將 Ruby 程式碼放入配方主體中；它不需要在 `ruby_block` 資源中。不過，Chef 會先執行配方主體中的 Ruby 程式碼，接著依序執行每個資源。在此範例中，如果您將下載程式碼放在配方的內文中，它將會失敗，因為它取決於適用於 Ruby 的 SDK，以及安裝 SDK `chef_gem`的資源尚未執行。`ruby_block` 資源中的程式碼會在資源執行時執行，並在`chef_gem`資源安裝適用於 Ruby 的 SDK 後執行。

針對此範例建立堆疊，如下所示。您也可以使用現有 Windows 堆疊。只需要更新技術指南，如後面所述。

**建立堆疊**

1. 開啟 [OpsWorks Stacks 主控台](https://console.aws.amazon.com/opsworks/)，然後選擇 **Add Stack (新增堆疊)**。指定下列設定，並接受其他設定的預設值，然後選擇 **Add Stack (新增堆疊)**。
   + **名稱** – S3Download
   + **區域** – 美國西部 （奧勒岡）

     此範例適用於任何區域，但我們建議您使用美國西部 （奧勒岡） 進行教學課程。
   + **預設作業系統** – Microsoft Windows Server 2012 R2

1. 選擇 **Add a layer (新增 layer)**，並[新增自訂 layer](workinglayers-custom.md) 至具有下列設定的堆疊。
   + **名稱** – S3Download
   + **簡短名稱** – s3download

1. [新增全年無休執行個體](workinginstances-add.md) (具有預設設定) 至 S3Download layer，以及[啟動它](workinginstances-starting.md)。

您現在可以安裝並執行配方

**執行配方**

1. [編輯堆疊以啟用自訂技術指南](workingcookbook-installingcustom-enable.md)，然後指定下列設定。
   + **儲存庫類型** – **S3 Archive**。
   + **儲存庫 URL** – 您先前記錄的技術指南的封存 URL。

   接受其他設定的預設值，然後選擇 **Save (儲存)** 以更新堆疊組態。

1. [執行更新自訂技術指南堆疊命令](workingstacks-commands.md)，以在堆疊線上執行個體上安裝最新版的自訂技術指南。如果存在舊版的技術指南，則此命令會予以覆寫。

1. 使用配方執行**執行執行配方**堆疊命令**以執行設定為 的配方****s3download::default**。此命令會啟動 Chef 執行，內含包含 `s3download::default` 的回合清單。
**注意**  
您通常會讓 OpsWorks Stacks 透過將配方指派給適當的生命週期事件來[自動執行](workingcookbook-assigningcustom.md)配方。您也可以手動觸發事件來執行這類配方。您可以使用堆疊命令來觸發安裝和設定事件，以及使用[部署命令](workingapps-deploying.md)來觸發部署和解除部署事件。

成功執行配方之後，您就可以驗證配方。

**驗證 s3download**

1. 第一步是檢查 Chef 日誌。您的堆疊應該有一個名為 s3download1 的執行個體。在**執行個體**頁面上，選擇在執行個體的**日誌**欄中**顯示** ，以顯示 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` 的內容。