AWS EC2インスタンスにFlaskアプリケーションを展開する方法

August 05, 2020
執筆者
Diane Phan
Twilion
レビュー担当者

hot to deploy a flask app to AWS EC2 - jp

この記事はTwilio Developer Voicesチームに所属するDiane Phanが執筆したこちらの記事(英語)を日本語化したものです。

 

初めてTwilioアプリを作成したら成功した。素晴らしいですね。Twilioマジックを使えば驚くに値しません。しかし、Twilioは広く使われているため、ライブサイトに展開してみませんか。そうすれば、ローカルコンピューターで常時アプリを実行する必要はありません。

このチュートリアルを実行して、機能的なFlaskアプリケーションをAmazon Web Services(AWS)に迅速に展開する方法を学びましょう。Web上に、無料で、TwilioとFlaskのライブアプリケーションを公開し、印象付けてみましょう。

チュートリアルの要件

  • Flaskアプリケーションのファイルが含まれたGitHubレポジトリ。AWSに展開するアプリケーションに、保護された環境変数があり、展開準備が整えられていること。基本的なFlaskアプリの開始に支援が必要な場合は、Flaskアプリケーションチュートリアルを参照してください。
  • AWSコンソールの無料のアカウントを作成するか、お持ちのアカウントにサインインする
  • 無料利用枠オプションを超えた場合に備え、AWSにクレジットカードを登録する。AWSでアプリを展開する場合には、特に注意が必要です。月末に超過料金が発生しないようにするため、無料利用枠内に留まるようにします。将来の料金発生を防ぐため、EC2料金ガイドと該当するドキュメントを参照してください。
  • 端末画面でアプリケーションを実行するためのTmux

ユーザーアカウントを作成する  

迅速かつ簡単に展開するため、AWSアカウントを作成します。アカウントにログインし直すときは、RootユーザーまたはIAMユーザーとしてログインします。

Rootユーザーとしてログインし、無制限のアクセス権を必要とするタスクを実行するか、Rootユーザーが持つすべての権限を持つIAMユーザーアカウントを作成することをお勧めします。IAMユーザーは、AWSダッシュボードにて、安全なコントロールアクセス権を持ち作業できます。権限は変更可能です。  

この記事では、必要な作業を実行するために、Rootユーザーとしてログインします。

EC2ダッシュボードを操作する

Webページの上部にある[Services](サービス)タブをクリックします。[Compute](計算)タブの下にある[EC2]をクリックするか、検索バーに名前を入力し、EC2ダッシュボードにアクセスします。

EC2 option on AWS Services dashboard

EC2とは、クラウド内の仮想サーバーで、Twilio Webアプリがある場所です。

Amazon EC2インスタンスを起動する

Webページの[Launch Instance](インスタンスの起動)セクションを探します。以下に示されているように、[Launch Instance](インスタンスの起動)とラベルの付いたオレンジ色のボタンです。セクションに「Note: Your instances will launch in the US East (Ohio) Region」(注意: インスタンスは米国東部(オハイオ州)地域で起動されます)と表示されます。これはお使いのEC2ダッシュボードにより異なることがあります。米国内の開発者の場合には、インスタンスが米国内にあることを確認する必要があります。

Launch an instance button on the EC2 Dashboard

マシンイメージに対し無料利用枠インスタンスを選択する

左の[Quick Start](クイックスタート)の下にある、[Free Tier Only](無料利用枠のみ)オプションを選択します。Amazon Machine Images(AMI)のリストから選択できますが、[Free tier eligible](無料利用枠対象)オプションの付いたUbuntu Serverを選択します。

choose Ubuntu Server on the first step of EC2 instance creation

インスタンスタイプを選択する

[Free tier eligible](無料利用枠対象)オプションの付いたInstanceを選択します。使用するインスタンスを選択したら、[Next: Configure Instance Details](次: インスタンス詳細の構成)をクリックします。

screenshot of step 2: choose an instance type

インスタンス詳細を構成する

デフォルト設定を確認し、[Next: Add Storage](次: ストレージの追加)に進みます。

screenshot of step 3: configure instance details

ストレージを追加する

アプリケーションを実行するために必要なストレージ容量を選択します。無料利用枠対象の顧客は、最大30GBまで使用できます。使用されるストレージは、アプリケーションにより異なります。例えば、アプリケーションで必要とするものが、イメージファイルの保存、負荷の高いグラフィックスのレンダリング、またはユーザーデータの格納である場合には、ストレージ容量が大きくなります。この場合、アプリケーションが無料のGB割り当て量を超えないように注意する必要があります。その月の制限を超えると、料金が発生します。

使用するサイズを選択したら、[Next: Add Tags](次: タグの追加)をクリックします。

screenshot of step 4: add storage

タグを追加する

ユースケースごとにAWSリソースを分類しリソースを追跡しやすくするため、タグが使用されます。これは、大規模プロジェクトに取り組んでおり、AWS請求コストを希望の構造で整理する必要がある場合に該当します。この特定のアプリケーションのためにAWSの使用を一度限りとする予定の場合には、マシンにタグを追加する必要はありません。[Next: Configure Security Group](次: セキュリティグループの構成)に進みます。

screenshot of step 5: add tags

セキュリティグループ

セキュリティの構成は、AWS EC2インスタンスを起動するための、最後のステップです。セキュリティグループの作成が初めてという場合は、[Type](タイプ)の下のドロップダウンで[SSH]を選択します。このセクションのそれ以外の部分は、デフォルトである、ポートが[22][TCP]のままにします。

screenshot of step 6: configure security group

これは、Webアプリケーションで使用できるセキュリティタイプとポートの一例です。世界中の人々にサイトにアクセスしてもらうため、これらのプロトコルの[Source](ソース)を「0.0.0.0/0」に設定します。

以下は、使用すべきセキュリティタイプとプロトコルのリストです。以下のリストにルールを追加することもできます。

Set Type HTTP, Protocol TCP, Port range 80, and Source to “0.0.0.0/0”.

Set Type HTTP, Protocol TCP, Port range 80, and Source to “::/0”.

Set Type Custom TCP, Protocol TCP, Port range 8080, and Source to “0.0.0.0/0”.

Set Type SSH, Protocol TCP, Port range 22, and Source to “0.0.0.0/0”.

Set Type HTTPS, Protocol TCP, Port range 443, and Source to “0.0.0.0/0”.

起動し、キーペアを作成する

[Review and Launch](レビューし起動)をクリックし、プロジェクトのセキュリティグループを確認します。設定を確認し、[Launch](起動)をクリックすると、既存のキーペアを選択するか、新しいキーペアを作成するかを尋ねられます。

ドロップダウンメニューをクリックし、[Create a new key pair](新しいキーペアの作成)を選択します。これは、お使いのマシンからAWSインスタンスに安全にアクセスするために重要です。キーペアに思い出しやすい名前を付けます。この記事では、キーペアの名前は「diane-twilio-test」です。

キーペアの作成後、[Download Key Pair](キーペアのダウンロード)をクリックします。秘密鍵ファイルがダウンロードされます(.pemファイルの詳細についてはこちらまたは公開キー暗号化についてはこちら)。.pemファイルを安全な場所にドラッグします。.pemファイルは、Webアプリケーションにアクセスするための唯一の方法のため、このファイルを安全に保管することが非常に重要です。

screenshot of selecting or creating a key pair

以下は、macOSマシンでの秘密鍵ファイル.pemファイルとも呼ばれる)のスクリーンショットです。

diane-twilio-test.pem icon file

インスタンスを見直し、起動する

AWSダッシュボードが、インスタンスを起動するまで待ちます。[IPv4 Public IP](IPv4公開IP)は、Webアプリケーションにアクセスするために必要なアドレスです。この記事では、インスタンスの公開IPアドレスは「52.15.127.3」です。

[Instance State](インスタンスステート)タブに、緑の丸とともに[running](実行中)が表示されている場合、起動されています。

screenshot of the instance tab on EC2 dashboard

仮想マシンへのSSH

AWSを通じ、作成した仮想マシンにアクセスしましょう。ターミナルを開き、.pemファイルのあるディレクトリを開きます。

プロジェクトディレクトリのコマンドラインに、chmod 600 ./<PEM名>.pemと入力し、秘密鍵ファイルへの読み込み/書き取りアクセスを制限します。

次に、ssh-add ./<PEM名>.pemと入力し、ssh環境を設定します。このコマンドは、SSH秘密鍵をSSH認証エージェントに追加し、シングルサインオンのオプションを設定します。

ターミナルに以下のテキストが表示されます。

Identity added: ./diane-twilio-test.pem (./diane-twilio-test.pem)

EC2インスタンスダッシュボードから、[IPv4 Public IP](IPv4公開IP)のアドレスをコピーし、ssh ubuntu@<IPアドレス>コマンドを入力し、SSHで仮想マシンに接続します。

The authenticity of host '52.15.127.3 (52.15.127.3)' can't be established.
ECDSA key fingerprint is SHA256:q2kuBPkd8i7BuYrwtfzmnCXB6PWNJaVcaQ85RSN9cD8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

「yes」で応答すると、端末シェルがUbuntu shellになります。ルート行は、「ubuntu@ip-172-31-31-102:~$」のようになります。ここで入力するすべてのコマンドは、仮想ubuntuシェルで実行されます。

ubuntuシェルの内側

1つのセッションで複数のウィンドウを開き使用するため、tmuxをインストールします。こうすると、ubuntuシェルから切断した後も、フォアフロントではなくバックグラウンドでアプリを実行するために役立ちます。セッションが存在するため、いつでも展開済みのコードに戻り、変更を加えることができます。

言い換えると、アプリは、AWSに展開するために別のターミナルに接続されます。これについては後述します。以下のコマンドを実行し、Python3やその他の要件に加え、tmuxをUbuntuシェルにインストールします。

$ sudo apt update
$ sudo apt install python3 python3-pip tmux htop

プロジェクトファイルをリモートホストに転送する

SSHで接続するUbuntuシェルの内側に、展開するアプリケーションのディレクトリを作成します。

$ mkdir deployedapp

ターミナルに新しいタブまたはウィンドウを作成し、Ubuntuシェルが1つのタブを、別のタブがマシンのzshまたはbashを使用するようにします。

アプリケーションがあるディレクトリを探します。アプリのディレクトリにrequirements.txtファイルがまだない場合には、ターミナルにpip freeze > requirements.txtと入力し作成します。

そのディレクトリのフルパスを、このサブセクションの最後のコマンドにコピーし、フォルダをローカルからリモートホストに転送します。

アプリケーションの<FULL_PATH>は、/Users/<あなたの名前>/Documents/<アプリのフォルダ>/のようになります。

コマンドの最後のdeployedappは、前に作成したUbuntuシェル内に作成されたフォルダです。

$ sudo rsync -rv <FULL_PATH>/ ubuntu@<YOUR_IP_ADDRESS>:/home/ubuntu/deployedapp

これは、プロジェクトのサイズに基づき数分かかることがあります。

EC2インスタンスにアプリケーションを展開する

別のタブまたはウィンドウのUbuntuシェルに戻ります。ターミナルに、コマンドcd deployedappを入力し、フォルダ内にプロジェクトファイルが表示された場合には、正しく作業できているということです。  

tmuxコマンドを使用し新しいセッションを作成します。これが、アプリケーションがライブで実行される場所です。以下のコマンドで、tmuxセッションの呼び名に私は「mytestapp」を使用しましたが、これは好みの名前にできます。

tmux new -s mytestapp

このコマンドを実行後、「mytestapp」tmuxセッションにリダイレクトされます。これでアプリケーションがEC2サーバー上に設定されたため、アプリケーションに要件をインストールします。

$ pip3 install -r requirements.txt

Flaskアプリケーションが頻繁に仮想環境内で実行される場合には、コマンドsource venv/bin/activateを使用し仮想環境を開始します。そうでない場合には、通常通り、ローカルマシンでアプリケーションを実行します。

(venv) ubuntu@ip-172-31-31-102:~/deployedapp$ flask run --host=0.0.0.0 --port=8080
 * Serving Flask app "app" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 199-963-168

キーボードでCtrl+Bを押し、Dを押し、背景でtmuxセッションを実行し続けます。ターミナルに以下の出力が表示されます。

detached (from session mytestapp)]

何らかの理由でアプリケーションに変更を加える必要がある場合や、アプリケーションを停止する必要がある場合には、以下のコマンドを入力し、「mytestapp」セッションに再接続します。

tmux attach -t mytestapp

またtmuxセッションを背景で実行するには、キーボードでCtrl+Bを押し、Dを押します。何らかの理由でセッションを停止するには、tmuxセッション内でCtrl+Dを押します。

アプリケーションがtmuxセッション内で実行されているか確認できます。ここまでにセッションを停止していない場合には、以下の出力が表示されます。

$ tmux ls
mytestapp: 1 windows (created Wed Jul 29 03:40:00 2020) [112x70]

公開IPv4Public IPアドレスに8080を付けることにより、ライブのアプリケーションを表示できます。この記事の例では、URLは「http://52.15.127.3:8080/」になります。

これで、Ctrl+Cを使用して仮想マシンからログアウトし、新しく展開したアプリケーションを、URLリンクを使用し共有できるようになります。

AWSでプロジェクト展開後の次のステップ

AWSでのFlaskアプリケーションの展開、おめでとうございます!自分のプロジェクト用にカスタマイズされたURLを設定し、ライブプロジェクトを紹介しましょう。チュートリアルURL名の変更方法を参照してください。

AWSをナビゲートするのは容易ではありませんが、皆さんはこのチュートリアルを完了しました。お疲れ様でした。AWSに展開する新しいプロジェクトをお探しの場合には、以下のアイデアをご覧ください。

皆さんが展開したアプリケーションについてぜひお聞かせください!

Diane Phanは、Developer Voicesチームのインターンです。Dianeは、プロジェクト実現の障壁となる困難な問題をプログラマーが解決できるように支援しています。Dianeへのご連絡は、dphan [at] twilio.comまたはLinkedInまでどうぞ。

AWS EC2インスタンスの知識について協力いただいた、Dianeの仕事外の友人の皆さんにこの場を借りてお礼を申し上げます。