AWS Elastic Beanstalk 再開 – 環境構築

昨年Elastic  Beankstalkを利用してアプリケーションを開発していた

のだけれども、、

無料期間が終わって料金を確認、驚愕し、撤退していた。

しかしながら、訳あって再度環境構築を行う。

変わっている点も結構あるので、留意しながら、手順をメモ。

{プロジェクト名} は、適当なプロジェクト名に読み替えてください。

1.AWSアカウント準備

この辺りは、前回と同様で問題なくできた。

  1. アカウントの作成とIAMの作成
  2. EC2キーペアの作成

2.Elastic Beanstalk

2.1 Elastic Beanstalk コマンドラインインターフェイス(EB CLI)

以前からはバージョンが上がっている

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3.html

Elastic Beanstalk コマンドラインインターフェイス(EB CLI)は Elastic Beanstalk のコマンドラインインターフェイスであり、ローカルリポジトリからの環境の作成、更新およびモニタリングを簡素化する高レベルコマンドを提供。

環境を構築しなおす。

EB CLI の最新バージョンは、常に pip リポジトリに用意されている。

Windows で pip を利用できるようにする手順

c:\Python27\Scripts>pip install awsebcli

最新バージョンに更新する場合

c:\Python27\Scripts>pip install --upgrade awsebcli

 

3.Eclipse + Pydev

Eclipse + Pydev での開発が気にっているので、環境の最新化。

3.1 Eclipse インストール

ダウンロードして、適当なディレクトリへ展開

3.2 Pydev インストール

https://www.typea.info/blog/index.php/2015/01/05/aws_elastic_beanstalk_django_centos65_pydev1_django

help > Install new Software > Add ボタン押下、以下を入力しインストール

Name: PyDev

Location : http://pydev.org/updates

4.VIrtual Env

4.1 インストール

Virtual Envのインストール方法

4.2 プロジェクト用環境の作成

C:\Programs\venv いかにプロジェクト用のVirtualEnvを作成するものとする。

c:\Programs\venv>python -m virtualenv {プロジェクト名}_env

4.3 Djangoのインストール

作成した、VirtualEnv をアクティベートした上、Django 1.9.2 を pip でインストール

c:\Programs\venv\{プロジェクト名}_env\Scripts>activate
({プロジェクト名}_env) c:\Programs\venv\{プロジェクト名}_env\Scripts>pip install django==1.9.2
You are using pip version 6.0.8, however version 8.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting django==1.9.2
  Downloading Django-1.9.2-py2.py3-none-any.whl (6.6MB)
    100% |################################| 6.6MB 71kB/s
   :

4.4 mysql-pythonのインストール

同様に mysql-python もインストールする。

({プロジェクト名}_env) c:\Programs\venv\{プロジェクト名}_env\Scripts>pip install mysql-python==1.2.5
You are using pip version 6.0.8, however version 8.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting mysql-python==1.2.5
:

5.プロジェクト用 Gitリポジトリの準備

Githubとかではなく、独自サーバーにGitリポジトリを作成して使用する。

WebにBasic認証をかけて公開する方法

# git init --bare {プロジェクト名}
Initialized empty Git repository in /var/www/git/{プロジェクト名}/

6.PyDev Django プロジェクトの作成

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create-deploy-python-django.html

File – New – Project から、PyDev プロジェクトを作成し、インタープリタにVirtualEnvで作成したものを指定する。

C:\Programs\venv\{プロジェクト名}_env\Scripts\python.exe

6.1 プロジェクトを Gitに登録する

作成したプロジェクトの右クリックからTeam > Share

.ebextensions 以下の config ファイルと記述の整合性などが取れていないとエラーがでまくり、結構はまる。

最終的には、git のルートディレクトリ、{プロジェクト名} 配下は、以下の構成となるようにする。

(.ebextensions,.elasticbeanstalkは、この後の手順で EB CLI により生成)

注意点

  • git 管理された ルートプロジェクト 直下に、requirements.txt がおかれるようにする
  • git 管理された ルートプロジェクト 直下に、manage.py が配置される構成にする
c:\Users\piroto\git\{プロジェクト名}>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は C82A-34C3 です

 c:\Users\piroto\git\{プロジェクト名} のディレクトリ

2016/02/20  12:43    <DIR>          .
2016/02/20  12:43    <DIR>          ..
2016/02/20  12:33    <DIR>          .ebextensions
2016/02/20  12:33    <DIR>          .elasticbeanstalk
2016/02/20  12:11               436 .project
2016/02/20  12:11               603 .pydevproject
2016/02/20  12:43            36,864 db.{プロジェクト名}_sqlite3
2016/02/20  12:45    <DIR>          {プロジェクト名}
2016/02/20  12:11               251 manage.py
2016/02/20  00:58                65 requirements.txt
2016/02/20  12:34    <DIR>          scripts
               5 個のファイル              38,219 バイト
               6 個のディレクトリ  188,368,654,336 バイトの空き領域

6.2 リモートリポジトリの登録

Git Repositories ビューから、上記6.1 により作成されたリポジトリを展開、Remoptes を右クリックし、ウィザードに従い、上記 5.で作成したリモートリポジトリを登録する。

git_repo

Git Webにより、公開される

git_web

6.3 migrate

ローカルで実行するために、migrate を行い、ローカル環境用のDB sqlite3 に管理用データを作成する。

settings.py の DATABASES の記述を、以下のように書き換える。

RDS関連の環境変数が設定されていれば、RDSに接続し、なければ、sqlite3 に接続に行く設定。

if 'RDS_HOSTNAME' in os.environ:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.environ['RDS_DB_NAME'],
            'USER': os.environ['RDS_USERNAME'],
            'PASSWORD': os.environ['RDS_PASSWORD'],
            'HOST': os.environ['RDS_HOSTNAME'],
            'PORT': os.environ['RDS_PORT'],
        }
    }
else:    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.{プロジェクト名}_sqlite3'),
        }
    }

プロジェクトのコンテキストメニュー – Django – migrate

django_migrate

sqlite3 をのぞくと、テーブルが作成されたのが、確認できる。

django_manage_table

管理ユーザを登録してみる。

VirtualEnv環境から、以下のコマンドを実行

({プロジェクト名}_env) c:\Users\piroto\git\{プロジェクト名}\{プロジェクト名}>python manage.py createsuperuser
Email address: piroto@a-net.email.ne.jp
Password:
Password (again):

7.ローカルで実行

プロジェクト 右クリック – Run As – PyDev: Django

settings.py をいかに設定すると、日本語表示された。前からか?

LANGUAGE_CODE = ‘ja-jp’

django_worked

 

8.Elastic Beanstalk の設定

ここまでで、ローカルの実行は確認できたので、EB側の準備

8.1 以前の接続情報のクリア

ちょっとはまった。前回までと、AWS アクセスキーなどの情報を変えたいのだが、以下のディレクトリに情報が格納されているため、クリアが必要

%USERPROFILE%\.aws

%USERPROFILE%\.elasticbeanstalk

以下のような記述があれば、値をクリアする

aws_access_key_id =

aws_secret_access_key =

8.2 .ebextensions 設定ファイルの記述

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create-deploy-python-django.html

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebextensions.html

ここも、毎回ややこしい。エラーログを見ながら根気よくつぶす。

キーペアの指定は、EC2ではなくて、EB側にある

デプロイ時のログなどは、EC2 にはかれるので、EC2にSSHで接続 し、/var/log/eb-activate.log 等を確認する。

設定ファイル自体は、.ebextensions\{プロジェクト名}.config とでもする。

先に、このファイルを作成してから、eb create 等しないと、WSGI のパスに実態と異なるデフォルト値が設定されてしまい、後で混乱する

container_commands:
  01_migrate:
    command: "python manage.py migrate --noinput"
    leader_only: true
#  02_createadmin:
#    command: "python scripts/createadmin.py"
#    leader_only: true
  03_collectstatic:
    command: "python manage.py collectstatic --noinput"
option_settings:
  - namespace: aws:elasticbeanstalk:container:python
    option_name: WSGIPath
    value: {プロジェクト名}/wsgi.py
  - option_name: DJANGO_SETTINGS_MODULE
    value: {プロジェクト名}.settings
  - option_name: PYTHONPATH
    value: /opt/python/current/app/{プロジェクト名}:$PYTHONPATH
  - namespace: aws:elasticbeanstalk:container:python:staticfiles
    option_name: /static/
    value: static/
  - option_name: AWS_SECRET_KEY
    value: XXXXXXXXXXXXXXXXXXXX
  - option_name: AWS_ACCESS_KEY_ID
    value: XXXXXXXXXXXXXXXXXXXX    
    

 

8.3 EB 初期化

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-configuration.html

上記設定を行ったうえで、アプリケーションのプロジェクトディレクトリで eb init を実行。

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-getting-started.html

EB CLI による Elastic Beanstalk 環境の管理

前回までと、大幅に内容が変わっている。

c:\Users\piroto\git\{プロジェクト名}>eb init
c:\Python27\Scripts\eb-script.py:5: UserWarning: Module _markerlib was already imported from C:\python27\lib\site-packag
es\distribute-0.6.49-py2.7.egg\_markerlib\__init__.pyc, but c:\python27\lib\site-packages\setuptools-14.3.1-py2.7.egg is
 being added to sys.path
  from pkg_resources import load_entry_point

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-southeast-1 : Asia Pacific (Singapore)
7) ap-southeast-2 : Asia Pacific (Sydney)
8) ap-northeast-1 : Asia Pacific (Tokyo)
9) ap-northeast-2 : Asia Pacific (Seoul)
10) sa-east-1 : South America (Sao Paulo)
11) cn-north-1 : China (Beijing)
(default is 3): 8
ERROR: The current user does not have the correct permissions. Reason: Operation Denied. The security token included in
the request is invalid.
You have not yet set up your credentials or your credentials are incorrect
You must provide your credentials.
(aws-access-id): xxxxxx
(aws-secret-key): xxxxxx
C:\python27\lib\site-packages\dateutil\parser.py:428: UnicodeWarning: Unicode equal comparison failed to convert both ar
guments to Unicode - interpreting them as being unequal
  elif res.tzname and res.tzname in time.tzname:

Select an application to use
1) [ Create new Application ]
(default is 1): 1

Enter Application Name
(default is "{プロジェクト名}"):
Application {プロジェクト名} has been created.

Select a platform.
1) Node.js
2) PHP
3) Python
4) Ruby
5) Tomcat
6) IIS
7) Docker
8) Multi-container Docker
9) GlassFish
10) Go
11) Java
(default is 1): 3

Select a platform version.
1) Python 3.4
2) Python
3) Python 2.7
4) Python 3.4 (Preconfigured - Docker)
(default is 1): 3
Do you want to set up SSH for your instances?
(y/n): n

c:\Users\piroto\git\{プロジェクト名}>eb create
c:\Python27\Scripts\eb-script.py:5: UserWarning: Module _markerlib was already imported from C:\python27\lib\site-packag
es\distribute-0.6.49-py2.7.egg\_markerlib\__init__.pyc, but c:\python27\lib\site-packages\setuptools-14.3.1-py2.7.egg is
 being added to sys.path
  from pkg_resources import load_entry_point
Enter Environment Name
(default is {プロジェクト名}-dev):
Enter DNS CNAME prefix
(default is {プロジェクト名}-dev):
That cname is not available. Please choose another.
Enter DNS CNAME prefix
(default is {プロジェクト名}-dev): {プロジェクト名}
C:\python27\lib\site-packages\dateutil\parser.py:428: UnicodeWarning: Unicode equal comparison failed to convert both ar
guments to Unicode - interpreting them as being unequal
  elif res.tzname and res.tzname in time.tzname:

2.0+ Platforms require a service role. We will attempt to create one for you. You can specify your own role using the --
service-role option.
Type "view" to see the policy, or just press ENTER to continue:
Creating application version archive "app-f8ee-160219_173845".
Uploading {プロジェクト名}/app-f8ee-160219_173845.zip to S3. This may take a while.
Upload Complete.
Environment details for: {プロジェクト名}-dev
  Application name: {プロジェクト名}
  Region: ap-northeast-1
  Deployed Version: app-f8ee-160219_173845
  Environment ID: e-em3vpxtbdj
  Platform: 64bit Amazon Linux 2015.09 v2.0.7 running Python 2.7
  Tier: WebServer-Standard
  CNAME: {プロジェクト名}.ap-northeast-1.elasticbeanstalk.com
  Updated: 2016-02-19 08:39:08.864000+00:00
Printing Status:
INFO: createEnvironment is starting.
INFO: Using elasticbeanstalk-ap-northeast-1-398243443338 as Amazon S3 storage bucket for environment data.
INFO: Environment health has transitioned to Pending. There are no instances.
INFO: Created security group named: sg-5d5fac39
INFO: Created load balancer named: awseb-e-e-AWSEBLoa-EWVCCMBD74IO
INFO: Created security group named: awseb-e-em3vpxtbdj-stack-AWSEBSecurityGroup-W5JDZGZ04LD1
INFO: Created Auto Scaling launch configuration named: awseb-e-em3vpxtbdj-stack-AWSEBAutoScalingLaunchConfiguration-18X1
AB2I4AG8
INFO: Added instance [i-b9c7c41c] to your environment.
INFO: Created Auto Scaling group named: awseb-e-em3vpxtbdj-stack-AWSEBAutoScalingGroup-1T1G34FPGOHZ8
INFO: Waiting for EC2 instances to launch. This may take a few minutes.
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:398243443338:scalingPolicy:16c88258-df
2f-44da-9cc6-225b467d4929:autoScalingGroupName/awseb-e-em3vpxtbdj-stack-AWSEBAutoScalingGroup-1T1G34FPGOHZ8:policyName/a
wseb-e-em3vpxtbdj-stack-AWSEBAutoScalingScaleUpPolicy-5F9BO8TVUWDQ
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:398243443338:scalingPolicy:aaadc56a-8a
5f-4fcc-8f60-fec751479aed:autoScalingGroupName/awseb-e-em3vpxtbdj-stack-AWSEBAutoScalingGroup-1T1G34FPGOHZ8:policyName/a
wseb-e-em3vpxtbdj-stack-AWSEBAutoScalingScaleDownPolicy-1J3GFRS1D85CT
INFO: Created CloudWatch alarm named: awseb-e-em3vpxtbdj-stack-AWSEBCloudwatchAlarmHigh-1L85CSLQMZ7U5
INFO: Created CloudWatch alarm named: awseb-e-em3vpxtbdj-stack-AWSEBCloudwatchAlarmLow-3L2TA0JU2UEZ
INFO: Environment health has transitioned from Pending to Ok. 100.0 % of the requests are erroring with HTTP 4xx. Insuff
icient request rate (12.0 requests/min) to determine application health. Command is executing on all instances.

 

8.4 EBの作成

初期化後、eb create コマンドで AWS上に、EBの作成とデプロイを実施する。

デフォルトでは、Gitコミットされたコードがデプロイ対象となる(基本的に前回と変わりないが、以前は明示的に、git push だったものが、eb deploy となり、別のオプションも選択できるようだ)。

最初、コミットせずに実施してはまった。。。

http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-cli-git.html

変更をコミットしないでデプロイするには以下とする。

$ git add .
$ eb deploy --staged

https://realpython.com/blog/python/deploying-a-django-app-to-aws-elastic-beanstalk/

django_worked_on_eb

AWS上で起動した!!

RDS の扱いが、前回までと大きく変わっているため、別途設定する。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です