はじめに
AWS Lightsailというサービスに触れる機会があったため、ハンズオン形式でデプロイ手順を記事にまとめました。
比較的簡単な手順ですが、備忘録として記録し、これから同様の環境構築を行う方の参考になれば幸いです。
最終目標
Lightsailを使ってFlaskアプリをデプロイすること。
この記事でやること
- AWS Lightsailの設定
- Flaskアプリのデプロイ
LET'S START
前提条件
- AWSアカウントが作成済みで、コンソールにログインできる状態
- Flaskアプリが作成済み(筆者はGitHubでリポジトリを管理しています)
- ドメインを取得済み(任意、なくても問題ありません)
1. Lightsailインスタンスの作成
- AWS Management Consoleにログインし、Lightsailサービスに移動
- 「インスタンスの作成」をクリック
- 設計図(blueprint)の選択→「OSのみ」を選択
- OS→「Amazon Linux 2023」を選択
- ネットワークタイプを選択→「デュアルスタック」を選択
- サイズを選択→「$5」を選択(適宜変更可能)
- Lightsailのインスタンス名を入力
- インスタンスの作成をクリック
2. 静的IPの作成(任意)
Lightsailインスタンスは、デフォルトでは再起動時にIPアドレスが変わる仕様です。ドメインを使用する場合や安定した接続が必要な場合には、静的IPの作成をお勧めします。
また、DNSの反映時間を考慮すると、インスタンスを作成して真っ先に静的IPを作成しインスタンスにアタッチする方が効率が良いです。
- 左側のナビゲーションペインで、「ネットワーキング」を選択
- 「静的IPの作成」をクリック
- 静的IPを作成するリージョンを選択
- 作成したインスタンスに静的IPをアタッチ
- 静的IPの名前を入力
- 「Create(作成)」をクリック
以降はドメインを取得している場合のみ必要な手順です。
- ドメインのDNS設定を開く
- 管理しているドメインの一覧から該当のドメインを選択
- 「DNSレコード設定」画面でAレコードを設定
- ホスト名: 空欄または@(ルートドメインの場合)
- 値: Lightsailで作成した静的IP(例: 123.45.67.89)
- TTL: 標準設定(通常3600秒)を使用
- サブドメインの設定(必要に応じて)
サブドメイン(例:www.example.com
)もLightsailに関連付ける場合、サブドメイン用に別のAレコードを追加する。
3. インスタンスへのSSH接続
LightsailのブラウザベースSSHクライアントを使用します。
4. Flaskなどのパッケージのインストール
- システムパッケージの更新
sudo yum update -y
- Pythonとpipのインストール
Amazon Linux 2023にはデフォルトでPython3がインストールされていますが、バージョンを確認し、pipをインストールします。sudo yum install -y python3 sudo yum install -y python3-pip
- Gitのインストール
sudo yum install -y git
5. GitHubへのSSH接続
- SSHキーを作成
→ Enterキーを3回押してパスフレーズをスキップ。
mkdir ~/.ssh cd ~/.ssh ssh-keygen -t rsa
- 公開鍵を確認
cat id_rsa.pub
- GitHubでSSHキーを登録
- GitHub疎通確認
ssh -T git@github.com
6. Flaskアプリの配置・パッケージのインストール
- アプリを配置する場所に移動
cd ~
- リポジトリをクローン
git clone git@github.com:Ymmy833y/flask-sample.git # 適宜修正してください cd flask-sample # 適宜修正してください
以降は各環境によって異なります。
筆者は仮想環境を使って依存関係を管理していたので、venv作成→依存関係のインストールを行います。
- 仮想環境の作成・起動
python3 -m venv venv source venv/bin/activate
- 依存関係のインストール
pip install -r requirements.txt
注意事項
この後、Flaskアプリをプロダクション環境で稼働させるにあたり、Gunicornを使用します。
Gunicornが依存関係に含まれていない場合、下記コマンドを用いてGunicornをインストールしてください。
pip3 install gunicorn
7. GunicornとSystemdの設定
- GNU nanoを使用してサービスファイルを作成
sudo nano /etc/systemd/system/flask-sample.service # ファイル名は適宜修正してください
- 下記内容を記述(
Description
、WorkingDirectory
、ExecStart
については適宜修正してください)[Unit] Description=Gunicorn instance to serve Flask app (flask-sample) After=network.target [Service] User=ec2-user Group=ec2-user WorkingDirectory=/home/ec2-user/flask-sample ExecStart=/bin/bash -c 'source /home/ec2-user/flask-sample/venv/bin/activate && exec gunicorn -w 3 -b 0.0.0.0:5000 run:app' [Install] WantedBy=multi-user.target
- サービスを有効化して起動
sudo systemctl daemon-reload sudo systemctl enable flask-sample sudo systemctl start flask-sample
- サービスのステータス確認
sudo systemctl status Flask-sample
Active (running)
と表示されていれば成功です
8. Nginxの設定
Nginxを使用してFlaskアプリをリバースプロキシとして設定します。
- GNU nanoを使用してNginxの設定ファイルを作成
sudo nano /etc/nginx/conf.d/flask-sample.conf
- 下記内容を記述(
server_name
、root
については適宜修正してください)server { listen 80; server_name your-domain.jp www.your-domain.jp; # Flaskアプリケーションの静的ファイルのルートディレクトリ root /home/ec2-user/flask-sample; location / { proxy_pass http://127.0.0.1:5000; # Flaskアプリケーションが動作するポート proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } }
- 設定の適用
設定ファイルを保存後、Nginxの設定をテストして適用しますsudo nginx -t sudo systemctl reload nginx
9. 動作確認
- 静的IPまたはドメインでアプリにアクセス
- DNS設定が反映されているか確認するには、WhatsMyDNS を使用
さいごに
SSL証明書の設定についても触れたかったのですが、ボリューミーになるため今回は割愛します。なお、設定する際は Let's Encrypt を使用する方法をおすすめします。
この記事がAWS LightsailでのFlaskアプリのデプロイに役立てば幸いです。