AWS EC2インスタンスにFlaskアプリケーションを展開する方法
読む所要時間: 19 分
初めて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とは、クラウド内の仮想サーバーで、Twilio Webアプリがある場所です。
Amazon EC2インスタンスを起動する
Webページの[Launch Instance](インスタンスの起動)セクションを探します。以下に示されているように、[Launch Instance](インスタンスの起動)とラベルの付いたオレンジ色のボタンです。セクションに「Note: Your instances will launch in the US East (Ohio) Region」(注意: インスタンスは米国東部(オハイオ州)地域で起動されます)と表示されます。これはお使いのEC2ダッシュボードにより異なることがあります。米国内の開発者の場合には、インスタンスが米国内にあることを確認する必要があります。
マシンイメージに対し無料利用枠インスタンスを選択する
左の[Quick Start](クイックスタート)の下にある、[Free Tier Only](無料利用枠のみ)オプションを選択します。Amazon Machine Images(AMI)のリストから選択できますが、[Free tier eligible](無料利用枠対象)オプションの付いたUbuntu Serverを選択します。
インスタンスタイプを選択する
[Free tier eligible](無料利用枠対象)オプションの付いたInstanceを選択します。使用するインスタンスを選択したら、[Next: Configure Instance Details](次: インスタンス詳細の構成)をクリックします。
インスタンス詳細を構成する
デフォルト設定を確認し、[Next: Add Storage](次: ストレージの追加)に進みます。
ストレージを追加する
アプリケーションを実行するために必要なストレージ容量を選択します。無料利用枠対象の顧客は、最大30GBまで使用できます。使用されるストレージは、アプリケーションにより異なります。例えば、アプリケーションで必要とするものが、イメージファイルの保存、負荷の高いグラフィックスのレンダリング、またはユーザーデータの格納である場合には、ストレージ容量が大きくなります。この場合、アプリケーションが無料のGB割り当て量を超えないように注意する必要があります。その月の制限を超えると、料金が発生します。
使用するサイズを選択したら、[Next: Add Tags](次: タグの追加)をクリックします。
セキュリティグループ
セキュリティの構成は、AWS EC2インスタンスを起動するための、最後のステップです。セキュリティグループの作成が初めてという場合は、[Type](タイプ)の下のドロップダウンで[SSH]を選択します。このセクションのそれ以外の部分は、デフォルトである、ポートが[22]の[TCP]のままにします。
これは、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アプリケーションにアクセスするための唯一の方法のため、このファイルを安全に保管することが非常に重要です。
以下は、macOSマシンでの秘密鍵ファイル(.pem
ファイルとも呼ばれる)のスクリーンショットです。
インスタンスを見直し、起動する
AWSダッシュボードが、インスタンスを起動するまで待ちます。[IPv4 Public IP](IPv4公開IP)は、Webアプリケーションにアクセスするために必要なアドレスです。この記事では、インスタンスの公開IPアドレスは「52.15.127.3」です。
[Instance State](インスタンスステート)タブに、緑の丸とともに[running](実行中)が表示されている場合、起動されています。
仮想マシンへのSSH
AWSを通じ、作成した仮想マシンにアクセスしましょう。ターミナルを開き、.pem
ファイルのあるディレクトリを開きます。
プロジェクトディレクトリのコマンドラインに、chmod 600 ./<PEM名>.pem
と入力し、秘密鍵ファイルへの読み込み/書き取りアクセスを制限します。
次に、ssh-add ./<PEM名>.pem
と入力し、ssh
環境を設定します。このコマンドは、SSH秘密鍵をSSH認証エージェントに追加し、シングルサインオンのオプションを設定します。
ターミナルに以下のテキストが表示されます。
EC2インスタンスダッシュボードから、[IPv4 Public IP](IPv4公開IP)のアドレスをコピーし、ssh ubuntu@<IPアドレス>
コマンドを入力し、SSHで仮想マシンに接続します。
「yes」で応答すると、端末シェルがUbuntu shellになります。ルート行は、「ubuntu@ip-172-31-31-102:~$」のようになります。ここで入力するすべてのコマンドは、仮想ubuntuシェルで実行されます。
ubuntuシェルの内側
1つのセッションで複数のウィンドウを開き使用するため、tmuxをインストールします。こうすると、ubuntuシェルから切断した後も、フォアフロントではなくバックグラウンドでアプリを実行するために役立ちます。セッションが存在するため、いつでも展開済みのコードに戻り、変更を加えることができます。
言い換えると、アプリは、AWSに展開するために別のターミナルに接続されます。これについては後述します。以下のコマンドを実行し、Python3やその他の要件に加え、tmuxをUbuntuシェルにインストールします。
プロジェクトファイルをリモートホストに転送する
SSHで接続するUbuntuシェルの内側に、展開するアプリケーションのディレクトリを作成します。
ターミナルに新しいタブまたはウィンドウを作成し、Ubuntuシェルが1つのタブを、別のタブがマシンのzshまたはbashを使用するようにします。
アプリケーションがあるディレクトリを探します。アプリのディレクトリにrequirements.txt
ファイルがまだない場合には、ターミナルにpip freeze > requirements.txt
と入力し作成します。
そのディレクトリのフルパスを、このサブセクションの最後のコマンドにコピーし、フォルダをローカルからリモートホストに転送します。
アプリケーションの<FULL_PATH>
は、/Users/<あなたの名前>/Documents/<アプリのフォルダ>/
のようになります。
コマンドの最後のdeployedapp
は、前に作成したUbuntuシェル内に作成されたフォルダです。
これは、プロジェクトのサイズに基づき数分かかることがあります。
EC2インスタンスにアプリケーションを展開する
別のタブまたはウィンドウのUbuntuシェルに戻ります。ターミナルに、コマンドcd deployedapp
を入力し、フォルダ内にプロジェクトファイルが表示された場合には、正しく作業できているということです。
tmux
コマンドを使用し新しいセッションを作成します。これが、アプリケーションがライブで実行される場所です。以下のコマンドで、tmuxセッションの呼び名に私は「mytestapp」を使用しましたが、これは好みの名前にできます。
このコマンドを実行後、「mytestapp」tmuxセッションにリダイレクトされます。これでアプリケーションがEC2サーバー上に設定されたため、アプリケーションに要件をインストールします。
Flaskアプリケーションが頻繁に仮想環境内で実行される場合には、コマンドsource venv/bin/activate
を使用し仮想環境を開始します。そうでない場合には、通常通り、ローカルマシンでアプリケーションを実行します。
キーボードでCtrl+B
を押し、D
を押し、背景でtmuxセッションを実行し続けます。ターミナルに以下の出力が表示されます。
何らかの理由でアプリケーションに変更を加える必要がある場合や、アプリケーションを停止する必要がある場合には、以下のコマンドを入力し、「mytestapp」セッションに再接続します。
またtmuxセッションを背景で実行するには、キーボードでCtrl+B
を押し、Dを押します。何らかの理由でセッションを停止するには、tmuxセッション内でCtrl+D
を押します。
アプリケーションがtmuxセッション内で実行されているか確認できます。ここまでにセッションを停止していない場合には、以下の出力が表示されます。
公開IPv4Public IPアドレスに8080を付けることにより、ライブのアプリケーションを表示できます。この記事の例では、URLは「http://52.15.127.3:8080/」になります。
これで、Ctrl+C
を使用して仮想マシンからログアウトし、新しく展開したアプリケーションを、URLリンクを使用し共有できるようになります。
AWSでプロジェクト展開後の次のステップ
AWSでのFlaskアプリケーションの展開、おめでとうございます!自分のプロジェクト用にカスタマイズされたURLを設定し、ライブプロジェクトを紹介しましょう。チュートリアルURL名の変更方法を参照してください。
AWSをナビゲートするのは容易ではありませんが、皆さんはこのチュートリアルを完了しました。お疲れ様でした。AWSに展開する新しいプロジェクトをお探しの場合には、以下のアイデアをご覧ください。
- Google Maps APIによるイメージデータのビジュアル化とライブでの結果の表示(英語)
- Twilio、AWS、Pythonでのスケーラブルなインタラクティブ音声応答の構築(英語)
- 独自のPython、Zappa、AWS、Twilio SMSによるパーソナルトトレーニング練習ボット(英語)でのサーバーレスプロジェクトの検討
皆さんが展開したアプリケーションについてぜひお聞かせください!
Diane Phanは、Developer Voicesチームのインターンです。Dianeは、プロジェクト実現の障壁となる困難な問題をプログラマーが解決できるように支援しています。Dianeへのご連絡は、dphan [at] twilio.comまたはLinkedInまでどうぞ。
AWS EC2インスタンスの知識について協力いただいた、Dianeの仕事外の友人の皆さんにこの場を借りてお礼を申し上げます。