技術   DjangoAWSAWS Elastic Beanstalk

Django アプリケーションを AWS Elastic Beanstalk の環境へデプロイする

チュートリアルについて

基本的にはAWS Elastic Beanstalk のチュートリアルページに沿って進めますが、今回使用したものは下記となります。記事が長くなってしまうためこれらの導入手順は省略します。

  • AWS アカウント
  • Python 3.6
  • pip
  • virtualenv
  • awsebcli
目次へ戻る

環境構築

まずは、環境構築から始めます。

仮想環境の設定と Django のインストール

virtualenv で仮想環境を作成し、Django とその依存関係をインストールします。
仮想環境を使用することで、アプリケーションで必要なパッケージを正確に把握することができ、アプリケーションを実行する EC2 インスタンスにそれらの必要なパッケージをそのままインストールすることが出来ます。

  1. 仮想環境を作成する。
    まずは、仮想環境を任意の場所に作成します。
    今回はホームディレクトリに eb-virt という仮想環境を作成します。
    $ virtualenv ~/eb-virt
    Using base prefix '/Users/<ユーザー名>/.pyenv/versions/3.6.2'
    New python executable in /Users/<ユーザー名>/eb-virt/bin/python3.6
    Also creating executable in /Users/<ユーザー名>/eb-virt/bin/python
    Installing setuptools, pip, wheel...done.
  2. 仮想環境のアクティブ化と非アクティブ化。
    作成した仮想環境内の bin/activate に対して source コマンドを実行すると仮想環境を利用することが出来ます。
    $ source ~/eb-virt/bin/activate
    (eb-virt) $

    コマンドプロンプトの先頭に (eb-virt) が追加表示され、仮想環境を使用中であることが確認出来ます。
    仮想環境を終了する場合は、deactivate コマンドを実行すると終了することが出来ます。

    (eb-virt) $ deactivate
    $
  3. pip を使用して Django をインストールします。
    pip freeze コマンドを実行すると、インストールされている全てのパッケージ一覧を表示することが出来ます。
    # Django のインストール。
    (eb-virt) $ pip install Django==2.1.2
    Collecting Django==2.1.2
      Downloading https://files.pythonhosted.org/packages/32/ab/22530cc1b2114e6067eece94a333d6c749fa1c56a009f0721e51c181ea53/Django-2.1.2-py3-none-any.whl (7.3MB)
        100% |████████████████████████████████| 7.3MB 1.8MB/s
    Collecting pytz (from Django==2.1.2)
      Downloading https://files.pythonhosted.org/packages/30/4e/27c34b62430286c6d59177a0842ed90dc789ce5d1ed740887653b898779a/pytz-2018.5-py2.py3-none-any.whl (510kB)
        100% |████████████████████████████████| 512kB 6.8MB/s
    Installing collected packages: pytz, Django
    Successfully installed Django-2.1.2 pytz-2018.5
    
    # インストール確認。
    (eb-virt) $ pip freeze
    Django==2.1.2
    pytz==2018.5

Django プロジェクトの作成

前章で環境構築が完了したので、これから Django プロジェクトを作成していきます。

  1. Django プロジェクトを作成します。
    (eb-virt) $ django-admin startproject <プロジェクト名>
  2. Django サイトをローカルで実行します。
    (eb-virt) $ cd <プロジェクト名>
    (eb-virt) $ python manage.py runserver
    Performing system checks...
    
    System check identified no issues (0 silenced).
    
    You have 15 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.
    
    October 18, 2018 - 07:11:29
    Django version 2.1.2, using settings '<プロジェクト名>.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
  3. ブラウザを開いて確認します。
    ブラウザで、http://127.0.0.1:8000/ を開いて確認後、下記のようなログが追加されていれば問題ないので確認を終了します。
    [18/Oct/2018 07:12:02] "GET / HTTP/1.1" 200 16348
    [18/Oct/2018 07:12:02] "GET /static/admin/css/fonts.css HTTP/1.1" 304 0
    [18/Oct/2018 07:12:02] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 304 0
    [18/Oct/2018 07:12:02] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 304 0
    [18/Oct/2018 07:12:02] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 304 0
目次へ戻る

AWS Elastic Beanstalk にデプロイする

AWS Elastic Beanstalk にデプロイする前にまずは Django アプリケーションの設定をしていきます。

Django アプリケーションの設定

AWS Elastic Beanstalk はアプリケーションを開始するために、application.py という名前のファイルを探す仕様となっていますが、Django には存在しないファイルなので、AWS Elastic Beanstalk デプロイ用に Django の設定を変更します。
また、アプリケーションのモジュールを読み込めるように、環境変数を設定します。

  1. pip freeze の出力を requirements.txt ファイルに保存します。
    AWS Elastic Beanstalk は requirements.txt を使用して、アプリケーションを実行する EC2 インスタンスにどのパッケージをインストールするかを判断するので、下記コマンドにてファイルを作成します。
    (eb-virt) $ pip freeze > requirements.txt
  2. .ebextensions ディレクトリを作成します。
    (eb-virt) $ mkdir .ebextensions
  3. .ebextensions ディレクトリ内に、設定ファイルを追加します。
    .ebextensions ディレクトリ内に、django.config という名前の設定ファイルを作成して下記のようにします。
    (eb-virt) $ cd .ebextensions
    (eb-virt) $ vi django.config
    # django.config ファイルの中身
    option_settings:
      aws:elasticbeanstalk:container:python:
        WSGIPath:<プロジェクト名>/wsgi.py
    WSGIPath の値には、アプリケーションを起動するのに AWS Elastic Beanstalk が使用する WSGI スクリプトの場所を指定します。
    Django プロジェクト作成時に自動で作成される wsgi.py ファイルのパスを指定すれば大丈夫です。

EB CLI を使用してデプロイする

Elastic Beanstalk コマンドラインインターフェイス(EB CLI)を使用して、AWS Elastic Beanstalk にデプロイを実施します。

  1. EB CLI リポジトリを初期化します。
    まずは、eb init コマンドで AWS Elastic Beanstalk にアプリケーションを作成します。
    # 作成した Django プロジェクト直下で初期化する。
    (eb-virt) $ eb init -p python-3.6 <Elastic Beanstalk のアプリケーション名>
    
    Select a default region
    1) us-east-1 : US East (N. Virginia)
    2) us-west-1 : US West (N. California)
    3) us-west-2 : US West (Oregon)
    4) eu-west-1 : EU (Ireland)
    5) eu-central-1 : EU (Frankfurt)
    6) ap-south-1 : Asia Pacific (Mumbai)
    7) ap-southeast-1 : Asia Pacific (Singapore)
    8) ap-southeast-2 : Asia Pacific (Sydney)
    9) ap-northeast-1 : Asia Pacific (Tokyo)
    10) ap-northeast-2 : Asia Pacific (Seoul)
    11) sa-east-1 : South America (Sao Paulo)
    12) cn-north-1 : China (Beijing)
    13) cn-northwest-1 : China (Ningxia)
    14) us-east-2 : US East (Ohio)
    15) ca-central-1 : Canada (Central)
    16) eu-west-2 : EU (London)
    17) eu-west-3 : EU (Paris)
    (default is 3): 9 # 任意のリージョンを指定する。
    Application django-tutorial has been created.

    作成後、Elastic Beanstalk のアプリケーション一覧に追加されているのが確認出来ます。

  2. AWS CodeCommit とキーペアの設定をします。
    再度、eb init コマンドを実行すると、AWS CodeCommit と連携するかどうかと、EC2 インスタンスに SSH 接続するためのキーペアの設定が出来ます。
    ただ試したいだけなら特に必要ないかと思いますので、次のステップに進んでください。

    設定する場合は、すでに AWS に登録済みのキーペアを使用する場合は、下記の通りに選択します。
    最初の質問は AWS CodeCommit と連携するかどうかの質問で、y と入力するとリポジトリやブランチを聞かれます。
    (eb-virt) $ eb init
    Application app_test has been created.
    Note: Elastic Beanstalk now supports AWS CodeCommit; a fully-managed source control service. To learn more, see Docs: https://aws.amazon.com/codecommit/
    Do you wish to continue with CodeCommit? (y/N) (default is n): y
    
    Select a repository
    1) origin
    2) [ Create new Repository ]
    (default is 1): # デフォルトのままで良いならそのままエンター。
    Select a branch
    1) master
    2) [ Create new Branch with local HEAD ]
    (default is 1): # デフォルトのままで良いならそのままエンター。
    Do you want to set up SSH for your instances?
    (Y/n): y # SSH の設定をする場合は y を入力する。
    
    Select a keypair.
    1) key1
    2) key2
    3) key3
    4) [ Create new KeyPair ]
    (default is 1): 1

    新規にキーペアを作成する場合は、下記の通りに選択・入力するとローカルに鍵の作成と同時に EC2 にもアップロードされます。
    EC2 キーペア一覧からキーペアの一覧を確認出来ます。

    (eb-virt) $ eb init
    Application app_test has been created.
    Note: Elastic Beanstalk now supports AWS CodeCommit; a fully-managed source control service. To learn more, see Docs: https://aws.amazon.com/codecommit/
    Do you wish to continue with CodeCommit? (y/N) (default is n): y
    
    Select a repository
    1) origin
    2) [ Create new Repository ]
    (default is 1): # デフォルトのままで良いならそのままエンター。
    Select a branch
    1) master
    2) [ Create new Branch with local HEAD ]
    (default is 1): # デフォルトのままで良いならそのままエンター。
    Do you want to set up SSH for your instances?
    (Y/n): y # SSH の設定をする場合は y を入力する。
    
    Select a keypair.
    1) key1
    2) key2
    3) key3
    4) [ Create new KeyPair ]
    (default is 1): 4 # 新規作成を選択する。
    
    Type a keypair name.
    (Default is aws-eb): <キーペア名> # 任意のキーペア名を設定する。
    Generating public/private rsa key pair.
    Enter passphrase (empty for no passphrase): # パスワードを入力する。(そのままエンターを押下するとパス無しとなる。)
    Enter same passphrase again: # パスワードを再入力する。
    Your identification has been saved in /Users/<ユーザー名>/.ssh/<キーペア名>. # 秘密鍵が作成される。
    Your public key has been saved in /Users/<ユーザー名>/.ssh/<キーペア名>.pub. # 公開鍵が作成される。
    The key fingerprint is:
    SHA256:0IvAMhNYQWSdXmj9sZWpIk4fVuD+cwC5em6ShO0PdHM <キーペア名>
    The key's randomart image is:
    +---[RSA 2048]----+
    |.B*+  .. .       |
    |. =+o...+        |
    | o+.o.+=.o       |
    |  .+o+*+...      |
    | o.o++EoS        |
    |..o..+.. .       |
    | o...   o .      |
    |  +oo    o       |
    |  .*o            |
    +----[SHA256]-----+
    Enter passphrase: # パスワードを再入力する。
    WARNING: Uploaded SSH public key for "<キーペア名>" into EC2 for region ap-northeast-1.
  3. 環境の作成とデプロイ。
    先ほど作成した AWS Elastic Beanstalk のアプリケーションに作成する任意の名前をつけて、環境を作成します。
    作成には少し時間がかかります(約5分)。
    (eb-virt) $ eb create <任意の環境前>
    ERROR: InvalidParameterValueError - Value django_test at 'EnvironmentName' failed to satisfy constraint: Member must contain only letters, digits, and the dash character and may not start or end with a dash というエラーが発生した場合は、環境名に使用できない文字が含まれています。ルールは「文字、数字、およびダッシュ文字のみ使用可能」と「ダッシュで始める及び終わるのは不可」の2つです。
  4. ドメイン名を確認します。
    作成完了後、eb status コマンドを実行して新しい環境のドメイン名を確認します。
    表示される CNAME がドメイン名となります。
    (eb-virt) $ eb status
    Environment details for: <環境名>
      Application name: <アプリケーション名>
      Region: <リージョン名>
      Deployed Version: app-181018_170343
      Environment ID: <環境 ID>
      Platform: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Python 3.6 running on 64bit Amazon Linux/2.7.4
      Tier: WebServer-Standard-1.0
      CNAME: <環境名>.sxiyvfrxcp.ap-northeast-1.elasticbeanstalk.com
      Updated: 2018-10-18 08:06:52.787000+00:00
      Status: Ready
      Health: Green
  5. Django の設定を変更します。
    Django の settings.py ファイルにある ALLOWED_HOSTS に確認したドメイン名を追加します。
    ALLOWED_HOSTS = ['django-test.sxiyvfrxcp.ap-northeast-1.elasticbeanstalk.com']
  6. デプロイします。
    eb deploy コマンドを実行してアプリケーションを AWS Elastic Beanstalk にデプロイします。
    (eb-virt) $ eb deploy
    Creating application version archive "app-181018_174328".
    Uploading django-tutorial/app-181018_174328.zip to S3. This may take a while.
    Upload Complete.
    2018-10-18 08:43:30    INFO    Environment update is starting.
    2018-10-18 08:43:36    INFO    Deploying new version to instance(s).
    2018-10-18 08:44:00    INFO    New application version was deployed to running EC2 instances.
    2018-10-18 08:44:00    INFO    Environment update completed successfully.

    デプロイ完了後、eb open コマンドでサイトの表示を確認します。

    $ eb open
目次へ戻る

終わりに

AWS は一つのサービスについて触れようとすると他のサービスとの連携が多くて書くことが多くなってしまいます。本当は AWS CodeCommit のことや Amazon RDS のことも書きたかったですが、それらは別の記事で書くことにします。AWS はまだ触り始めたばかりで初心者なので、何か間違っていること等がありましたらごめんなさい。今後も AWS は勉強しておいた方が良いと思いますので少しずつでも触っていきたいと思います。

目次へ戻る