Blog

AWS LightSail OS切り替えのための環境移行

  • 投稿者: yoshitakakai
  • 作成日: 2026年4月13日16:23
  • 更新日: 2026年4月13日16:39
  • カテゴリ: AWS
  • タグ: Django,SSL証明書,環境構築,

AWS LightSail OS切り替えのための環境移行

目的

Amazon Linux2023 のアップデート終了に伴い、他のOS(今回はUbuntu)に切り替えるため、バックアップを取り新環境で復元を行った。

注意

データベースについては、既存のものを継続して使用するため、インスタンスのファイアウォール設定を追加するのみ。各コマンドについては、今後改善の余地があれば変更する可能性あり。SSL証明書の発行については、最終的にはcronを使って自動更新が行われるようにすることを推奨します。

作業の流れ

1. 旧環境から新環境へアプリを移動

旧サーバーでやってなければ実行

pip freeze > requirements.txt

移行先の新環境をAWS LightSailで作成する

秘密鍵のアクセス権を自分だけ「読み取り可」に制限

例)chmod 400 ~/sitekey/LightsailDefaultKey.pem
例)chmod 400 ~/instancekey/LightsailDefaultKey.pem

事前準備として今回はDockerでの環境構築を行うための準備を進めておく

sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl enable docker
sudo systemctl start docker

ssh/configにリモート接続するためのコードを追加して、vscodeからファイルの編集ができるように設定する(設定方法については省略)

ターミナルなどでリモート接続する場合

ssh -i LightsailDefaultKey.pem ubuntu@xx.xxx.xx.xxx
例)ssh -i ~/sample/LightsailDefaultKey.pem ubuntu@xx.xxx.xx.xxx
例)ssh -i ~/sample/subsample/LightsailDefaultKey.pem ubuntu@xx.xxx.xx.xxx

リモートからリモートへの接続ができないので、一旦ローカルにデータをコピーして新環境へ移動する

AWS LightSailでの旧リモート環境から新リモート環境へのアプリ移行ができないため、一旦ローカル環境にアプリをコピーして、その後新環境へデータを移す

rsync -avz -e "ssh -i 鍵.pem" ec2-user@旧IP:/home/ec2-user/プロジェクト ./
rsync -avz -e "ssh -i 鍵.pem" ./プロジェクト ec2-user@新IP:/home/ec2-user/
# ローカルのDesktopに移動
cd Desktop

# 旧サーバーからプロジェクトをコピー
rsync -avz -e "ssh -i ~/sample/LightsailDefaultKey01.pem" ec2-user@旧サーバーIP:/home/ec2-user/django-app ./

# コピーできているかの確認
ls django-app

# ローカルPCからコピー
rsync -avz -e "ssh -i ~/sample/LightsailDefaultKey02.pem" ./django-app ubuntu@新サーバーIP:~/

2. Dockerを起動して、gunicornでブラウザ表示

# docker起動
sudo docker-compose up -d

# 起動状況チェック
sudo docker ps

# エラーログの検索
sudo docker-compose logs

# ファイル修正後のdocker再起動
sudo docker-compose down
sudo docker-compose up -d --build

一旦ここまでで8000番(http://新IP:8000)で表示されることを確認。gunicornでブラウザ表示。まだcssは反映しないまま

※ファイアウォールルールでgunicorn8000番とMySQL3306を開放しておく。詳細は見出し4を確認。

3. 静的ファイルをstaticに集約

sudo docker-compose exec web python manage.py collectstatic

作業途中でインスタンスを停止させて、後ほど再起動する場合

(インスタンス再起動時のコマンド)

cd ~/django-app
sudo docker-compose up -d

(Docker再起動自動化)

sudo docker update --restart=always django-app_web_1
sudo docker update --restart=always django-app_nginx_1

4. インスタンスでネットワーク内のファイアウォールルールを追加

  • SSH TCP 22 任意のIPv4アドレス
  • Lightsail ブラウザ SSH
  • HTTP TCP 80 任意のIPv4アドレス
  • HTTPS TCP 443 任意のIPv4アドレス
  • MySQL/Aurora TCP 3306 任意のIPv4アドレス
  • カスタム TCP 8000 任意のIPv4アドレス
  • (セキュリティ強化を考慮して、任意のIPv4アドレスは指定のものに変更することを推奨します。)

5. AWS Route56でレコード追加

  • xxxyyyyzzzz.net
  • www.xxxyyyyzzzz.net

6. SSL認証を通す

cerbot用ファイルが通るかのチェック

sudo mkdir -p certbot/www/.well-known/acme-challenge
sudo sh -c "echo test > certbot/www/.well-known/acme-challenge/test.txt"
# コンテナ側から見えてるか確認
sudo docker-compose exec nginx ls /var/www/certbot/.well-known/acme-challenge
(text.txtの中身が表示される)

ブラウザでも表示チェック

http://xxxyyyy.net/.well-known/acme-challenge/test.txt

7. SSl証明書取得

sudo docker-compose run --rm certbot certonly \
  --webroot \
  --webroot-path=/var/www/certbot \
  -d xxxyyyy.net \
  -d www.xxxyyyy.net

問題なければ以下の表示

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/xxxyyyy.net/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/xxxyyyy.net/privkey.pem
This certificate expires on 2026-06-21.
These files will be updated when the certificate renews.

NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ログの確認

# サーバー(Nginx)
sudo docker logs django-app_nginx_1

アプリケーション(Django)
sudo docker logs django-app_web_1