

# ステップ 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: tic-tac-toe アプリケーションコードのバンドルとデプロイ](#TicTacToe.DeployInProd.IAMBundleDeployCode)
+ [3.4: AWS Elastic Beanstalk 環境の設定](#TicTacToe.DeployInProd.SetUpElasticBeanstalk)

前のセクションでは、DynamoDB local を使用して、ローカルコンピュータ上で Tic-Tac-Toe アプリケーションをデプロイし、テストを行いました。ここでは、次のようにして本稼働環境でアプリケーションをデプロイします。
+ ウェブアプリケーションやサービスをデプロイ、スケーリングするための使いやすいサービスである AWS Elastic Beanstalk を使用して、アプリケーションをデプロイします。詳細については、「[AWS Elastic Beanstalk への Flask アプリケーションのデプロイ](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html)」を参照してください。

  Elastic Beanstalk により、1 つ以上の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスが起動されます。Tic-Tac-Toe の設定は、そのアプリケーションが実行される Elastic Beanstalk を通じて行われます。
+ Amazon DynamoDB サービスを使用して、ローカルのコンピュータ上ではなく、AWS 上に `Games` テーブルを作成します。

さらに、アクセス許可も設定する必要があります。DynamoDB の `Games` テーブルなど、ここで作成する AWS リソースは、デフォルトでプライベートになります。リソース所有者 (`Games` テーブルを作成した AWS アカウント) のみが、このテーブルにアクセスできます。したがって、デフォルトでは Tic-Tac-Toe アプリケーションは `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 アプリケーションの作成が完了したら、その作成先と同じリージョン名とエンドポイントを設定ファイルで指定します。Tic-Tac-Toe アプリケーションはこのファイルの情報を使用して `Games` テーブルを作成し、それ以降のリクエストを特定の AWS リージョンに送信します。Elastic Beanstalk が起動する DynamoDB `Games` テーブルと Amazon EC2 インスタンスの両方が同じリージョンにある必要があります。　 利用可能なリージョンのリストについては、「*Amazon Web Services 全般のリファレンス*」の「[Amazon DynamoDB](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region)」を参照してください。

要約すると、Tic-Tac-Toe アプリケーションを本稼働環境にデプロイするには、以下の作業を行います。

1. IAM サービスを使用して、IAM ロールを作成します。DynamoDB アクションが `Games` テーブルにアクセスするためのアクセス許可を付与するポリシーを、このロールにアタッチします。

1. Tic-Tac-Toe アプリケーションコードおよび設定ファイルをバンドルし、`.zip` ファイルを作成します。この `.zip` ファイルを使用して、サーバーに配置する Tic-Tac-Toe アプリケーションコードを Elastic Beanstalk に渡します。バンドルの作成に関する詳細については、「*AWS Elastic Beanstalk デベロッパーガイド*」の「[アプリケーションソースバンドルを作成する](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deployment.source.html)」を参照してください。

   設定ファイル (`beanstalk.config`) で、AWS リージョンおよびエンドポイント情報を指定します。Tic-Tac-Toe アプリケーションは、この情報を使用して、通信の対象となる DynamoDB リージョンを決定します。

1. Elastic Beanstalk 環境をセットアップします。Elastic Beanstalk により、Amazon EC2 インスタンス、もしくは他のインスタンスが起動され、それらの上で Tic-Tac-Toe アプリケーションバンドルがデプロイされます。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 ロールを作成すると、Tic-Tac-Toe アプリケーションを実行している 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: tic-tac-toe アプリケーションコードのバンドルとデプロイ
<a name="TicTacToe.DeployInProd.IAMBundleDeployCode"></a>

この例のステップを実行した場合、既に Tic-Tac-Toe アプリケーションをダウンロードしています。そうでない場合は、アプリケーションをダウンロードし、すべてのファイルをローカルコンピュータ上のフォルダに展開します。手順については、「[ステップ 1: ローカルにデプロイおよびテストを実行します](TicTacToe.Phase1.md)」を参照してください。

すべてのファイルを展開すると、`code` フォルダが作成されます。このフォルダを Elastic Beanstalk に引き渡すには、このフォルダのコンテンツを `.zip` ファイルとしてバンドルします。最初に、そのフォルダに設定ファイルを追加します。アプリケーションは、リージョンとエンドポイント情報を使用して、指定されたリージョンで DynamoDB テーブルを作成します。さらに、指定されたエンドポイントを使用しながら、それ以降のテーブルオペレーションをリクエストします。

1. Tic-Tac-Toe アプリケーションをダウンロードしたフォルダに切り替えます。

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)」を参照してください 
**重要**  
設定ファイルで指定されたリージョンは、Tic-Tac-Toe アプリケーションが DynamoDB の `Games` テーブルを作成する場所です。次のセクションで説明する Elastic Beanstalk アプリケーションを、同じリージョンで作成する必要があります。
**注記**  
Elastic Beanstalk アプリケーションを作成する際には、環境タイプを選択しながら、その環境を起動するリクエストを行います。Tic-Tac-Toe サンプルアプリケーションをテストするには、[**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 を送信します。サーバーが 1 台のみの場合、サーバーは、起動時にローカルに暗号化キーを生成できます。多くのサーバーがある場合、それらのサーバーはすべて同じ暗号化キーを知る必要があります。そうしない場合、ピアサーバーによって設定された Cookie を読み取ることができません。`secret_key` を設定ファイルに追加することで、この暗号化キーを使用するようにすべてのサーバーに伝えます。

1. アプリケーションのルートフォルダのコンテンツを、(`beanstalk.config` ファイルも含めながら) Zip で圧縮します。たとえば `TicTacToe.zip` などとします。

1. Amazon Simple Storage Service (Amazon S3) バケットに、`.zip` ファイルをアップロードします。次のセクションで、この `.zip` ファイルを 1 つ以上のサーバーにアップロードするために 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 アプリケーションを作成します。この例では、1 つの Amazon EC2 インスタンスを起動して、Tic-Tac-Toe アプリケーションをデプロイし実行します。

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 デベロッパーガイド*の「[Launch Now 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 により、Tic-Tac-Toe アプリケーションのホームページが開きます。  
![ホームページに環境を作成中のメッセージを表示するアプリケーションのスクリーンショット。](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-50.png)

1. Tic-Tac-Toe アプリケーションを設定し、設定ファイルの場所を指定します。

   Elastic Beanstalk によりアプリケーションが作成されたら、**[Configuration]** (設定) を選択します。

   1. 次のスクリーンショットに示すように、[**Software Configuration (ソフトウェア設定)**] の横にある歯車のアイコンを選択します。  
![ソフトウェア設定の横に歯車アイコンを表示する Tic-Tac-Toe アプリケーションのスクリーンショット。](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-60.png)

   1. [**Environment Properties (環境プロパティ)**] セクションの最後で、**CONFIG\_FILE** とその値 **beanstalk.config** を入力し、[**Save (保存)**] を選択します。

      この環境の更新が完了するには数分かかる場合があります。  
![環境プロパティセクションを表示するアプリケーションのスクリーンショット。](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-70.png)

   更新が完了したら、ゲームをプレイできます。

1. ブラウザで、前のステップでコピーした URL を、以下の例に示すように入力します。

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

   これにより、アプリケーションのホームページが開きます。  
![作成ボタン、招待、進行中のゲーム、最近の履歴を表示するアプリケーションのホームページを示すスクリーンショット。](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-10.png)

1. testuser1 としてログインし、[**作成**] を選択して新しい Tic-Tac-Toe ゲームを開始します。

1. **[Choose an Opponent]** (対戦相手を選択する) ボックスに **testuser2** を入力します。  
![相手を選択するボックスを表示するアプリケーションのスクリーンショット。](http://docs.aws.amazon.com/ja_jp/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 の招待を表示するアプリケーションのスクリーンショット。](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-30.png)

1. これで、ゲームページが表示されます。  
![空の Tic-Tac-Toe グリッドを表示するアプリケーションのスクリーンショット。](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-40.png)

   testuser1 と testuser2 の両者がゲームをプレイできます。動きがあるごとに、アプリケーションは `Games` テーブルの対応する項目に動きを保存します。