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