Urumos Blog

文系独学ITエンジニア

【その6】Githubからpull【初めてのAWSデプロイ編】

投稿者: urumos

作成日: 2022年5月29日16:18

更新日: 2022年5月29日16:18

カテゴリ: 初めてのAWSデプロイ

タグ:


下記コマンドでこのUbuntuサーバーにgitが入っているか確認
 apt list -installed | grep git

既にインストールされていた。ちなみに
 git --version
でバージョンを確認したら2.25.1だった。(一応ローカルのgitも確認したら「2.30.0.windows.2」と出た)

ローカルのPowerShellで仮想環境に入り、プロジェクトディレクトリにて下記コマンドでパッケージ書き出し
 pip freeze > requirements.txt
それをGitHubにあげる(久々のGit作業だ)
 git add .
 git commit -m "requirements.txtの追加"
 git push origin main
これでGitHubにもrequitements.txtが来た。

★ここで、Djangoのディレクトリ構造のベストプラクティスについて学ぶ。
今ローカルでは仮想環境を別のところに仮想環境一覧フォルダに整理しているが、
仮想環境をアクティベイト⇒プロジェクトディレクトリに移動⇒run serverの流れが面倒くさい。
調べてみるとどうやら、下記のようにするのがベストプラクティスらしい。

 DjangoMyBlog
 ┗[D].git
 ┗[D].vscode
 ┗[D]blog
 ┗[D]config
 ┗[D]media
 ┗[D]static
 ┗[D].MyBlogEnv
  ┗[D]Include
  ┗[D]Lib
  ┗[D]Scripts
  ┗[D]Include
  ┗pyenv.cfg
 ┗[F].gitignore
  ※ファイルに.MyBlogEnvを追記
 ┗[F]db.sqlite3
 ┗[F]manage.py
 ┗[F]requirements.txt

こうすることで、プロジェクトディレクトリで
  .MyBlogEnv/Scripts/activate
で仮想環境をアクティベイトし、切り替わったらその場で
 py manage.py runserver
をすればディレクトリを移動しないでサーバー起動できる。こりゃ簡単だ。
.gitignoreを更新したのでgithubにpushする。

AWSのWebサーバーでも同じ構造にしよう。
Tera TermでAWSのWebサーバーに接続
home/XXX/pyenvs/内に新たにDjangoMyBlogというフォルダを作成(mkdir) し、
仮想環境ディレクトリをpyenvs下からDjangoMyBlog下へ移動する。
また仮想環境ディレクトリ名はローカルと一緒にすればgitignoreを書き換えなくてよいので、AWSのほうも.MyBlogEnvに名前変更しておく。
この構造だと「pyenvs」という名前は変なので「pyprojects」に変更

home
 ┗ubuntu
 ┗XXX
  ┗Python-3.9.1
  ┗Python-3.9.1.tar.xz
  ┗pyprojects
   ┗DjangoMyBlog
    ┗.git
    ┗.vscode
    ┗blog
    ┗config
    ┗media
    ┗static
    ┗.MyBlogEnv
     ┗bin
     ┗include
     ┗lib
     ┗lib64
     ┗pyvenv.cfg
     ┗[F].gitignore
     ┗[F]db.sqlite3
     ┗[F]manage.py
     ┗[F]requirements.txt
        

DjangoMyBlogディレクトリでgit clone
 git clone git@YYYYYYY/ZZZZZZZZ.git
 すると下記のエラーが出た

Cloning into 'MyBlog-Django'...
The authenticity of host 'github.com (52.69.186.44)' can't be established.
ECDSA key fingerprint is XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxxx
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com,XXXXXXXXXXXXXXXXXX' (ECDSA) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

 これは恐らく下記の記事で言っていたことだろう。
  https://qiita.com/Bashi50/items/db0b6b3343d51e0fc598
 記事通りやってみる
 まずは/home/XXX/.sshディレクトリで下記コマンドで鍵(秘密鍵と公開鍵)が作られる
  ssh-keygen -t rsa
 すると下記のようになった

 Generating public/private rsa key pair.
 Enter file in which to save the key (/home/XXX/.ssh/id_rsa):
 Enter passphrase (empty for no passphrase):
 Enter same passphrase again:
 Your identification has been saved in /home/XXX/.ssh/id_rsa
 Your public key has been saved in /home/XXX/.ssh/id_rsa.pub
 The key fingerprint is:
 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx XXX@ip-10-0-1-10
 The key's randomart image is:
 +---[RSA XXX]----+
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXXXXXXXXXXXX
 +----[SHA256]-----+

 次に公開鍵を表示してコピー(ssh-rsa ~~~XXX@ip-10-0-1-10の部分)
  cat id_rsa.pub
 Githubの設定ページ>SSH and GPG keys >SSH key > New SSH keyボタン で公開鍵をコピペ。(名前は任意のものでOK)
 終わったらTera termに戻り、下記コマンドで接続確認
  ssh -T git@github.com
 すると下記のメッセージが来て成功したっぽい
  Hi XXX! You've successfully authenticated, but GitHub does not provide shell access.

 これで準備OKなので、さっきのコマンドを再トライ
  git clone git@github.com:XXX/MyBlog-Django.git
 すると下記が出て成功!
  Cloning into 'MyBlog-Django'...
  Warning: Permanently added the ECDSA host key for IP address 'XXXXXXXXXX' to the list of known hosts.
  remote: Enumerating objects: 211, done.
  remote: Counting objects: 100% (211/211), done.
  remote: Compressing objects: 100% (129/129), done.
  remote: Total 211 (delta 90), reused 181 (delta 62), pack-reused 0
  Receiving objects: 100% (211/211), 150.02 KiB | 522.00 KiB/s, done.
  Resolving deltas: 100% (90/90), done.
 
 最初間違えて.sshディレクトリにクローンしてしまったけど、mvコマンドを駆使して無事に予定通りの構造に設置できた。
 

仮想環境をアクティベイト
 source .MyBlogEnv/bin/activate
ローカルで予めpip freezeしておいた、requirement.txtをインストール
 pip3.9 install -r requirements.txt
すると下記の出力が出て成功
 Defaulting to user installation because normal site-packages is not writeable
 Collecting asgiref==3.3.1
  Downloading asgiref-3.3.1-py3-none-any.whl (19 kB)
 Collecting Django==3.1.5
  Downloading Django-3.1.5-py3-none-any.whl (7.8 MB)
  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 7.8/7.8 MB 52.8 MB/s eta 0:00:00
 Collecting Pillow==8.3.1
  Downloading Pillow-8.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (3.0 MB)
  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 3.0/3.0 MB 58.0 MB/s eta 0:00:00
 Collecting pytz==2020.5
  Downloading pytz-2020.5-py2.py3-none-any.whl (510 kB)
  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 510.8/510.8 KB 46.6 MB/s eta 0:00:00
 Collecting sqlparse==0.4.1
  Downloading sqlparse-0.4.1-py3-none-any.whl (42 kB)
  qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 42.2/42.2 KB 8.0 MB/s eta 0:00:00
 Installing collected packages: pytz, sqlparse, Pillow, asgiref, Django
  WARNING: The script sqlformat is installed in '/home/XXX/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script django-admin is installed in '/home/XXX/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
 Successfully installed Django-3.1.5 Pillow-8.3.1 asgiref-3.3.1 pytz-2020.5 sqlparse-0.4.1

何か警告が出ているが、この段階で一旦試しにrunserverしてみる
  python3.9 manage.py runserver
すると下記の出力が出た。
  Watching for file changes with StatReloader
  Performing system checks...
  
  System check identified no issues (0 silenced).
  
  You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
  Run 'python manage.py migrate' to apply them.
  February 11, 2022 - 18:00:51
  Django version 3.1.5, using settings 'config.settings'
  Starting development server at http://127.0.0.1:8000/
  Quit the server with CONTROL-C.

一応起動は出来たっぽいが、マイグレーションが出来ていないっぽい。
パソコンのブラウザで開いてもサイトを開けない。

ブログ記事などでは、ここですぐGunicornとNginxを導入するが、理解を深めるため、
上記2つなしでrunserverコマンドでテスト環境のサイトを見れるようにしてみよう。

実験のため、下記のコマンドでrunserverしてみた
 python3.9 manage.py runserver 0:8000
そして、ブラウザで下記のURLを打ち込んでみた。
 http://XXX.com:8000/
すると、
 DisallowedHost at /
 Invalid HTTP_HOST header: 'XXX.com:8000'. You may need to add 'XXX.com' to ALLOWED_HOSTS.
と出た。

ALLOWED_HOSTSにXXX.comを追加すればよさげだ。
追加してみる(最初アドレスを""で囲わなかったらrunserverできず何回か迷った)

再度runserverしたところ、エラーが変わった
 OperationalError at /
 no such table: blog_post
マイグレーションしてないからデータベースが上手く参照できていないのかな?
マイグレーションしてみる。
 python3.9 manage.py migrate
マイグレーションは無事できたっぽい。
再度runserverしたところ、エラーは同じだった。
そもそもAWS側にデータベースファイルであるdb.sqlite3はあるのか?
確認したところ、あった。
しかし.gitignoreに入っているので、git cloneで取得したものではない。
更新時間は一番最初にmigrateした時くらいの時間になっていたから、恐らくそれで作られたのだろう。
もしかしたらmakemigrationsをしていないからか?やってみる
 python3.9 manage.py makemigrations blog
すると下記が出た

 Migrations for 'blog':
blog/migrations/0001_initial.py
- Create model Category
- Create model Tag
- Create model Post
- Create model Comment

無事できたっぽい。再度マイグレーション
 python3.9 manage.py migrate

再度runserverしてみると、ブラウザ上で無事サイトが見れた!!
ついでに管理画面も入れるか見てみる
  http://XXX.com/admin:8000/
すると404 Not Foundエラーになった。
  http://XXX.com:8000/admin
にしたらログインページを表示できた!ドメイン、ポート、子URLという順番なのね。
早速ログインしてみようとしたら、ユーザー名とパスワードが一致しないとのこと。
もう一度Django勉強ノートを見返すと、スーパーユーザーのデータ自体、データベースに入っているみたい。
AWS上では新しいSQLiteデータベースなので、改めてスーパーユーザーを作る
 python3.9 manage.py createsuperuser
ユーザー名、メールアドレス、パスワードを入力し、無事成功!
管理画面にログインできた!

これで一応AWSのサーバー上にあるコードで仮サーバーを起動できたということになる。
一歩前進だ。

試しに記事を投稿してみる。
DBがないので記事もなければカテゴリもタグも未登録だった。
DBが切り離されてるって今まであんまイメージがわかなかったけど、実際に自分でやってみると分かるね。
コメントする

このブログについて

白くまちゃん

文系が社内のKintone導入をきっかけにITを学び始め、ITエンジニアになるまでの記録。