サーバ構築・デプロイが簡単に!elastic beanstalk
TRANSCRIPT
株式会社データクラフト大内 寛和
サーバ構築・デプロイが簡単に!
AWS ElasticBeanstalk
大内 寛和
株式会社データクラフト
・ソフトウェアエンジニア
・写真素材販売サイトの開発・保守
・社内インフラ担当
・受託開発( AWS を利用)
自己紹介
・ DevOps
・ Infrastructure as Code
・ Blue-Green Deployment
・ Immutable Infrastructure
最近、よく耳にするキーワード
http://www.slideshare.net/AmazonWebServicesJapan/aws-aws-elastic-beanstalk より抜粋
よく使うサーバ構成
Elastic LoadBalancer
RDS
EC2
EC2
EB サポートするスタック
・ Apache Tomcat for Java
・ Apache HTTP Server for PHP
・ Apache HTTP Server for Python
・ Passenger for Ruby アプリケーション
・ Microsoft IIS 7.5 for .NET
nginx はサポートしていない・・・
http://www.slideshare.net/AmazonWebServicesJapan/aws-aws-elastic-beanstalk より抜粋
http://www.slideshare.net/AmazonWebServicesJapan/aws-aws-elastic-beanstalk より抜粋
デプロイをカスタマイズ
Elastic LoadBalancer
RDS
EC2
EC2
・ DB サーバ起動
・ Web サーバ起動
・ロードバランサ設定
・セキュリティグループ設定
・コードデプロイ
・ DB マイグレーション
・ Apache 停止
・ nginx 起動
・自動テスト
全てコードで!
AWS 管理コンソールを使わずにアプリケーションをデプロイ
準備 (win ユーザ)
・ AWS Elastic Beanstalk Full Access 権を持つ IAM ユーザを
作成し、セキュリティクレデンシャルをダウンロード
・下記を作業 PC にインストール
- git
- ruby
- AWS Elastic Beanstalk Command Line Tool
→ zip 解凍後、 eb コマンドのパスを環境変数に設定
準備 (win ユーザ)
・ AWSDevTools-OneTimeSetup.bat を実行
・ソースコードのディレクトリに移動して、 git init を実行
・ AWSDevTools-RepositorySetup.bat をソースコードの
ディレクトリにコピー
・ AWSDevTools-RepositorySetup.bat を実行する。
→ システムごとに実行すること。
利用するコマンド
・ eb init
→ アプリケーションのサーバ構成を設定ファイルに出力
・ eb start
→ 設定ファイルに基づき環境構築、システム起動
・ eb stop
→ 環境削除( EC2 インスタンス、 RDS インスタンスの破棄)
・ eb delete
→ アプリケーション削除
・ git aws.push
→ 環境にソースコードをデプロイ
デプロイのカスタマイズ例
ソースコードの構成
/
.elasticbeanstalk/
.ebextensions/
css/
image/
js/
app/
index.php
AWSDevTools-RepositorySetup.bat
Web アプリケーション
コンフィグ:デプロイ
コンフィグ:サーバ構成
.elasticbeanstalk/
・ config
[global]
AwsAccessKeyId=[ セキュリティクレデンシャルのアクセスキー ]
AwsSecretAccessKey=[ セキュリティクレデンシャルのシークレットキー ]
Region=ap-northeast-1
ServiceEndpoint=https://elasticbeanstalk.ap-northeast-1.amazonaws.com
DevToolsEndpoint=git.elasticbeanstalk.ap-northeast-1.amazonaws.com
ApplicationName=[ アプリケーション名 ]
EnvironmentName=[ 環境名 ]
EnvironmentTier=WebServer::Standard::1.0
EnvironmentType=[SingleInstance or ELB-bound Environment ]
SolutionStack=64bit Amazon Linux 2013.09 running PHP 5.4
RdsEnabled=[Yes or No]
RdsSourceSnapshotName=[ リストアするスナップショット名 ]
RdsDeletionPolicy=[Delete or Snapshot]
InstanceProfileName=[IAM Role]
OptionSettingFile=[optionsettings ファイルのパス ]
.elasticbeanstalk/
・ optionsettings
[aws:autoscaling:asg]
Custom Availability Zones=
MaxSize=1
MinSize=1
[aws:autoscaling:launchconfiguration]
EC2KeyName=[key name]
InstanceType=[instance type: t1.micro 等 ]
[aws:autoscaling:updatepolicy:rollingupdate]
RollingUpdateEnabled=false
[aws:ec2:vpc]
DBSubnets=[DBSubnets 2 つ指定する ]
Subnets=[EC2 Subnet]
VPCId=[vpc id]
[aws:elasticbeanstalk:application]
Application Healthcheck URL=/
.elasticbeanstalk/
・ optionsettings
[aws:elasticbeanstalk:application:environment]
PARAM1=[ 環境変数に設定したい文字列 ]
PARAM2=
PARAM3=
PARAM4=
PARAM5=
[aws:elasticbeanstalk:container:php:phpini]
allow_url_fopen=On
composer_options=
display_errors=Off
document_root=
max_execution_time=60
memory_limit=256M
zlib.output_compression=Off
[aws:elasticbeanstalk:hostmanager]
LogPublicationControl=false
独自の変数名は追加できないので注意
.elasticbeanstalk/
・ optionsettings
[aws:elasticbeanstalk:monitoring]
Automatically Terminate Unhealthy Instances=[ ヘルスチェックエラーでインスタンスを破棄する場合 :true]
[aws:elasticbeanstalk:sns:topics]
Notification Endpoint=[ 通知先のメールアドレス等 ]
Notification Protocol=[email, http 等 ]
[aws:rds:dbinstance]
DBDeletionPolicy=Snapshot
DBEngine=mysql
DBInstanceClass=[RDS instance tpye: t1.micro 等 ]
DBSnapshotIdentifier=
DBUser=[DB ユーザ名 ]
.ebextensions/
カスタマイズの内容
・ nginx 、 php-fpm をインストール
・ nginx 、 php-fpm の設定ファイルを出力
・ ElasticBeanstalk の環境変数を PHP から取得できるよう、
OS の環境変数、 fastcgi のパラメータに設定
・デプロイ後、 apache の停止、 nginx 、 php-fpm を起動
.ebextensions/
・ nginx 、 php-fpm のインストール、設定ファイル出力
packages:
yum:
nginx: []
php54-fpm: []
files:
"/etc/nginx/nginx.conf" :
mode: "000644"
owner: root
group: root
content: |
[nginx の設定内容を記述 ]
.ebextensions/
・ nginx 、 php-fpm のインストール、設定ファイル出力
"/etc/nginx/conf.d/webapp.conf" :
mode: "000644"
owner: root
group: root
content: |
[web サイトの設定内容を記述 ]
"/etc/php-fpm.d/www.conf" :
mode: "000644"
owner: root
group: root
content: |
[php-fpm の設定内容を記述 ]
commands:
00-nginx-permission:
command: "chown -R webapp:webapp /var/lib/nginx"
01-nginx-permission:
command: "chown -R webapp:webapp /var/log/nginx"
.ebextensions/
・環境変数を設定するスクリプトファイル
files:
"/opt/elasticbeanstalk/support/set_php_nginx_env.php" :
mode: "000644"
owner: root
group: root
content: |
<?php
// /opt/elasticbeanstalk/support/php_apache_env.php を参考に nginx 用にカスタマイズする
$json = json_decode(file_get_contents('/opt/elasticbeanstalk/deploy/configuration/containerconfiguration'), true);
/*
/opt/elasticbeanstalk/support/envvars.d/appenv に $json の内容を選別して出力
/etc/php.d/environment.ini に $json の内容を選別して出力
/etc/nginx/fastcgi_aws_env に $json の内容を選別して出力
*/
?>
.ebextensions/
・環境変数を設定
"/opt/elasticbeanstalk/hooks/appdeploy/pre/99_set_php_nginx_env.sh" :
mode: "000744"
owner: root
group: root
content: |
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
php /opt/elasticbeanstalk/support/set_php_nginx_env.php
commands:
01-cp:
command: "cp -f /opt/elasticbeanstalk/hooks/appdeploy/pre/99_set_php_nginx_env.sh
/opt/elasticbeanstalk/hooks/configdeploy/pre/"
アプリケーションのデプロイ前に実行
EB の設定変更時に、環境変数を再読み込み
.ebextensions/
・デプロイ後の処理( DB マイグレーション、自動テスト)
files:
"/opt/elasticbeanstalk/hooks/appdeploy/enact/97_migrate.sh" :
mode: "000744"
owner: root
group: root
content: |
[DB マイグレーションを行う ]
"/opt/elasticbeanstalk/hooks/appdeploy/enact/98_test.sh" :
mode: "000744"
owner: root
group: root
content: |
[ 自動テスト (PHPUnit による単体テスト)を行う ]
.ebextensions/
・デプロイ後の処理( apache 停止→ php-fpm 、 nginx 起動)
"/opt/elasticbeanstalk/hooks/appdeploy/enact/99_reload_app_server.sh" :
mode: "000744"
owner: root
group: root
content: |
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
/etc/init.d/httpd stop
/etc/init.d/nginx stop
/etc/init.d/php-fpm stop
/etc/init.d/php-fpm start
/etc/init.d/nginx start
.ebextensions/
・ EB の設定変更時に、 DB マイグレーション、自動テスト、
AP サーバの再起動を行う
commands:
01-cp:
command: "cp -f /opt/elasticbeanstalk/hooks/appdeploy/enact/97_migrate.sh
/opt/elasticbeanstalk/hooks/configdeploy/enact/"
02-cp:
command: "cp -f /opt/elasticbeanstalk/hooks/appdeploy/enact/98_test.sh
/opt/elasticbeanstalk/hooks/configdeploy/enact/"
03-cp:
command: "cp -f /opt/elasticbeanstalk/hooks/appdeploy/enact/99_reload_app_server.sh
/opt/elasticbeanstalk/hooks/configdeploy/enact/"
まとめ
・ ElasticBeanstalk を使えば、サーバ構築、デプロイが非常に
簡単な作業となる。
→ 一度、設定ファイルを作成してしまえば、類似の環境を
簡単に作成できる
・コンフィグレーションにより、お好みの環境を用意することができ
る。
→ 設定が細かくなる場合は、 Chef や CloudFormation 、
OpsWorks を利用したほうがよい
→ 今回の事例は、 OpsWorks のほうがよいかもしれない・・・
参考
・ [AWS マイスターシリーズ ] AWS Elastic Beanstalk
http://www.slideshare.net/AmazonWebServicesJapan/aws-aws-elastic-beanstalk
・華麗なる Elastic Beanstalk での環境構築
http://www.slideshare.net/dateofrock/net-cobol20130222
・ 2 秒で設定! AWS Elastic Beanstalk によるオートスケール
アウトなサーバー構築
http://dx.24-7.co.jp/beanstalk/
・ AWS の Elastic Beanstalk で「 php5.4 」「 nginx 」環境を作る
http://lab.sonicmoov.com/development/elastic-beanstalk/