

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

# 範例 9：使用 Amazon EC2 執行個體
<a name="cookbooks-101-basics-ec2"></a>

**重要**  
 AWS OpsWorks Stacks 此服務已於 2024 年 5 月 26 日終止，並已針對新客戶和現有客戶停用。我們強烈建議客戶盡快將其工作負載遷移至其他解決方案。如果您對遷移有任何疑問，請透過 [AWS re：Post](https://repost.aws/) 或透過 [AWS Premium Support](https://aws.amazon.com/support) 聯絡 AWS 支援 團隊。

此時，您一直在本機的 VirtualBox 中執行執行個體。雖然這快速又簡單，但您最終會想要在 Amazon EC2 執行個體上測試配方。特別是，如果您想要在 Amazon Linux 上執行配方，它只能在 Amazon EC2 上使用。您可以使用類似的系統，例如 CentOS 進行初步實作和測試，但在 Amazon Linux 上完整測試配方的唯一方法是使用 Amazon EC2 執行個體。

本主題說明如何在 Amazon EC2 執行個體上執行配方。Test Kitchen 和 Vagrant 的使用方法和前面各節差不多，但有兩點不同：
+ 驅動程式是 [https://rubygems.org/gems/kitchen-ec2](https://rubygems.org/gems/kitchen-ec2)，不是 Vagrant。
+ 技術指南`.kitchen.yml`的檔案必須設定啟動 Amazon EC2 執行個體所需的資訊。

**注意**  
另一種方法是使用 `vagrant-aws` Vagrant 外掛程式。如需詳細資訊，請參閱 [Vagrant AWS 提供者](https://github.com/mitchellh/vagrant-aws)。

您需要 AWS 登入資料才能建立 Amazon EC2 執行個體。如果您沒有 AWS 帳戶，您可以取得一個，如下所示。

## 註冊 AWS 帳戶
<a name="sign-up-for-aws"></a>

如果您沒有 AWS 帳戶，請完成下列步驟來建立一個。

**註冊 AWS 帳戶**

1. 開啟 [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)。

1. 請遵循線上指示進行。

   部分註冊程序需接收來電或簡訊，並在電話鍵盤輸入驗證碼。

   當您註冊 時 AWS 帳戶，*AWS 帳戶根使用者*會建立 。根使用者有權存取該帳戶中的所有 AWS 服務 和資源。作為安全最佳實務，請將管理存取權指派給使用者，並且僅使用根使用者來執行[需要根使用者存取權的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

AWS 會在註冊程序完成後傳送確認電子郵件給您。您可以隨時登錄 [https://aws.amazon.com/](https://aws.amazon.com/) 並選擇**我的帳戶**，以檢視您目前的帳戶活動並管理帳戶。

## 建立具有管理存取權的使用者
<a name="create-an-admin"></a>

註冊 後 AWS 帳戶，請保護 AWS 帳戶根使用者、啟用 AWS IAM Identity Center和建立 管理使用者，以免將根使用者用於日常任務。

**保護您的 AWS 帳戶根使用者**

1.  選擇**根使用者**並輸入 AWS 帳戶 您的電子郵件地址，以帳戶擁有者[AWS 管理主控台](https://console.aws.amazon.com/)身分登入 。在下一頁中，輸入您的密碼。

   如需使用根使用者登入的說明，請參閱 *AWS 登入 使用者指南*中的[以根使用者身分登入](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 若要在您的根使用者帳戶上啟用多重要素驗證 (MFA)。

   如需說明，請參閱《*IAM 使用者指南*》中的[為您的 AWS 帳戶 根使用者 （主控台） 啟用虛擬 MFA 裝置](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**建立具有管理存取權的使用者**

1. 啟用 IAM Identity Center。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[啟用 AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，將管理存取權授予使用者。

   如需使用 IAM Identity Center 目錄 做為身分來源的教學課程，請參閱*AWS IAM Identity Center 《 使用者指南*》中的[使用預設值設定使用者存取 IAM Identity Center 目錄](https://docs.aws.amazon.com/singlesignon/latest/userguide/quick-start-default-idc.html)。

**以具有管理存取權的使用者身分登入**
+ 若要使用您的 IAM Identity Center 使用者簽署，請使用建立 IAM Identity Center 使用者時傳送至您電子郵件地址的簽署 URL。

  如需使用 IAM Identity Center 使用者登入的說明，請參閱*AWS 登入 《 使用者指南*》中的[登入 AWS 存取入口網站](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**指派存取權給其他使用者**

1. 在 IAM Identity Center 中，建立一個許可集來遵循套用最低權限的最佳實務。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[建立許可集](https://docs.aws.amazon.com/singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 將使用者指派至群組，然後對該群組指派單一登入存取權。

   如需指示，請參閱《AWS IAM Identity Center 使用者指南》**中的[新增群組](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)。

您應該[建立具有存取 Amazon EC2 許可的 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)，並將使用者的存取和私密金鑰儲存至工作站上的安全位置。 Amazon EC2 Test Kitchen 會使用這些登入資料建立執行個體。向 Test Kitchen 提供登入資料，最好是將金鑰指派給您工作站的下列環境變數。

**警告**  
IAM 使用者具有長期憑證，這會造成安全風險。為了協助降低此風險，建議您只為這些使用者提供執行任務所需的許可，並在不再需要這些使用者時將其移除。
+ AWS\$1ACCESS\$1KEY – 使用者的存取金鑰，看起來像 AKIAIOSFODNN7EXAMPLE。
+ AWS\$1SECRET\$1KEY – 使用者的私密金鑰，看起來像 wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY。

此方法可以減少意外危害您帳戶的機率，例如，將包含您登入資料的專案上傳到公有儲存庫。

**設定技術指南**

1. 若要使用 `kitchen-ec2` 驅動程式，您必須在您的系統上安裝 `ruby-dev` 套件。下列範例命令說明如何使用 `aptitude` 將套件安裝在 Ubuntu 系統。

   ```
   sudo aptitude install ruby1.9.1-dev 
   ```

1. `kitchen-ec2` 驅動程式是 Gem 套件，安裝方式如下：

   ```
   gem install kitchen-ec2
   ```

   視您的工作站而定，此命令可能需要 `sudo`，或者您也可以使用 Ruby 環境管理員，例如 [RVM](https://rvm.io/)。此程序已經 `kitchen-ec2` 驅動程式 0.8.0 版測試，但現有更新版本。若要安裝[特定版本](https://rubygems.org/gems/kitchen-ec2/versions)，請執行 `gem install kitchen-ec2 -v <version number>`。

1. 您必須指定 Test Kitchen 可用來連線至執行個體的 Amazon EC2 SSH 金鑰對。如果您沒有 Amazon EC2 金鑰對，請參閱 [Amazon EC2 金鑰對，以取得如何建立金鑰對](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)的資訊。請注意，金鑰對必須屬於與執行個體相同的 AWS 區域。此範例使用美國西部 （加利佛尼亞北部）。

   在您選取金鑰對後，請建立名為 `opsworks_cookbooks` 的 `ec2_keys` 子目錄，將金鑰對的私有金鑰 (`.pem`) 檔案複製到該子目錄。請注意，將私有金鑰放在 `ec2_keys` 中，只為方便略微簡化程式碼，它可在您系統上的任何位置。

1. 建立並導覽至名為 `createdir-ec2` 的 `opsworks_cookbooks` 子目錄。

1. 將 `metadata.rb` 檔案新增至具有以下內容的 `createdir-ec2`。

   ```
   name "createdir-ec2"
   version "0.1.0"
   ```

1. 初始化 Test Kitchen，如[範例 1：安裝套件](cookbooks-101-basics-packages.md)中所述。下一節說明如何設定 `.kitchen.yml`，這對於 Amazon EC2 執行個體來說更為複雜。

1. 將 `recipes` 子目錄新增至 `createdir-ec2`。

## 為 Amazon EC2 設定 .kitchen.yml
<a name="w2ab1c14c71b9c15c17c31c37"></a>

您可以使用`kitchen-ec2`驅動程式啟動適當設定`.kitchen.yml`之 Amazon EC2 執行個體所需的資訊來設定 。以下是美國西部 （加利佛尼亞北部） 區域中 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:
```

您可以使用 `provisioner` 和 `suites` 區段的預設設定，但必須修改預設的 `driver` 和 `platforms` 設定。此範例使用最少的設定清單，接受餘數的預設值。如需完整的 `kitchen-ec2` 設定清單，請參閱 [Kitchen::Ec2：適用於 Amazon EC2 的 Test Kitchen 驅動程式](https://github.com/test-kitchen/kitchen-ec2)。

此範例設定下列 `driver` 屬性。假設您已將使用者存取金鑰和秘密金鑰指派給標準環境變數，如前所述。驅動程式預設使用這些金鑰。否則，您必須將 `aws_access_key_id` 和 `aws_secret_access_key` 新增至 `driver` 屬性，設為適當的金鑰值，明確指定金鑰。

**name**  
(必要) 此屬性必須設定為 `ec2`。

**aws\$1ssh\$1key\$1id**  
（必要） Amazon EC2 SSH 金鑰對名稱，`US-East1`在此範例中名為 。

**transport.ssh\$1key**  
(必要) 您為 `aws_ssh_key_id` 指定之金鑰的私有金鑰 (`.pem`) 檔案。在本範例中，此檔案名為 `US-East1.pem`，位在 `../opsworks/ec2_keys` 目錄中。

**region**  
(必要) 執行個體的 AWS 區域。此範例使用美國西部 （加利佛尼亞北部），由 表示`us-west-1`)。

**availability\$1zone**  
(選用) 執行個體的可用區域。如果您省略此設定，Test Kitchen 會使用指定區域的預設可用區域，`us-west-1b`即美國西部 （加利佛尼亞北部）。不過，您的帳戶可能無法使用預設區域。在這種情況下，您必須明確指定可用區域。發生這種情況時，用來準備範例的帳戶不會支援 `us-west-1b`，所以範例會明確指定 `us-west-1c`。

**require\$1chef\$1omnibus**  
設為 `true` 時，此設定會確保使用 omnibus 安裝程式在所有平台執行個體上安裝 `chef-client`。

**security\$1group\$1ids**  
(選用) 套用到執行個體的安全群組 ID 清單。此設定會將 `default` 安全群組套用到執行個體。請確定安全群組傳入規則允許送入 SSH 連線，否則 Test Kitchen 無法與執行個體通訊。如果您使用 `default` 安全群組，您可能需要因應情況編輯它。如需詳細資訊，請參閱 [Amazon EC2 安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)。

**subnet\$1id**  
執行個體的目標子網路 ID (如適用)。

**associate\$1public\$1ip**  
如果您想要能夠從網際網路存取執行個體，則可以讓 Amazon EC2 將公有 IP 地址與執行個體建立關聯。

**interface**  
您用來存取執行個體的主機名稱組態類型。有效值為 `dns`、`public`、`private` 或 `private_dns`。如果您不指定此屬性的值，`kitchen-ec2` 會以下列順序設定主機名稱組態。如果略過此屬性，即不設定組態類型。  

1. DNS 名稱

1. 公有 IP 地址

1. 私有 IP 地址

1. 私有 DNS 名稱

**重要**  
您應該建立使用者並將這些登入資料提供給 Test Kitchen，而不是將您的帳戶登入資料用於存取和私密金鑰。如需詳細資訊，請參閱[管理 AWS 存取金鑰的最佳實務](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html)。  
請小心不要將 `.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

如果您想要使用一或多個這些平台，請將適當的平台名稱新增至 `platforms`。`kitchen-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 使用者名稱。

  針對 Amazon Linux，請使用 `ec2-user`。其他 AMI 可能會有不同的使用者名稱。

以範例取代 `.kitchen.yml` 中的程式碼，將適當的值指派給帳戶專屬屬性，例如 `aws_access_key_id`。

## 執行配方
<a name="w2ab1c14c71b9c15c17c31c39"></a>

此範例使用[重複](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-iteration)中的配方。

**執行配方**

1. 使用下列程式碼建立名為 `default.rb` 的檔案，並將它儲存到技術指南的 `recipes` 資料夾。

   ```
   directory "/srv/www/shared" do
     mode 0755
     owner 'root'
     group 'root'
     recursive true
     action :create
   end
   ```

1. 執行 `kitchen converge` 以執行配方。請注意，由於啟動和初始化 Amazon EC2 執行個體所需的時間，此命令的完成時間會比先前的範例更長。

1.  前往 [Amazon EC2 主控台](https://console.aws.amazon.com/ec2/)，選取美國西部 （加利佛尼亞北部）) 區域，然後按一下導覽窗格中**的執行個體**。您會在清單中看到新建立的執行個體。

1. 執行 `kitchen login` 登入執行個體，就像您對在 VirtualBox 中執行的執行個體做的那樣。您會在 `/srv` 下看到新建立的目錄。您也可以使用您最愛的 SSH 用戶端連線到執行個體。