- 今回は、CodeDeploy というサービスを使ってデプロイをします
- 現状、まだ EC2 インスタンス上に Django のアプリケーションが存在しないことを確認しておこう
- Step 3 でも記載しましたが、Django のアプケーションは
/web/mysite/app
に配置されることを想定しています
[ssm-user@ip-172-31-22-149 bin]$ ll /web ls: cannot access /web: No such file or directory
- Step 3 でも記載しましたが、Django のアプケーションは
- Codedeploy を使って EC2 インスタンスにデプロイするためには、専用の Agent が必要です
- インストールされていないことを確認
[ssm-user@ip-172-31-22-149 ~]$ systemctl status codedeploy-agent.service Unit codedeploy-agent.service could not be found.
- 通常 Linux にアプリケーションをインストールする場合、パッケージマネージャーを使う
- Amazon Linux 2 では
yum
というパッケージマネージャーがデフォルトで使える - Step 3 の Extra 項目で使っていたコマンドもこの
yum
- しかし codedeploy-agent は yum でインストールできるようなパッケージが用意されていない
- Amazon Linux 2 では
- 今回は、AWS マネジメントコンソールからログインする方法を試してみる
- 参考: https://dev.classmethod.jp/articles/codedeploy-agent-ssm-distributor/#toc-4
- AWS Systems Manager のディストリビューターを使う
- https://ap-northeast-1.console.aws.amazon.com/systems-manager/distributor?region=ap-northeast-1
AWSCodeDeployAgent
と入力して検索する- 右上の
1回限りのインストール
ボタンをクリック - 下にスクロールし、
ターゲット
の項目でインスタンス を手動で選択する
を選択 - さらに下にスクロールし、
出力オプション
のS3バケットへの書き込みを有効化する
でチェックを外す 実行
ボタンを押す- ステータスが
進行中
から成功
になれば OK - インストールが無事完了していたら、起動していることを確認する
[ssm-user@ip-172-31-22-149 ~]$ systemctl status codedeploy-agent.service ● codedeploy-agent.service - AWS CodeDeploy Host Agent Loaded: loaded (/usr/lib/systemd/system/codedeploy-agent.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2020-09-25 08:06:08 UTC; 1h 0min ago Main PID: 3766 (ruby) CGroup: /system.slice/codedeploy-agent.service ├─3766 codedeploy-agent: master 3766 └─3770 codedeploy-agent: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller of master 3766
- etc ...
- IAM ロールの画面を表示し、
ロールの作成
ボタンをクリック - 2箇所で
CodeDeploy
を選択する 次のステップ: アクセス権限
ボタンをクリックAWSCodeDeployRole
をテキストボックスに入力して検索し、次のステップ: タグ
ボタンをクリック- タグの設定は不要なので、
次のステップ: 確認
ボタンをクリック aws-hands-on-codedeploy
という名前を記載し、ロールの作成
ボタンをクリック
-
CodeDeploy の画面にアクセス
-
アプリケーション名、コンピューティングプラットフォームを入力し、
アプリケーションの作成
ボタンをクリック -
リダイレクトされた画面にある
デプロイグループの作成
ボタンをクリック -
デプロイグループの作成では、まずデプロイグループ名に
aws-hands-on
を入力 -
次に、サービスロールを設定する
-
環境設定の項目では
Amazon EC2 インスタンス
をチェック -
Load Balancer の項目では、チェックを外す
-
デプロイグループの作成
ボタンを押す
- CodeDeploy の画面を表示
デプロイの作成
ボタンをクリックリビジョンタイプ
はアプリケーションはGitHubに格納されています
をチェックデプロイの作成
ボタンをクリックし、デプロイを開始する!- 成功となったら、無事デプロイできているはず
- 実際に、 EC2 インスタンス上にファイルが作成されているかを確認してみましょう
[ssm-user@ip-172-31-22-149 bin]$ ll /web/mysite/ total 0 drwxr-xr-x 3 root root 37 Sep 25 08:17 app -rw-r--r-- 1 root root 0 Sep 25 08:17 reload.trigger
- https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#Instances:
- 対象のインスタンスを選択し、詳細タブに記載されている
パブリック IPv4 DNS
をコピー - ブラウザのアドレスバーには、コピーしたURLにポート番号をつけてアクセスする
- Nginx 経由
- http://<パブリック IPv4 DNS>:8000/
- uWSGI 直
- http://<パブリック IPv4 DNS>:8001/
- Nginx 経由
- ここまでの設定で、
/web/mysite/app
にデプロイするような指示はしていませんでした - 実は、GitHub リポジトリの ../appspec.yml に CodeDeploy に対する指示が記載してあります
- appspec.yml で指示している内容は以下
- リポジトリの
docker/app
ディレクトリを/web/mysite/app
に配置 - 配置した後、 ../codedeploy/after_install.sh を実行
- after_install.sh で
touch /web/mysite/reload.trigger
しなければ、ディレクトリに配置しても最新のアプリケーションに切り替わらない - ../ec2/server/etc/uwsgi/vassals/mysite.ini に
touch-reload
オプションを指定しているから touch で reload できる
- after_install.sh で
- リポジトリの
- CodeDeploy でデプロイを作成するの、実際手間かかりましたよね?
- リポジトリ名入れたり、コミットID入れたり
- ここでは、GithubActions と連携し、 master ブランチに変更が取り込まれたタイミングでデプロイが動くようにしていきます
ユーザの追加
ボタンをクリック- ユーザ名に
aws-hands-on-github-actions
と入力 AWSCodeDeployFullAccess
を検索し、選択して次のステップ: タグ
ボタンをクリック- タグの追加は特に設定せず、
次のステップ: 確認
ボタンをクリック - 内容を確認し
ユーザの作成
ボタンをクリック .csv のダウンロード
ボタンをクリックし、クレデンシャルをダウンロードしておく
New Secret
ボタンをクリック- 2回に分けて値を登録する
- 登録する値は以下
- では、デプロイできる環境も揃ったので、手元のマシンで Django アプリケーションに変更を加えてみましょう
- 加えた変更は GitHub に push して、再度 CodeDeploy でデプロイしてみましょう
- ../docker/app/config/urls.py にある
#path('polls/', include('polls.urls')),
の行をコメントインしてください - 以下のようになっていればOK
from django.contrib import admin from django.urls import include, path urlpatterns = [ path('polls/', include('polls.urls')), path('admin/', admin.site.urls), ]
- ../docker/app/config/urls.py にある
- refs. https://docs.djangoproject.com/ja/3.1/intro/tutorial01/#creating-the-polls-app