

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

# 步驟 3：使用 DynamoDB 服務在生產環境中部署
<a name="TicTacToe.Phase3"></a>

**Topics**
+ [3.1：建立 Amazon EC2 的 IAM 角色](#TicTacToe.DeployInProd.IAMCreateRole)
+ [3.2：在 Amazon DynamoDB 中建立遊戲資料表](#TicTacToe.DeployInProd.CreateTable)
+ [3.3：組合及部署井字遊戲應用程式的程式碼](#TicTacToe.DeployInProd.IAMBundleDeployCode)
+ [3.4：設定 AWS Elastic Beanstalk 環境](#TicTacToe.DeployInProd.SetUpElasticBeanstalk)

在先前的章節中，您已在電腦本機上使用 DynamoDB 本機版部署和測試井字遊戲應用程式。現在，您會在生產環境中部署應用程式，如下所示：
+ 使用easy-to-use的服務來部署應用程式 AWS Elastic Beanstalk，以部署和擴展 Web 應用程式和服務。如需詳細資訊，請參閱[將 flask 應用程式部署至 AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html)。

  Elastic Beanstalk 會啟動一或多個 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體，您可以透過 Elastic Beanstalk 加以設定，且您的井字遊戲應用程式也會在這些執行個體上執行。
+ 使用 Amazon DynamoDB 服務，建立位於 AWS 上而非您電腦本機上的 `Games` 資料表。

此外，您也必須設定許可。您建立的任何 AWS 資源，例如 DynamoDB 中的 `Games` 資料表，預設都是私有的。只有資源擁有者 (即建立 `Games` 資料表的 AWS 帳戶) 才能存取此資料表。因此根據預設，您的井字遊戲應用程式無法更新 `Games` 資料表。

若要授予必要的許可，您可以建立 AWS Identity and Access Management (IAM) 角色，並授予此角色存取`Games`資料表的許可。您的 Amazon EC2 執行個體首先會擔任此角色。作為回應， AWS 會傳回 Amazon EC2 執行個體可用來代表 Tic-Tac-Toe 應用程式更新`Games`資料表的暫時安全登入資料。當您設定 Elastic Beanstalk 應用程式時，您可以指定 Amazon EC2 執行個體可以擔任的 IAM 角色。如需 IAM 角色的詳細資訊，請參閱 *Amazon EC2 使用者指南*中的 [Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。

**注意**  
為 Tic-Tac-Toe 應用程式建立 Amazon EC2 執行個體之前，您必須先決定您希望 Elastic Beanstalk 建立執行個體 AWS 的區域。在您建立 Elastic Beanstalk 應用程式後，您要在組態檔案中提供同一個區域名稱和端點。井字遊戲應用程式會使用此檔案中的資訊，來建立 `Games` 資料表，並在特定的 AWS 區域中傳送後續請求。DynamoDB `Games` 資料表和 Elastic Beanstalk 啟動的 Amazon EC2 執行個體皆必須位於同一個區域。如需可用區域清單，請參閱 *Amazon Web Services 一般參考* 中的 [Amazon DynamoDB](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region)。

總而言之，您會執行下列作業，以在生產環境中部署井字遊戲應用程式：

1. 使用 IAM 服務建立 IAM 角色。您會將政策連接到此角色，授予 DynamoDB 動作的許可，使其可存取 `Games` 資料表。

1. 將井字遊戲應用程式的程式碼和組態檔案組合，並建立 `.zip` 檔案。您會使用這個 `.zip` 檔案，將井字遊戲應用程式的程式碼提供給 Elastic Beanstalk，以放置在您的伺服器上。如需建立套件的詳細資訊，請參閱《AWS Elastic Beanstalk 開發人員指南》中的[建立應用程式來源套件](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deployment.source.html)。

   在組態檔案 (`beanstalk.config`) 中，您要提供 AWS 區域和端點的資訊。井字遊戲應用程式會使用此資訊判斷要通訊的 DynamoDB 區域。

1. 設定 Elastic Beanstalk 環境。Elastic Beanstalk 會啟動一或多個 Amazon EC2 執行個體，並在上面部署您的井字遊戲應用程式套件。Elastic Beanstalk 環境就緒後，您要新增 `CONFIG_FILE` 環境變數，來提供組態檔案名稱。

1. 建立 DynamoDB 資料表。使用 Amazon DynamoDB 服務，您可以在 上建立`Games`資料表 AWS，而不是在本機電腦上建立資料表。請記得，此資料表具有由字串類型之 `GameId` 分割區索引鍵組成的簡易主索引鍵。

1. 在生產環境中測試遊戲。

## 3.1：建立 Amazon EC2 的 IAM 角色
<a name="TicTacToe.DeployInProd.IAMCreateRole"></a>

建立 **Amazon EC2** 類型的 IAM 角色，可讓執行您井字遊戲應用程式的 Amazon EC2 執行個體擔任正確的角色，並發出應用程式請求，來存取 `Games` 資料表。當您建立角色時，請選擇 **Custom Policy** (自訂政策) 選項，並將下列政策複製並貼上。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Action":[
            "dynamodb:ListTables"
         ],
         "Effect":"Allow",
         "Resource":"*"
      },
      {
         "Action":[
            "dynamodb:*"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:dynamodb:us-west-2:922852403271:table/Games",
            "arn:aws:dynamodb:us-west-2:922852403271:table/Games/index/*"
         ]
      }
   ]
}
```

------

如需進一步說明，請參閱《*IAM 使用者指南*》中的[為 AWS 服務 (AWS 管理主控台) 建立角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

## 3.2：在 Amazon DynamoDB 中建立遊戲資料表
<a name="TicTacToe.DeployInProd.CreateTable"></a>

DynamoDB 中的 `Games` 資料表會存放遊戲資料。若沒有該資料表，應用程式會為您建立資料表。在此案例中，我們會讓應用程式建立 `Games` 資料表。

## 3.3：組合及部署井字遊戲應用程式的程式碼
<a name="TicTacToe.DeployInProd.IAMBundleDeployCode"></a>

若您遵循此範例的步驟，則您已有下載完成的井字遊戲應用程式。若沒有，請下載應用程式，並將所有檔案解壓縮到您本機電腦上的資料夾。如需指示，請參閱 [步驟 1：在本機上部署及測試](TicTacToe.Phase1.md)。

當您解壓縮所有檔案後，您會有一個 `code` 資料夾。若要將此資料夾傳遞給 Elastic Beanstalk，您要將此資料夾的內容組合成 `.zip` 檔案。首先，請在該資料夾新增組態檔案。您的應用程式會使用區域和端點的資訊在指定區域中建立 DynamoDB 資料表，並使用指定端點發出後續的資料表操作請求。

1. 切換到您下載井字遊戲應用程式的所在資料夾。

1. 在應用程式的根資料夾中，使用下列內容建立名為 `beanstalk.config` 的文字檔案。

   ```
   [dynamodb]
   region={{<AWS region>}}
   endpoint={{<DynamoDB endpoint>}}
   ```

   例如，您可以使用下列內容。

   ```
   [dynamodb]
   region=us-west-2
   endpoint=dynamodb.us-west-2.amazonaws.com
   ```

   如需可用區域清單，請參閱《Amazon Web Services 一般參考》**中的 [Amazon DynamoDB](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region)。
**重要**  
組態檔案中指定的區域為井字遊戲應用程式在 DynamoDB 中建立 `Games` 資料表的位置。您必須在同一個區域中建立下一節討論的 Elastic Beanstalk 應用程式。
**注意**  
當您建立 Elastic Beanstalk 應用程式時，您要請求啟動您可選擇類型的環境。若要測試井字遊戲範例應用程式，您可以選擇 **Single Instance** (單一執行個體) 環境類型，並跳過下列步驟，進行下一步。  
但是，**Load balancing, autoscaling** (負載平衡、自動擴展) 環境類型可提供具高可用性且具可擴展性的環境，您應在建立和部署其他應用程式時加以考慮。若您選擇此環境類型，您還要產生 UUID，並將其新增到組態檔案，如下所示。  

   ```
   [dynamodb]
   region=us-west-2
   endpoint=dynamodb.us-west-2.amazonaws.com
   [flask]
   secret_key= 284e784d-1a25-4a19-92bf-8eeb7a9example
   ```
在用戶端與伺服器端的通訊中，當伺服器傳送回應時，基於安全性考量，伺服器會傳送簽署過的 Cookie，讓用戶端在下次請求時傳回伺服器。當只有一個伺服器時，伺服器可在啟動時於本機產生加密金鑰。當有多個伺服器時，他們都必須知道同一個加密金鑰，否則無法讀取對等伺服器設定的 Cookie。將 `secret_key` 新增到組態檔案，可以告知所有伺服器使用此加密金鑰。

1. 壓縮應用程式根資料夾的內容 (其中包含 `beanstalk.config` 檔案)，例如 `TicTacToe.zip`。

1. 將 `.zip` 檔案上傳到 Amazon Simple Storage Service (Amazon S3) 儲存貯體。在下一節中，您會將此 `.zip` 檔案提供給 Elastic Beanstalk，以上傳到伺服器。

   如需如何上傳檔案至 Amazon S3 儲存貯體的說明，請參閱《Amazon Simple Storage Service 使用者指南》中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)及[新增物件至儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.html)。

## 3.4：設定 AWS Elastic Beanstalk 環境
<a name="TicTacToe.DeployInProd.SetUpElasticBeanstalk"></a>

在此步驟中，您會建立 Elastic Beanstalk 應用程式，其為包含環境的元件集合。針對此範例，您會啟動一個 Amazon EC2 執行個體，以部署並執行您的井字遊戲應用程式。

1. 輸入下列自訂 URL 設定 Elastic Beanstalk 主控台，以設定環境。

   ```
   https://console.aws.amazon.com/elasticbeanstalk/?region={{<AWS-Region>}}#/newApplication
   ?applicationName=TicTacToe{{your-name}}
   &solutionStackName=Python
   &sourceBundleUrl=https://s3.amazonaws.com/{{<bucket-name>}}/{{TicTacToe.zip}}
   &environmentType=SingleInstance
   &instanceType=t1.micro
   ```

   如需自訂 URL 的詳細資訊，請參閱《AWS Elastic Beanstalk 開發人員指南》**中的[建構立即啟動 URL](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/launch-now-url.html)。在 URL 方面，請注意下列事項：
   + 您必須提供 AWS 區域名稱 （與您在組態檔案中提供的名稱相同）、Amazon S3 儲存貯體名稱和物件名稱。
   + 為進行測試，URL 會請求 **SingleInstance** 環境類型及 `t1.micro` 執行個體類型。
   + 應用程式名稱必須是唯一的。因此，在先前的 URL 中，建議您在 `applicationName` 之前加上您的名稱。

   執行此操作會開啟 Elastic Beanstalk 主控台。在某些案例中，您可能需要登入。

1. 在 Elastic Beanstalk 主控台中，選擇 **Review and Launch** (檢閱和啟動)，然後選擇 **Launch** (啟動)。

1. 請記下 URL，以供未來參考。此 URL 會開啟您的井字遊戲應用程式首頁。  
![顯示首頁上具有環境正在建立訊息的應用程式螢幕擷取畫面。](https://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-50.png)

1. 設定井字遊戲應用程式，讓其可得知組態檔案的位置。

   Elastic Beanstalk 建立應用程式後，請選擇 **Configuration** (組態)。

   1. 選擇 **Software Configuration** (軟體組態) 旁邊的齒輪圖示，如下列螢幕擷取畫面所示。  
![軟體組態旁顯示齒輪圖示的井字遊戲應用程式螢幕擷取畫面。](https://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-60.png)

   1. 在 **Environment Properties** (環境屬性) 區段的結尾，輸入 **CONFIG\_FILE** 及其值 **beanstalk.config**，然後選擇 **Save** (儲存)。

      完成環境更新需要幾分鐘的時間。  
![顯示環境屬性區段的應用程式螢幕擷取畫面。](https://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-70.png)

   更新完成後，您便可以玩遊戲。

1. 在瀏覽器中，輸入您在先前步驟中複製的 URL，如下列範例所示。

   ```
   http://{{<pen-name>}}.elasticbeanstalk.com
   ```

   執行此作業會開啟應用程式首頁。  
![顯示建立按鈕、邀請、進行中遊戲和最近歷程記錄的應用程式首頁螢幕擷取畫面。](https://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-10.png)

1. 以 testuser1 登入，然後選擇 **CREATE (建立)**，以開始新的井字遊戲。

1. 在 **Choose an Opponent** (選擇對手) 方塊中輸入 **testuser2**。  
![顯示選擇對手方塊的應用程式螢幕擷取畫面。](https://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-20.png)

1. 開啟另一個瀏覽器視窗。

   確認您已清除您瀏覽器視窗中的所有 Cookie，以免使用同一個使用者登入。

1. 輸入同一個 URL，以開啟應用程式首頁，如下列範例所示。

   ```
   http://{{<env-name>}}.elasticbeanstalk.com
   ```

1. 以 testuser2 登入。

1. 針對待定邀請清單中 testuser1 發送的邀請，選擇 **accept** (接受)。  
![邀請清單有 testuser1 邀請的應用程式螢幕擷取畫面。](https://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-30.png)

1. 現在遊戲頁面便會出現。  
![顯示空白井字遊戲網格的應用程式螢幕擷取畫面。](https://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-40.png)

   testuser1 和 testuser2 都可玩遊戲。每移動一步，應用程式就會將該移動儲存在 `Games` 資料表中的對應項目裡。