【AWS】Elastic BeanstalkでDjangoアプリをデプロイしてみた

「やっぱDevOps大事よねー」と何となーく思っているんだけど、実際の現場ではソフト書く人とインフラ構築する人、運用する人がバラバラなんてことは良くある光景だと思っていますが、そんな状況を打破するにはどうしたらいいのだろうか?

はい、
ウダウダ言ってねーで手を動かしてみようということで、
今日はインフラのことなんか気にせずにササっとデプロイできちゃう、
「Elastic Beanstalk」のチュートリアルで遊んでみました。

AWSチュートリアル:https://aws.amazon.com/jp/getting-started/projects/?awsf.getting-started-content=*all

いつも通りAWSのチュートリアルは良くできているので、基本的にチュートリアルに沿って進めた内容を書いています。

まずは、ローカルPCにDjangoの開発を進められる環境を準備していきます。

私のMacにはvirtualenv入っていなかったのでインストール

~$ pip3 install virtualenv

「eb-virt」という仮想環境を作成

~$ virtualenv ~/eb-virt

下記コマンドで仮想環境をアクティブ化

~$ source ~/eb-virt/bin/activate
(eb-virt) ~$

django 2.1.1をインストール

(eb-virt)~$ pip install django==2.1.1

インストールできたか確認

(eb-virt)~$ pip freeze
Django==2.1.1
pytz==2019.3

djangoアプリケーションを作っていきます

(eb-virt)~$ django-admin startproject ebdjango

早速立ち上げてみましょう

(eb-virt) ~$ cd ebdjango
(eb-virt) ~/ebdjango$ python manage.py runserver

ブラウザでhttp://127.0.0.1:8000/にアクセス

djangoのデフォルトのTOPページ(ロケット)が見れたらOK

Elastic Beanstalk は requirements.txt を使用して、アプリケーションを実行する EC2 インスタンスにどのパッケージをインストールするかを判断しています

(eb-virt) ~/ebdjango$ pip freeze > requirements.txt

.ebextensionsディレクトリを作成

(eb-virt) ~/ebdjango$ mkdir .ebextensions

.ebextensions/django.configに以下を追記

(eb-virt) ~/ebdjango$ vi ./.ebextensions/django.config
option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: ebdjango/wsgi.py

このWSGIPathは、アプリケーションを起動するのにElastic Beanstalk が使用する WSGI スクリプトの場所を指定しています

(eb-virt) ~/ebdjango$ deactivate

いったん仮想環境をディアクティベイトしておきます

いよいよElastic Beanstalkでデプロイの準備を進めていきます

その前にawsebcliをインストール

$ brew update
$ brew install awsebcli
$ eb --version
EB CLI 3.17.1 (Python 3.8.2)

※Identity and Access Management(IAM)でユーザー追加が必要

ユーザー追加する際に、アクセスキーI DとシークレットアクセスキーをGetできます

eb initで、EB CLI リポジトリを初期化します
ここでアクセスキーI Dとシークレットアクセスキーを使います

$ eb init
リージョン選んで、
credential情報(aws-access-id,aws-secret-key)入力して、
アプリケーションの名前(django-tutorial)入力して、
Pythonのversion指定して、
keypair作リマス

いよいよデプロイ環境を作成しようとしましたが、
以下のエラーが発生

$ eb create django-env
WARNING: Insufficient IAM privileges. Unable to determine if instance profile 'aws-elasticbeanstalk-ec2-role' exists, assuming that it exists.
ERROR: NotAuthorizedError - No permissions to create a role. Create an IAM role called "aws-elasticbeanstalk-service-role" with appropriate permissions to continue, or specify a role with --service-role.
See http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/concepts-roles.html for more info.
Actual error: Operation Denied. User: arn:aws:iam::0000000000000000:user/xxxxxx_awscli is not authorized to perform: iam:CreateRole on resource: arn:aws:iam::0000000000000000:role/aws-elasticbeanstalk-service-role

どうも権限が足りないと言っている

下記の3つのポリシーを設定しました
・AmazonEC2FullAccess
・AWSElasticBeanstalkService
・IAMFullAccess

再度、デプロイ環境を作成
下記では省略してますが、デプロイ環境を作成して、S3バケットにアップロードして、セキュリティグループ作って、ロードバランサー、オートスケーリンググループ、EC2、CloudWatchアラート作成と勝手に進んでいきます

$ eb create django-env
省略
…
2020-03-13 17:29:16    INFO    Successfully launched environment: django-env

次にeb statusでCNAMEの値(作成した環境のドメイン名)を確認し、~/ebdjango/ebjango/settings.pyのALLOWED_HOSTSに追記します

$ eb status
Environment details for: django-env
  Application name: django-tutorial
  Region: ap-northeast-1
  Deployed Version: app-200314_022601
  Environment ID: e-rr9cmtdgur
  Platform: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Python 3.6 running on 64bit Amazon Linux/2.9.6
  Tier: WebServer-Standard-1.0
  CNAME: django-env.eba-zxvncfm9.ap-northeast-1.elasticbeanstalk.com
  Updated: 2020-03-13 17:29:16.620000+00:00
  Status: Ready
  Health: Green
$ vi ~/ebdjango/ebjango/settings.py 
ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']を追記

それではいよいよデプロイしたいと思います

$ eb deploy
Creating application version archive "app-200314_023455".
Uploading django-tutorial/app-200314_023455.zip to S3. This may take a while.
Upload Complete.
2020-03-13 17:34:57    INFO    Environment update is starting.      
2020-03-13 17:35:02    INFO    Deploying new version to instance(s).
2020-03-13 17:35:26    INFO    New application version was deployed to running EC2 instances.
2020-03-13 17:35:26    INFO    Environment update completed successfully.

無事にデプロイできたようです。

$ eb open

で、終わりでは物足りないので、djangoの管理画面からログインできるようにして再度デプロイしたいと思います。

eb-virt) ~/ebdjango$ python manage.py migrate
(eb-virt) ~/ebdjango$ python manage.py createsuperuser
Username: admin
Email address: me@mydomain.com
Password: ********
Password (again): ********
Superuser created successfully.
~/ebdjango$ vi ~/ebdjango/ebdjango/settings.py
最下部に追記
STATIC_ROOT = 'static'
(eb-virt) ~/ebdjango$ python manage.py collectstatic
$ eb deploy

さて、どうでしょうか?

お、いいっすね
では、ログインできるでしょうか?

できますね。

コレでeb deployで開発を進めることができるようになりました。

プロジェクトの開発を開始するまでに、インフラチームに依頼して数日後にやっと開発環境が出来上がって、そこからgit入れてなーんてやってたら、今の時代遅いのでしょうね

Please share this page:

コメントを残す