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 の扱いが、前回までと大きく変わっているため、別途設定する。