AWSのElassticsearchを利用して、ウェブサイトをEC2インスタンスで公開

##本ページの目的
　Python + Flaskで作成したWEBページをAWSのVPC、EC2、Elassticsearchサービスで公開します。


##前提要件
１、AWSアカウントを所有すること
２、プログラミングの基礎知識を有すること


##目次
[1.VPCの環境構築](#1vpcの環境構築)
[2.EC2環境構築](#2ec2環境構築)
[3.Elasticsearch環境構築](#3elasticsearch環境構築)
[4.EC2の接続](#4ec2の接続)
[5.実行環境の構築](#5実行環境の構築)
[6.公開するため、ポート番号の開放](#6公開するため、ポート番号の開放)
[7.公開サイトにアクセルする](#7公開サイトにアクセルする)

##1.VPCの環境構築
###1.1.今回の環境構築は1個のパブリックサブネットを持つVPCとを作成します。
(1)AWSのコンソールへログイン
(2)VPCサービスを選ぶ
(3)「VPCの作成」をクリック
(4)「1個のパブリックサブネットを持つVPC」を選択（図１）
![VPC.png](https://qiita-image-store.s3.amazonaws.com/0/321818/3ff74127-dcde-939e-b7c3-ff2edc619952.png)
　　　　　　　　　　　　　　　　図1　VPC設定の選択

(5)VPCの設定
・VPC名任意、アベイラビリテイーゾーン任意
・他の項目はデフォルト
・「VPCの作成」をクリック
![VPC例.png](https://qiita-image-store.s3.amazonaws.com/0/321818/029ac97e-106e-bf82-ea86-c19e509797ba.png)
　　　　　　　　　　　　　　　　図2　完成イメージ

###1.2.インタネットに接続するため
・ルートテーブルを編集、インタネットゲットウェアを追加(設定は図3)
＊インタネットゲットウェアがない場合は、まずゲットウェアを作成する必要がある
![getway1.png](https://qiita-image-store.s3.amazonaws.com/0/321818/9879b5ff-ce50-9849-77fc-a9734b3d021a.png)
　　　　　　　　　　　　　　図3　ゲットウェアの設定


###1.3.セキュリティグループの設定
・「セキュリティグループ」をクリック、構築したVPCのセキュリティグループグループを選択
・Inbound Rulesを選択、「Edit」をクリック、「ルールの追加」をクリック
・下記のタイプのルールを追加する（図4）
・「保存」をクリック
![セキュリティグループ.png](https://qiita-image-store.s3.amazonaws.com/0/321818/af48558f-bf67-5a7f-fc36-c0b0dae2203d.png)
　　　　　　　　　　　図4　セキュリティグループの設定

「RDP」：windowsリモートデスクトップのプロトコル
「HTTPS」：elasticsearchにアクセスするためのプロトコル
「8080」：EC2で公開したウェブにアクセスするためのプロトコル



##2.EC2環境構築
###2.1性能上の要求がなければ、今回は無料枠のインスタンスを使います。
(1)「インスタンスの作成」をクリック
(2)「無料利用枠のみ」を選ぶ
(3)「Microsoft Windows Server 2016 Base」を選択、「次の手順」をクリック
(4)インスタンス「t2.micro」を選択、「詳細設定」をクリック
(5)構築したVPCと対応するネットワークとサブネットを選択
(6)自動割り当てパブリック IPを有効化、「確認と作成」を押す
(7)「作成」を押す
![EC2設定.png](https://qiita-image-store.s3.amazonaws.com/0/321818/5a922168-d791-dac9-1a3a-adcdedb5280a.png)
　　　　　　　　　　　　　　図5　EC2設定


###2.2初めてEC2のインスタンを作成する場合は
(1)新しいキーペアの作成、キーペア名を入力し、「ダウンロード」を押す
(2)「インスタンスの作成」、「インスタンスの表示」


##3.Elasticsearch環境構築
(1)Elasticsearchサービスを選択する
(2)ドメイン名任意、次へ
(3)インスタンスタイプはt2.small.elastisearch、次へ
(4)構築したVPCを選択し、設定したEC2インスタンスのサブネット、セキュリティグループを設定
![ES.png](https://qiita-image-store.s3.amazonaws.com/0/321818/5c01c19a-ccf1-e34b-c7f0-0780c91189c8.png)
　　　　　　　　　　　　　　　図6　elasticsearch設定

(5)テンプレートを「IAM認証情報を使用した署名リクエストを要求しない」に設定
(6)設定内容を確認し、確認を押す
(7)構築が完了するまで、10分かかる


##4.EC2の接続
(1)EC2サービスを選んで、「インスタンス」を選択
(2)作成したインスタンスに右クリックし、「接続」を選択
(3)「リモートデスクトップファイルのダウンロード」をクリック
(4)「パスワードの取得」、「キーペアのパス」、「パスワードの複号」をクリック
(5)複号したパスワードをメモする
(6)「リモートデスク」のアプリをクリック、記録したパスワードを入力、「OK」

##5.実行環境の構築
###5.1簡易書籍管理システム
(1)EC2インスタンスにログインする
(2)Pythonをインストール

(4)簡易な書籍管理システムをダウンロードする（下記のURL、使い方readme.md）
https://github.com/michihosokawa/MiniBookManagementSystem

###5.2Elasticsearchインデックスの設定
(1)「ElasticsearchWrapper.py」ファイルの21行目を修正（エンドポイントは図7）

    編集前：self.es=Elasticsearch("localhost:9200")
    編集後：self.es=Elasticsearch("VPCエンドポイント:443")


![Screenshot-2017-10-16-18.56.42.png](https://qiita-image-store.s3.amazonaws.com/0/321818/1b646dcf-6ae1-d44a-85b7-207456b6451f.png)
　　　　　　　　　　　　図7　エンドポイントのイメージ


(2)コマンドラインで「「pip install elasticsearch」を実行
(3)システムのフォルダで「Python initialize.py」を実行
＊initializeは2回実行する（一回目は既存のelasticsearchのindexを削除）

###5.3ページの確認
(1)コマンドラインで「pip install flask」を実行
(1)「Python app.py」を実行
＊moduleエラーが出た場合は「pip install　モジュール名」を実行
(2)localhost:8080をブラウザ(chrome)で確認（図8）
![書籍追加.png](https://qiita-image-store.s3.amazonaws.com/0/321818/650083ec-7180-dc80-1884-b7638a1da527.png)
　　　　　　　　　　     　 　図8　簡易書籍・追加ページ

##6.公開するため、ポート番号の開放
AWSの無料枠のwindowsはポートが開放されていないため、443と8080ポートを開放する必要があります。ポートの開放方法について、グッグルで調べてください。

##7.公開サイトにアクセルする
(1)EC2インスタンの公開IPアドレスをメモする（公開IPの記載場所は下記の図）
(2)自分の端末のブラウザ（chrome）に「公開IP:443」を入力して実行（図9）
![公開IP.png](https://qiita-image-store.s3.amazonaws.com/0/321818/271f2b7a-cddd-021f-a4d0-2775ead68c49.png)
　　　　　　　　　　　　　　　図9　公開IPアドレス

(3)図8の画面が表示されたら、おめでとう構築が成功しました。