AWS Elastic Beanstalk 再開 – 環境構築
昨年Elastic Beankstalkを利用してアプリケーションを開発していた
- (1) Django起動まで
- (2) (TIPS) SSH、RDSへの接続
- (3) (TIPS) ログの確認とデプロイ結果の確認
- (4) いくつかのトラブルシュート
- (5) アプリケーションの作成
- (6) createadmin スクリプトの実行のトラブルシュート
- (7) 静的IPアドレスの設定とドメインの取得とDNSの設定
- AWS Elastic Beanstalk RDS の文字コードをutf-8に設定しなおす
- Djangoでバッチ処理を行う(AWS Elasticbeanstalk)
のだけれども、、
しかしながら、訳あって再度環境構築を行う。
変わっている点も結構あるので、留意しながら、手順をメモ。
{プロジェクト名} は、適当なプロジェクト名に読み替えてください。
1.AWSアカウント準備
この辺りは、前回と同様で問題なくできた。
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 リポジトリに用意されている。
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 インストール
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リポジトリを作成して使用する。
# 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 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
sqlite3 をのぞくと、テーブルが作成されたのが、確認できる。
管理ユーザを登録してみる。
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’
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 にはかれるので、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/
AWS上で起動した!!
RDS の扱いが、前回までと大きく変わっているため、別途設定する。
