🐼

Dockerを利用して、DjangoアプリをAWS(EC2)にデプロイしてみた

2024/11/24に公開

大学の授業の作品をデプロイしたときの備忘録
(間違えている部分があったら教えてください)

はじめに

  • デプロイ完了までの所要時間→約3時間
    ローカルでアプリを完成させた状態からデプロイを始め、エラー解決をしながら進めました。
  • 参考にさせて頂いた記事
    https://zenn.dev/leon0305/articles/8518e520e3b5ca

本題:デプロイに挑戦!!

AWSでインスタンスを作成済みとします。
↓↓↓作成方法↓↓↓
https://zenn.dev/pandaaaaaaa/articles/760aae1a1ed6ac

1. インスタンスを作成・接続する

  • 秘密鍵がどこに保存されているか探すコマンド
find ~/ -name "django-app-key-healthsync.pem”

私の場合、鍵ファイルは Downloads フォルダにありましたが、セキュリティと整理のため、鍵ファイルを専用ディレクトリに移動します。

  • 鍵ファイルを移動
mkdir -p ~/.ssh
mv /Users/reanogasawara/Downloads/django-app-key-healthsync.pem ~/.ssh/
  • 鍵ファイルのパーミッションを修正
chmod 600 ~/.ssh/django-app-key-healthsync.pem
  • 作業環境をVSCodeに切り替え、以下のSSH接続方法にある例というコマンドをコピーし、インスタンス名の前に~/.ssh/を貼り付け、ターミナルでコマンドを叩くとEC2上に接続できる。
ssh -i "~/.ssh/django-app-key-healthsync.pem" ec2-user@ec2-107-20-4-34.compute-1.amazonaws.com![](https://storage.googleapis.com/zenn-user-upload/32c3e9b24af2-20241124.png)

2. Dockerのインストール

  • Dockerパッケージのインストール
sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$\\(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
  • docker-compose に実行権限を付与

このままだとdocker-compose を適切にインストールしたものの、実行可能な権限が付与されていないか、PATH が正しく設定されていないので、インストールした docker-compose ファイルに実行権限を付与します。

sudo chmod +x /usr/local/bin/docker-compose
  • バージョン確認
docker-compose version

3. ローカルのフォルダをEC2に転送する

EC2インスタンス上とローカル環境は別々のファイルシステムを持っています。
そのため、DjangoプロジェクトをEC2インスタンスにアップロードする必要があります。
私は今回HealthSyncというプロジェクトを転送します。

SCPでプロジェクトをアップロード

ローカル環境からEC2インスタンスにプロジェクトフォルダを転送します。
※めっちゃ時間かかる

scp -i ~/.ssh/django-app-key-healthsync.pem -r ~/Desktop/HealthSync ec2-user@ec2-54-227-75-144.compute-1.amazonaws.com:~
  • i: 秘密鍵ファイルを指定。
  • r: フォルダを再帰的に転送。
  • ~/Desktop/HealthSync: ローカルのプロジェクトパス。
  • ec2-user@<IP>:~: EC2のユーザーと転送先パス(ホームディレクトリ)。

EC2でフォルダを確認

ファイル転送後、EC2インスタンスで以下を実行してプロジェクトが転送されていることを確認します。

ls -l ~

プロジェクトディレクトリに移動

転送が成功したら、プロジェクトディレクトリに移動します。

cd ~/HealthSync

Docker Composeコマンドを実行

docker-compose.yml があるディレクトリに移動してから、再度コマンドを実行します。

docker-compose run --rm web python manage.py migrate

4.コンテナを起動する

sudo docker-compose up --build

  • AWS インスタンスの詳細に戻って、パブリックIPv4アドレスを確認する

  • 私は今回ポート8000を使うので、AWS上で設定します。必要のない方はスキップしてください🐼

    セキュリティグループ設定手順
    1. AWSマネジメントコンソールで、該当インスタンスを選択。
    2. セキュリティタブから「セキュリティグループ」を開きます。
    3. インバウンドルールを確認し、ポート 8000 を追加:
      • タイプ: カスタムTCPルール
      • ポート範囲: 8000
      • 送信元: 0.0.0.0/0 (全世界からアクセスを許可)または、自分のIPアドレスを指定。

5. ついに!!ブラウザで開くと確認できる!

リンクhttp://107.20.4.34:8000/を開くとついに自分の作ったWebサイトが確認できました!

6. その他、私が直面したトラブル

Dockerがiptablesを正しく設定できない

[ec2-user@ip-172-31-27-22 HealthSync]$ docker-compose up -d
[+] Running 1/0
✘ Network healthsync_default  Error                                                                                                    0.0s
failed to create network healthsync_default: Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-2680222b99be -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))

このエラーは、Dockerがネットワークの作成時にiptables関連の設定に問題があり、カスタムネットワークを作成できないために発生しています。Amazon Linux 2023やEC2インスタンスでは、特にDockerがiptablesを正しく設定できない場合があります。

解決方法

Dockerのデフォルトのネットワークドライバー設定を変更して、iptablesの処理をスキップします。

  1. Dockerデーモン設定を編集
    Dockerの設定ファイルを編集します:
sudo nano /etc/docker/daemon.json 
  1. 以下の内容を追記または追加します:
{
"iptables": false
}
  1. ファイルを保存して終了します(Ctrl + O、Ctrl + X)。
  2. Dockerを再起動
sudo systemctl restart docker

まだエラーが解決しない場合

  1. 既存のDockerネットワークを削除
    docker network prune
    
  2. 全てのDockerコンテナとネットワークを再作成
    docker-compose down
    docker-compose up -d
    

反省

  • やってみたことや自分で調べた事などを書き起こすことで、自分の頭の整理もできて良い習慣だなぁと思いました。
  • 後に文章として書き起こすつもりで知識をインプットすると、一つ一つのコマンドやコードの意味を理解できるように心がけられるので、これからも続けようと思います。

Discussion