AWSでWebApp公開する (FastAPI in EC2)
やりたいこと
- AWS の何らか (今回は EC2) を使って、外部に公開できる (されている) サーバを用意する
- 用意したサーバで、WebApp (今回は FastAPI) を公開する
- (WebApp に限らず、httpd (Apache) で Web ページ公開できる)
- AWS の無料枠内で完結させる
データベースに特化したサービスや、Web サーバに特化したサービスなどもあり、それらを活用する方法もありますが、今回は EC2 単品で完結させ、「とりあえず動くようにしてみる」ことを目標にします。
AWS のアカウントは準備できているという前提で話を進めます。
軽く EC2 や AWS の話
EC2 というのは、AWS において仮想サーバを利用できるサービスです。EC2 の仮想サーバのことはインスタンスと呼ばれます。
自宅での自家サーバに比べ、AWS などのレンタルサーバ (仮想サーバ) の良い所は、Amazon社で適切に管理されている物理マシンを利用でき、自宅でハードウェアを管理する必要が無い所、様々なネットワーク設定などを、ハードウェアを自分でいじることなく制御できる所ですね。
EC2 インスタンスの作成
リージョン設定
AWS コンソールの「サービス」から、「コンピューティング -> EC2」押下で EC2 のダッシュボードを開きます。
画面右上から、リージョン (サーバの所在位置) を設定します。
日本に住んでいて、かつ特別な事情が無ければ、「アジアパシフィック (東京 or 大阪)」を選ぶと良いです。一般に、距離的に近い方がアクセス速度が早いです。
セキュリティグループ設定
画面左のメニューから「セキュリティグループ」を選択します。セキュリティグループは、EC2 のファイアウォール的なものです。
デフォルトのグループが 1つあります。
これを利用することもできますが、ここでは新しく 1つグループを作成します。画面右上の「セキュリティグループを作成」を押下します。
適当なグループ名、説明を設定します。VPC はデフォルトで問題ありません。
インバウンドルール (外からサーバに対する通信) は、サーバの操作のため SSH (22) に加え、用途によって必要なポートを開けます。今回は WebApp へのアクセスのため「カスタムTCP」で、FastAPI デフォルトの 8000 ポートを開けます。
Apache などでのアクセスをする場合は、8000 の代わりに HTTP (80) を開けます。
ソースに 0.0.0.0/0 (Anywhere-IPv4) を設定すると、誰からでもアクセス可能になります。より安全をとるのであれば、自身のグローバル IP を調べ、その IP からのアクセスのみを設定しましょう。
アウトバウンドルール (サーバ内から外に対する通信) は、特に事情が無ければ「すべてのトラフィック」で問題無いです。これにより、APT や YUM、PIP コマンドなどでのダウンロードが行えます。
インスタンス作成
インスタンスのダッシュボードから「インスタンスを起動」を押下します。
無料枠で利用できる AMI (OS) は、Amazon Linux の他に Ubuntu や Windows Server などがあります。特に事情やこだわりが無ければ Amazon Linux で問題無いでしょう。
インスタンスタイプでは、サーバのスペックを決められます。無料枠で使えるのはデフォルトで選ばれているものだけなので、今回はそのままにします。
インスタンスの詳細設定はデフォルトのままにします。
ストレージの追加では、無料使用枠では汎用 SSD を 30GB まで利用できます。無料使用枠ではマグネティックストレージも利用できますが、SSD の方が良いでしょう。
終了しなければ消されませんが、一応「終了時に削除」のチェックは外しておきます。
タグの追加の設定は何もせずに次に進みます。
セキュリティグループは、「既存のセキュリティグループを選択する」を選び、さきほど作成したセキュリティグループを選択します。
最後に、確認画面が出てきますので、確認して「起動」を押下します。
その次に、キーペアの設定が出てきます。キーペアというのは、簡単に言えばインスタンスの操作 (SSH 接続) でアクセスするにあたって必要なキー (ファイル) です。「新しいキーペアの作成」で、適当なキーペア名を設定します。
(この後の方法によっては不要にはなりますが、)「キーペアのダウンロード」から xxx.pem
ファイルのダウンロードを忘れずに行い、また、このファイルが漏洩しないように保管してください。
以上でインスタンス作成完了です。少しの間待つと、インスタンス状態が実行中に変わります。
インスタンスの操作 (SSH 接続)
レンタルサーバの操作をするには、遠隔操作を用いる他ありません。EC2 Instance Connect または OpenSSH を用いて、インスタンスに SSH 接続します。
EC2 Instance Connect (ブラウザ) で接続
ブラウザ上でターミナル操作ができる方法です。追加でアプリなどを用意する必要が無いため、最も手軽に利用できます。
さきほど作成したインスタンス (操作したいインスタンス) を選択した状態で、画面右上の「接続」を押下します。すると、4つの接続方法を確認できる画面に移ります。
「EC2 Instance Connect」タブが選ばれた状態にし、右下の「接続」を押下します。何か別の設定をしていなければ、ユーザはデフォルトの「ec2-user
」のままで問題ありません。すると、新しいブラウザタブが開き、そこからインスタンスをターミナル操作できます。
OpenSSH で接続
OpenSSH は、Linux や Windows10 においてプリインストールされている SSH クライアントです。すなわち、自前環境の SSH クライアントや端末からアクセスする方法になります。
さきほど取得したキーファイル (xxx.pem
) のアクセス権限を変更します。これを行わないと、公開範囲の広いアンセキュアなキーと判定され、利用できなくなってしまいます。
chmod 400 xxx.pem
キーの準備ができたら、説明にある通りのコマンドを実行して接続できます。
ssh -i "xxx.pem" ec2-user@ec2-000-000-000-000.ap-northeast-1.compute.amazonaws.com
ローカルファイルをインスタンスへコピーするには、SCP コマンドを利用します。
scp -i "xxx.pem" ./any-file ec2-user@ec2-000-000-000-000.ap-northeast-1.compute.amazonaws.com:
何か作ってアクセスしてみる
FastAPI
セキュリティグループで 8000 ポートを解放し、FastAPI でデフォルトの 8000 ポートを使う前提です。
セキュリティグループで 8000 ポートを解放し、FastAPI でデフォルトの 8000 ポートを使う前提です。
初めに、FastAPI の動作に必要な最低限のパッケージを入れます。
pip3 install fastapi uvicorn
適当に JSON を応答するルートを作成し、実行します。
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
def index():
return {"hello": "from AWS"}
if __name__ == "__main__":
uvicorn.run("fapi:app", host="0.0.0.0", port=8000, reload=True)
python3 fapi.py
適当なブラウザからアクセスしてみます。インスタンスの詳細表示から、「パブリック IPv4 DNS」または「パブリック IPv4 アドレス」を確認し、このアドレスのいずれかをブラウザの URL 欄に入力します。
ここで、ポートを 8000 と指定するのをお忘れなく。
http://ec2-000-000-000-000.ap-northeast-1.compute.amazonaws.com:8000/
または
http://000.000.000.000:8000
正しくできていれば、ブラウザに JSON データが表示されます。
httpd (Apache)
セキュリティグループで 80 ポートを解放している前提です。
httpd をインストールします。
sudo yum install httpd
systemctl
コマンドから起動します。一応、自動起動しないようにしておきます。
sudo systemctl start httpd
sudo systemctl disable httpd
FastAPI と同様の URL に、ブラウザからアクセスします。今度はポート指定をせずにアクセスします。
http://ec2-000-000-000-000.ap-northeast-1.compute.amazonaws.com/
または
http://000.000.000.000
正しくできていれば、httpd のデフォルトページが表示されます。
せっかくなので、適当な自作ページに変えて確認してみます。
sudo sh -c 'echo "<h1>Hello from AWS</h1>" > /var/www/html/index.html'
インスタンスの起動/停止
使わないときは、インスタンスを停止させておきましょう。もう使うことが無いようであれば、「インスタンスを終了」を選択し、インスタンスを削除します。
Author And Source
この問題について(AWSでWebApp公開する (FastAPI in EC2)), 我々は、より多くの情報をここで見つけました https://qiita.com/aKuad/items/4a5d6e8acd4dba165490著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .