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 を利用できるようにする手順

  1. c:\Python27\Scripts>pip install awsebcli

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

  1. 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を作成するものとする。

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

4.3 Djangoのインストール

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

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

4.4 mysql-pythonのインストール

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

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

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

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

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

  1. # git init --bare {プロジェクト名}
  2. 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で作成したものを指定する。

  1. 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 が配置される構成にする
  1. c:\Users\piroto\git\{プロジェクト名}>dir
  2. ドライブ C のボリューム ラベルがありません。
  3. ボリューム シリアル番号は C82A-34C3 です
  4.  
  5. c:\Users\piroto\git\{プロジェクト名} のディレクトリ
  6.  
  7. 2016/02/20 12:43 <DIR> .
  8. 2016/02/20 12:43 <DIR> ..
  9. 2016/02/20 12:33 <DIR> .ebextensions
  10. 2016/02/20 12:33 <DIR> .elasticbeanstalk
  11. 2016/02/20 12:11 436 .project
  12. 2016/02/20 12:11 603 .pydevproject
  13. 2016/02/20 12:43 36,864 db.{プロジェクト名}_sqlite3
  14. 2016/02/20 12:45 <DIR> {プロジェクト名}
  15. 2016/02/20 12:11 251 manage.py
  16. 2016/02/20 00:58 65 requirements.txt
  17. 2016/02/20 12:34 <DIR> scripts
  18. 5 個のファイル 38,219 バイト
  19. 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 に接続に行く設定。

  1. if 'RDS_HOSTNAME' in os.environ:
  2. DATABASES = {
  3. 'default': {
  4. 'ENGINE': 'django.db.backends.mysql',
  5. 'NAME': os.environ['RDS_DB_NAME'],
  6. 'USER': os.environ['RDS_USERNAME'],
  7. 'PASSWORD': os.environ['RDS_PASSWORD'],
  8. 'HOST': os.environ['RDS_HOSTNAME'],
  9. 'PORT': os.environ['RDS_PORT'],
  10. }
  11. }
  12. else:
  13. DATABASES = {
  14. 'default': {
  15. 'ENGINE': 'django.db.backends.sqlite3',
  16. 'NAME': os.path.join(BASE_DIR, 'db.{プロジェクト名}_sqlite3'),
  17. }
  18. }

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

django_migrate

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

django_manage_table

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

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

  1. ({プロジェクト名}_env) c:\Users\piroto\git\{プロジェクト名}\{プロジェクト名}>python manage.py createsuperuser
  2. Email address: piroto@a-net.email.ne.jp
  3. Password:
  4. 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 のパスに実態と異なるデフォルト値が設定されてしまい、後で混乱する

  1. container_commands:
  2. 01_migrate:
  3. command: "python manage.py migrate --noinput"
  4. leader_only: true
  5. # 02_createadmin:
  6. # command: "python scripts/createadmin.py"
  7. # leader_only: true
  8. 03_collectstatic:
  9. command: "python manage.py collectstatic --noinput"
  10. option_settings:
  11. - namespace: aws:elasticbeanstalk:container:python
  12. option_name: WSGIPath
  13. value: {プロジェクト名}/wsgi.py
  14. - option_name: DJANGO_SETTINGS_MODULE
  15. value: {プロジェクト名}.settings
  16. - option_name: PYTHONPATH
  17. value: /opt/python/current/app/{プロジェクト名}:$PYTHONPATH
  18. - namespace: aws:elasticbeanstalk:container:python:staticfiles
  19. option_name: /static/
  20. value: static/
  21. - option_name: AWS_SECRET_KEY
  22. value: XXXXXXXXXXXXXXXXXXXX
  23. - option_name: AWS_ACCESS_KEY_ID
  24. 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 環境の管理

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

  1. c:\Users\piroto\git\{プロジェクト名}>eb init
  2. c:\Python27\Scripts\eb-script.py:5: UserWarning: Module _markerlib was already imported from C:\python27\lib\site-packag
  3. 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
  4. being added to sys.path
  5. from pkg_resources import load_entry_point
  6.  
  7. Select a default region
  8. 1) us-east-1 : US East (N. Virginia)
  9. 2) us-west-1 : US West (N. California)
  10. 3) us-west-2 : US West (Oregon)
  11. 4) eu-west-1 : EU (Ireland)
  12. 5) eu-central-1 : EU (Frankfurt)
  13. 6) ap-southeast-1 : Asia Pacific (Singapore)
  14. 7) ap-southeast-2 : Asia Pacific (Sydney)
  15. 8) ap-northeast-1 : Asia Pacific (Tokyo)
  16. 9) ap-northeast-2 : Asia Pacific (Seoul)
  17. 10) sa-east-1 : South America (Sao Paulo)
  18. 11) cn-north-1 : China (Beijing)
  19. (default is 3): 8
  20. ERROR: The current user does not have the correct permissions. Reason: Operation Denied. The security token included in
  21. the request is invalid.
  22. You have not yet set up your credentials or your credentials are incorrect
  23. You must provide your credentials.
  24. (aws-access-id): xxxxxx
  25. (aws-secret-key): xxxxxx
  26. C:\python27\lib\site-packages\dateutil\parser.py:428: UnicodeWarning: Unicode equal comparison failed to convert both ar
  27. guments to Unicode - interpreting them as being unequal
  28. elif res.tzname and res.tzname in time.tzname:
  29.  
  30. Select an application to use
  31. 1) [ Create new Application ]
  32. (default is 1): 1
  33.  
  34. Enter Application Name
  35. (default is "{プロジェクト名}"):
  36. Application {プロジェクト名} has been created.
  37.  
  38. Select a platform.
  39. 1) Node.js
  40. 2) PHP
  41. 3) Python
  42. 4) Ruby
  43. 5) Tomcat
  44. 6) IIS
  45. 7) Docker
  46. 8) Multi-container Docker
  47. 9) GlassFish
  48. 10) Go
  49. 11) Java
  50. (default is 1): 3
  51.  
  52. Select a platform version.
  53. 1) Python 3.4
  54. 2) Python
  55. 3) Python 2.7
  56. 4) Python 3.4 (Preconfigured - Docker)
  57. (default is 1): 3
  58. Do you want to set up SSH for your instances?
  59. (y/n): n
  60.  
  61. c:\Users\piroto\git\{プロジェクト名}>eb create
  62. c:\Python27\Scripts\eb-script.py:5: UserWarning: Module _markerlib was already imported from C:\python27\lib\site-packag
  63. 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
  64. being added to sys.path
  65. from pkg_resources import load_entry_point
  66. Enter Environment Name
  67. (default is {プロジェクト名}-dev):
  68. Enter DNS CNAME prefix
  69. (default is {プロジェクト名}-dev):
  70. That cname is not available. Please choose another.
  71. Enter DNS CNAME prefix
  72. (default is {プロジェクト名}-dev): {プロジェクト名}
  73. C:\python27\lib\site-packages\dateutil\parser.py:428: UnicodeWarning: Unicode equal comparison failed to convert both ar
  74. guments to Unicode - interpreting them as being unequal
  75. elif res.tzname and res.tzname in time.tzname:
  76.  
  77. 2.0+ Platforms require a service role. We will attempt to create one for you. You can specify your own role using the --
  78. service-role option.
  79. Type "view" to see the policy, or just press ENTER to continue:
  80. Creating application version archive "app-f8ee-160219_173845".
  81. Uploading {プロジェクト名}/app-f8ee-160219_173845.zip to S3. This may take a while.
  82. Upload Complete.
  83. Environment details for: {プロジェクト名}-dev
  84. Application name: {プロジェクト名}
  85. Region: ap-northeast-1
  86. Deployed Version: app-f8ee-160219_173845
  87. Environment ID: e-em3vpxtbdj
  88. Platform: 64bit Amazon Linux 2015.09 v2.0.7 running Python 2.7
  89. Tier: WebServer-Standard
  90. CNAME: {プロジェクト名}.ap-northeast-1.elasticbeanstalk.com
  91. Updated: 2016-02-19 08:39:08.864000+00:00
  92. Printing Status:
  93. INFO: createEnvironment is starting.
  94. INFO: Using elasticbeanstalk-ap-northeast-1-398243443338 as Amazon S3 storage bucket for environment data.
  95. INFO: Environment health has transitioned to Pending. There are no instances.
  96. INFO: Created security group named: sg-5d5fac39
  97. INFO: Created load balancer named: awseb-e-e-AWSEBLoa-EWVCCMBD74IO
  98. INFO: Created security group named: awseb-e-em3vpxtbdj-stack-AWSEBSecurityGroup-W5JDZGZ04LD1
  99. INFO: Created Auto Scaling launch configuration named: awseb-e-em3vpxtbdj-stack-AWSEBAutoScalingLaunchConfiguration-18X1
  100. AB2I4AG8
  101. INFO: Added instance [i-b9c7c41c] to your environment.
  102. INFO: Created Auto Scaling group named: awseb-e-em3vpxtbdj-stack-AWSEBAutoScalingGroup-1T1G34FPGOHZ8
  103. INFO: Waiting for EC2 instances to launch. This may take a few minutes.
  104. INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:398243443338:scalingPolicy:16c88258-df
  105. 2f-44da-9cc6-225b467d4929:autoScalingGroupName/awseb-e-em3vpxtbdj-stack-AWSEBAutoScalingGroup-1T1G34FPGOHZ8:policyName/a
  106. wseb-e-em3vpxtbdj-stack-AWSEBAutoScalingScaleUpPolicy-5F9BO8TVUWDQ
  107. INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:398243443338:scalingPolicy:aaadc56a-8a
  108. 5f-4fcc-8f60-fec751479aed:autoScalingGroupName/awseb-e-em3vpxtbdj-stack-AWSEBAutoScalingGroup-1T1G34FPGOHZ8:policyName/a
  109. wseb-e-em3vpxtbdj-stack-AWSEBAutoScalingScaleDownPolicy-1J3GFRS1D85CT
  110. INFO: Created CloudWatch alarm named: awseb-e-em3vpxtbdj-stack-AWSEBCloudwatchAlarmHigh-1L85CSLQMZ7U5
  111. INFO: Created CloudWatch alarm named: awseb-e-em3vpxtbdj-stack-AWSEBCloudwatchAlarmLow-3L2TA0JU2UEZ
  112. INFO: Environment health has transitioned from Pending to Ok. 100.0 % of the requests are erroring with HTTP 4xx. Insuff
  113. 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

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

  1. $ git add .
  2. $ eb deploy --staged

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

django_worked_on_eb

AWS上で起動した!!

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

Follow me!

コメントを残す

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