swelldesign

Webデザイン HTML Javascript Jqueryなどに関する解決策をメモとして紹介するブログです。

Playframework2.3.9をAWS環境で快適に運用する(1)

Playframework2.3.9を利用して開発したアプリをAWS環境で快適に運用するための方法を記載します。ここでは以下を快適とします。

  • リリースの負荷が低い
  • サーバ監視の負荷が低い
  • データ消失のリスクが低く管理コストも低い
  • サーバのダウンタイムが少なく管理コストも低い

既にAWSを利用していることなどトータルで考えるとAWS Elastic Beanstalkに答えがありそうなので調べて実際に取り組みました。

AWS Elastic Beanstalk ( アプリケーション管理 - サービスとしてのプラットフォーム)| アマゾン ウェブ サービス(AWS 日本語)

 

 ちなみに偶然にも以下が発表されたのも追い風になりました。

Amazon Web Services ブログ: Elastic Beanstalk アップデート - JavaとGoのサポート

 

 大まかな流れとしては以下の通りです。

  1. VPC+RDSを利用したElasticBeanstalkを稼働する
  2. 開発したアプリをElasticBeanstalkで動くようにdistする
  3. 開発したアプリをElasticBeanstalkにデプロイする

それでは具体的な方法を見ていきましょう。

1.VPC+RDSを利用したElasticBeanstalkを稼働する

何回でも同じ環境が作れるようにするため、環境作成をウェブサービスから行うのではなく、機械的にやる方法で検討しておりました。

最初に辿り着いた方法はAWS CLI、EB CLIを利用しコマンドベースで操作する方法でした、VPCの構築やElasticBeanstalkの作成はある程度出来たのですがそれぞれで生成したIDを使いまわすので面倒くさいですし手動感満載なのでお勧めしません。

※ElasticBeanstalkの環境作成は失敗します(原因が分からないまま頓挫)

AWS CLI、EB CLI インストール)
https://www.python.org/downloads/
Python 3.4 をインストールし以下
set path=%path%;C:\Python34;C:\Python34\Scripts
pip install aws
pip install awsebcli
aws configure
	AWS Access Key ID [None]:
	AWS Secret Access Key [None]:
	Default region name [None]: us-west-2
	Default output format [None]: json
AWS CLIを利用したVPC環境構築)
# VPC作成
aws ec2 create-vpc --cidr-block 10.0.0.0/16

# VPC名前付け
aws ec2 create-tags --resources [VPC ID] --tags Key=Name,Value="[VPC Name]"

# RouteTable(main)の確認
aws ec2 describe-route-tables --filters "Name=vpc-id,Values=[VPC ID]"

# RouteTable(main)名前付け
aws ec2 create-tags --resources [RouteTable ID] --tags Key=Name,Value="[RouteTable Name]"

# NetworkACLの確認
aws ec2 describe-network-acls --filters "Name=vpc-id,Values=[VPC ID]"

# NetworkACL名前付け
aws ec2 create-tags --resources [NetworkACL ID] --tags Key=Name,Value="[NetworkACL Name]"

# SecurityGroupsの確認
aws ec2 describe-security-groups --filters "Name=vpc-id,Values=[VPC ID]"

# SecurityGroups名前付け
aws ec2 create-tags --resources [SecurityGroups ID] --tags Key=Name,Value="[SecurityGroups Name]"

# VPCのDNSホスト名を有効化
aws ec2 modify-vpc-attribute --vpc-id [VPC ID] --enable-dns-hostnames

# Subnet作成
aws ec2 create-subnet --vpc-id [VPC ID] --cidr-block 10.0.0.0/24 (--availability-zone [AZ])

# Subnet名前付け
aws ec2 create-tags --resources [Subnet ID] --tags Key=Name,Value="[Subnet Name]"

# IGW(InternetGateway)作成
aws ec2 create-internet-gateway

# IGW(InternetGateway)名前付け
aws ec2 create-tags --resources [IGW ID] --tags Key=Name,Value="[IGW Name]"

# IGW(InternetGateway)をVPCにアタッチする
aws ec2 attach-internet-gateway --internet-gateway-id [IGW ID] --vpc-id [VPC ID]

# IGW(InternetGateway)の確認
aws ec2 describe-internet-gateways --internet-gateway-id [IGW ID]

# RouteTable(public)の作成
aws ec2 create-route-table --vpc-id [VPC ID]

# RouteTable(public)名前付け
aws ec2 create-tags --resources [RouteTable ID] --tags Key=Name,Value="[RouteTable Name]"

# RouteTable(public)とIGW(InternetGateway)の関連付け
aws ec2 create-route --route-table-id [RouteTable ID] --destination-cidr-block 0.0.0.0/0 --gateway-id [IGW ID]

# SubnetをRouteTable(public)に切り替え
aws ec2 associate-route-table --route-table-id [RouteTable ID] --subnet-id [Subnet ID]
(EB CLIを利用したElasticBeanstalk環境構築)
# EB環境設定(アプリケーション作成)
eb init [EB NAME] --region us-west-2 --platform java7 --keyname SwdOregon

# EB環境作成
eb create [EB NAME] --sample --single --tier webserver --cname [EB CNAME] --instance_type t2.micro --database.engine postgres --database.instance db.t2.micro --database.username [RDS USER] --database.password [RDS_PASSWORD] --vpc.ec2subnets [Subnet ID],[Subnet ID] --vpc.elbsubnets [Subnet ID],[Subnet ID] --vpc.dbsubnets [Subnet ID],[Subnet ID] --vpc.id [VPC ID] --vpc.securitygroups [SecurityGroups ID] --vpc.publicip --vpc.elbpublic

# EB環境変数の設定
eb setenv RDS_USER=[RDS_USER] RDS_PASSWORD=[RDS_PASSWORD] RDS_URL=[RDS_URL] JDBC_LOGLEVEL=[JDBC_LOGLEVEL]
(削除関連)
# EB環境削除
eb terminate [EB NAME]

# SecurityGroups削除
aws ec2 delete-security-group --group-id [SecurityGroups ID]

# Subnet削除
aws ec2 delete-subnet --subnet-id [Subnet ID]

# RouteTable(public)削除
aws ec2 delete-route-table --route-table-id [RouteTable ID]

# IGW(InternetGateway)をVPCからデタッチする
aws ec2 detach-internet-gateway --internet-gateway-id [IGW ID] --vpc-id [VPC ID]

# IGW(InternetGateway)削除
aws ec2 delete-internet-gateway --internet-gateway-id [IGW ID]

# VPC削除
aws ec2 delete-vpc --vpc-id [VPC ID]

次にやった方法はCloudFormationを使っての環境の自動生成です。サンプルテンプレートをもとに自分のやりたい事に近づけましたが、ここでもAWS ElasticBeanstalkの環境作成だけは、どうも上手くいきませんでした。。1回試行するのに15分くらいかかるので時間がかかりすぎるためAWS ElasticBeanstalkの環境作成だけは手動で行うことにしました。(CloudFormationのテンプレートは長いので割愛)

AWS CloudFormation ( 設定管理 & クラウドのオーケストレーション)| アマゾン ウェブ サービス(AWS 日本語)

 

最終的には以下のような環境が出来上がりました。

f:id:swelldesign:20151028134413p:plain

CloudFormationのView in Designerから切り取ったのですが分からづらいので文字で補足すると以下のような感じです。

VPC

 └Subnet(public0)←InternetGateway

   └ EC2(app server) ← Elastic Beansttalk

   └ EC2(bastion)

 └Subnet(private0)

 └Subnet(data0, data1)

   └ RDS ← Elastic Beansttalk

※余裕ができたら必要に応じてpublic1, private1を追加しpublicにloadbalancerをおきapp serverはprivateに持ってこようかと考えてます。

 

次回は

    2.開発したアプリをElasticBeanstalkで動くようにdistする

    3.開発したアプリをElasticBeanstalkにデプロイする

を書きたいと思います。

 

j.k