Python FlaskアプリをAWS EC2にデプロイする基本とコツをわかりやすく解説
生徒
「Flaskで作ったアプリをAWS EC2という場所に公開したいです。どうすればいいですか?」
先生
「EC2はAWSの仮想サーバーです。お家(あなたのパソコン)ではなく、クラウド上のサーバーにアプリを置くイメージです。」
生徒
「難しい設定が多そうで心配です…」
先生
「大丈夫です。今回は初心者でもわかるように、ステップを少しずつ丁寧に説明していきますね。」
1. EC2とは何?初心者向けにやさしく説明
AWS EC2(イーシーツー)は、Amazonが提供しているインターネット上の仮想サーバーです。仮想サーバーとは、実際のパソコンの代わりに、クラウド上に用意されたコンピューターのことを指します。
EC2は24時間ずっと動き続けるため、Flaskアプリを停止せずに公開し続けることができます。自分のパソコンでFlaskを起動すると、電源を切った瞬間にアプリも止まってしまいますが、EC2ならその心配はありません。
イメージとしては「電源が常についた貸しパソコン」をインターネット上で借りている感じです。そこにPythonやFlaskをインストールし、自分のアプリを置いて動かします。
EC2でできること(超かんたん例)
# EC2にログインしたあとに実行できる例
python3 --version
このように、EC2に接続すると自分のパソコンと同じようにコマンドを実行できます。ここにFlaskアプリを置くことで、世界中からアクセスできるWebアプリになります。
2. デプロイとは?本番環境に置く意味を知ろう
「デプロイ(deploy)」とは、自分のパソコンで作ったプログラムを、外部の人が使える場所に置く作業のことです。Flaskアプリの場合、ローカル環境(自分のPC)からAWS EC2のようなサーバーへ移し、インターネット経由でアクセスできる状態にします。
開発中は localhost にアクセスして動作確認をしますが、これは自分しか見られません。デプロイを行うことで、URLを知っている人なら誰でもブラウザからアプリを開けるようになります。
また「本番環境」とは、テスト用ではなく、実際にユーザーが使う前提で動かす環境のことです。安定して動き続けることや、途中で止まらないことが重要になります。
デプロイ前と後の違い(イメージ)
# デプロイ前(自分のPCだけで見える)
http://localhost:5000
# デプロイ後(インターネットからアクセス可能)
http://EC2のIPアドレス:8000
このように、デプロイは「自分用のアプリ」を「公開アプリ」に変える大切なステップです。EC2に置くことで、Flaskアプリは本番用として動き始めます。
3. 前準備:AWSアカウントとEC2インスタンスの作成
FlaskアプリをEC2にデプロイするには、最初にAWSアカウントの作成とEC2インスタンスの起動が必要です。AWSには無料利用枠(フリーティア)が用意されているため、学習目的であれば大きな費用をかけずに試せます。
アカウント作成後、AWSの管理画面(マネジメントコンソール)にログインし、サービス一覧からEC2を選択します。「インスタンスを起動」をクリックすると、サーバー作成の画面に進みます。
- AWS無料利用枠でアカウント登録
- EC2を選択し、「インスタンスを起動」をクリック
- OS(Amazon Linux 2 または Ubuntu)を選択
インスタンス作成時にはキーペア(.pemファイル)を作成します。これは後でSSH接続するときに使う「サーバーの鍵」です。なくすと接続できなくなるため、大切に保管してください。
初心者向けメモ:インスタンス作成後に確認すること
# EC2管理画面でチェックするポイント
・インスタンスが「実行中」になっているか
・パブリックIPアドレスが表示されているか
ここまで準備ができれば、EC2という「空のサーバー」が用意できた状態です。次のステップでは、このサーバーにSSHで接続していきます。
4. SSHでEC2に接続する方法
SSH(エスエスエイチ)は、自分のパソコンからEC2サーバーを遠隔操作するための仕組みです。画面越しに操作するというより、「コマンドで直接つながる電話」のようなイメージを持つとわかりやすいです。
EC2を作成するときにダウンロードした秘密鍵(.pemファイル)は、この接続に必要な“本人確認用のカギ”です。ユーザー名・パスワードの代わりに、この鍵を使って安全にログインします。
ssh -i path/あなたの鍵.pem ec2-user@EC2のIPアドレス
コマンドを実行してエラーが出ず、ユーザー名が表示されれば接続成功です。これ以降は、EC2サーバーの中で操作している状態になります。
初心者向けチェックポイント
# 接続できたかを確認する簡単なコマンド
pwd
サーバー上のパス(例:/home/ec2-user)が表示されればOKです。ここからPythonやFlaskのセットアップを進めていきます。
5. Flask環境をサーバーに準備しよう
SSHでEC2に接続できたら、次はFlaskアプリを動かすための環境づくりを行います。ここでは、サーバーにPythonを用意し、アプリ専用の仮想環境を作って、必要なライブラリを入れていきます。
仮想環境とは、サーバーの中に作る「アプリ専用の作業スペース」です。他のアプリと影響し合わないため、本番環境では必ず使うのが一般的です。
# パッケージ情報を最新にする
sudo yum update # Ubuntuの場合は sudo apt update
# Pythonと仮想環境、Gitをインストール
sudo yum install python3 python3-venv git
# 仮想環境を作成
python3 -m venv venv
# 仮想環境を有効化
source venv/bin/activate
# FlaskとGunicornをインストール
pip install flask gunicorn
仮想環境が有効になると、コマンドの先頭に (venv) と表示されます。これが出ていれば準備は成功です。この状態でFlaskアプリを動かすことで、サーバー上でも安全に開発・運用ができます。
6. Flaskアプリをサーバーにアップロードしよう
Flask環境の準備ができたら、次は自分のパソコンで作ったFlaskアプリをEC2サーバーに配置します。ここでは初心者でも扱いやすい「Git」を使った方法を紹介します。
Gitを使うと、アプリのファイル一式をまとめてサーバーにコピーできます。ファイルを1つずつ送る必要がなく、更新もしやすいため、本番環境ではよく使われる方法です。
# Gitが入っていない場合はインストール
sudo yum install git
# GitHubなどに置いたリポジトリを取得
git clone あなたのGitリポジトリURL
# アプリのフォルダへ移動
cd リポジトリ名
# 必要なライブラリをまとめてインストール
pip install -r requirements.txt
この作業で、EC2サーバー内にFlaskアプリのファイルが配置され、実行に必要なライブラリもそろいます。ここまで完了すれば、サーバー上でFlaskアプリを動かす準備はほぼ整った状態です。
7. GunicornとSystemdで常に動かそう
Gunicorn(ガニコーン)は本番環境向けの実行エンジンです。Systemd(システムディー)は、サーバー起動と同時にアプリを自動で動かす設定です。
# gunicorn起動テスト
gunicorn --bind 0.0.0.0:8000 app:app
ブラウザでEC2のIPとポート8000にアクセスすると、Flaskアプリが表示されます。
8. Systemdユニットファイルの作成
アプリを自動で起動させたいときは、/etc/systemd/system に設定ファイルを作ります。
sudo tee /etc/systemd/system/flask.service <<EOF
[Unit]
Description=Flask App
[Service]
User=ec2-user
WorkingDirectory=/home/ec2-user/リポジトリ名
Environment="PATH=/home/ec2-user/リポジトリ名/venv/bin"
ExecStart=/home/ec2-user/リポジトリ名/venv/bin/gunicorn --bind 0.0.0.0:8000 app:app
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable flask
sudo systemctl start flask
9. セキュリティグループとポート設定
AWSのEC2には「セキュリティグループ」という、ネットの出入り口の鍵があります。ここでポート8000や80番を開けると、インターネットからアプリにアクセスできます。
10. ApacheやNginxでリバースプロキシをおすすめする理由
Gunicorn単体でも動きますが、ApacheやNginxというWebサーバーを使うと、SSL(https)や画像配信が速くなるなどのメリットがあります。
ここでは「まずはGunicornだけで動かす」方法を紹介しました。
11. Flaskアプリを更新したいときの手順
ソースコードを編集したら、以下のコマンドで再起動します。
sudo systemctl restart flask
これで最新のコードに切り替わります。
12. よくあるつまずきポイントと解決法
- SSH接続できない→ 鍵のアクセス権(chmod 400)を設定してください。
- ポートが開かない→ AWSのセキュリティグループで正しくポート8000や80番を許可しているか確認。
- Gunicorn起動エラー→ 仮想環境(venv)のPATHやapp:appの指定を見直しましょう。
13. EC2デプロイのメリットと注意点
- 仮想サーバーを自由に設定できる
- 本番環境に近いリアルな設定が学べる
- サーバー費用がかかる(無料枠終了後)
- SSLやリバースプロキシは自分で設定する必要があります
まとめ
AWS EC2にFlaskアプリを公開する作業は、初めて取り組むと難しく感じられますが、ひとつひとつの流れを丁寧に理解していけば必ずできるようになります。今回の内容では、まずEC2という仮想サーバーの仕組みから始まり、デプロイの意味、SSH接続の方法、Flaskの動かし方、Gunicornの活用、Systemdによる自動起動、そしてセキュリティグループの調整やリバースプロキシの考え方まで、一連の流れを学んできました。とくに、初心者がつまずきやすいポイントとして多いのが、SSHの鍵ファイルの扱い、Linuxコマンド操作、パスの指定、Gunicornの起動ミス、セキュリティグループの設定漏れなどですが、これらは経験を重ねることで自然と理解が深まっていきます。 FlaskアプリをEC2で運用するということは、自分のアプリが「インターネット上で公開される」という大きな一歩であり、単にコードを書く以上の学びが必要になります。クラウドサーバーという環境で動かす以上、ネットワークやセキュリティの基礎、Webサーバーの仕組み、Linuxの基本操作など、さまざまな知識がつながり、理解が広がっていきます。今回のステップを通じて、アプリを本番環境に近い構成で動かす基礎が身につき、クラウドの知識を応用できる大きな力になります。 また、クラウドサーバーでアプリを運用する際に重要なのは、安定してアプリを動かし続けるための仕組みづくりです。Gunicornによる本番環境向けの実行、Systemdでの常時起動、EC2のネットワーク設定やポート開放、そしてリバースプロキシによる拡張性などは、実際のサービスでも必要となる実践的な内容です。とくにSystemdを活用した「サーバー起動と同時にアプリが自動で立ち上がる仕組み」は、運用で欠かせない大切なポイントであり、初心者のうちに使い方を理解しておくと非常に役に立ちます。 セキュリティ面では、SSH鍵の適切な権限設定や、セキュリティグループによるポート管理が重要です。どのポートを開けるのか、どこからアクセスを許可するのか、どのサービスがどのポートで動いているのか、これらを把握することによって安全にアプリを公開できます。また、ログイン試行や不正アクセスを想定した構成を組むことで、より安心してアプリを運用することができるようになります。 さらに、アプリを公開したあとに更新作業が必要になる場面では、Gitを使ったコード管理、Systemdを使った再起動手順などが役立ちます。開発したアプリを安全に、確実に、本番環境へ反映することは、サービス運営においてとても大切な流れです。今回の学びでは、その更新作業の流れについても実際に触れ、確実にアプリが最新状態になる手順を習得できました。 EC2は自由度の高いサーバー環境であり、自分の好きな構成でアプリを運用できるという大きな魅力があります。その一方で、クラウドの知識、ネットワークの知識、Linux操作の知識を少しずつ身につける必要があります。しかし、ひとつひとつを丁寧に取り組めば、決して難しい壁ではありません。今回の内容を通して、Flaskアプリをクラウド上に展開するまでの全体像をしっかり理解し、自分の力でサービスをインターネット上に公開できるようになる実践的な力が身につきます。 初めてのEC2デプロイは大きな挑戦ですが、学ぶステップを追うことで自然と理解が深まり、次のアプリ開発やクラウド運用にも必ずつながっていきます。これらの流れを何度も実践することで、環境構築やデプロイ作業にも自信が生まれ、より高度な構成にも挑戦できるようになります。
サンプルコード:GunicornとSystemd連携の基本構成
sudo tee /etc/systemd/system/flask-app.service <<EOF
[Unit]
Description=Flask App with Gunicorn
[Service]
User=ec2-user
WorkingDirectory=/home/ec2-user/myapp
Environment="PATH=/home/ec2-user/myapp/venv/bin"
ExecStart=/home/ec2-user/myapp/venv/bin/gunicorn --bind 0.0.0.0:8000 app:app
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable flask-app
sudo systemctl start flask-app
生徒
「EC2にアプリを置くのはとても難しいと思っていましたが、流れが分かると仕組みが見えてきました!」
先生
「実際の動きを体験すると理解が深まりますね。クラウドでアプリを公開するというのは、とても価値のある経験ですよ。」
生徒
「Systemdで自動起動できるようにする仕組みも便利ですね。アプリが勝手に止まらないようにできるなんてすごいです!」
先生
「そのとおりです。運用では自動化がとても大切です。今回の手順を理解できれば、もっと複雑な構成にも挑戦できますよ。」