AWS Elastic Beanstalk に express で作ったアプリケーションをデプロイしてみた

2013.03.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Elastic Beanstalk for Node.js が出たので、express で作ったアプリケーションをデプロイしてみました。

eb-node-1

事前準備

  1. AWS Elastic Beanstalk Command Line Tool をダウンロードしてパスを通します。
    http://aws.amazon.com/code/6752709412171743
  2. Git をインストールします。
    1.6.6 以降が必要です。
  3. node.js と express をインストールします。
    http://nodejs.org/
    http://expressjs.com/
    ※ 先日、stable v0.10.0 が出ましたが、Beanstalk の Node.js のバージョンは、0.8.18 なので 0.8系で行いました。

express アプリケーションの作成

先ずは、express を使ってサンプルのアプリケーションを作成します。

$ express beanstalk-sample

   create : beanstalk-sample
   create : beanstalk-sample/package.json
   create : beanstalk-sample/app.js
   create : beanstalk-sample/public
   create : beanstalk-sample/public/javascripts
   create : beanstalk-sample/public/images
   create : beanstalk-sample/public/stylesheets
   create : beanstalk-sample/public/stylesheets/style.css
   create : beanstalk-sample/routes
   create : beanstalk-sample/routes/index.js
   create : beanstalk-sample/routes/user.js
   create : beanstalk-sample/views
   create : beanstalk-sample/views/layout.jade
   create : beanstalk-sample/views/index.jade

   install dependencies:
     $ cd beanstalk-sample && npm install

   run the app:
     $ node app

依存モジュールをインストールします。

$ cd beanstalk-sample
$ npm install

ローカルで確認するために、npm start。

$ npm start
npm WARN package.json application-name@0.0.1 No README.md file found!

> application-name@0.0.1 start /Users/yamatoyo/Documents/example/beanstalk-sample
> node app

Express server listening on port 3000

起動されることを確認します。

Express

Elastic Beanstalk の環境をつくる

最初に git リポジトリを作成します。

$ git init 
Initialized empty Git repository in /Users/xxx/Documents/beanstalk-sample/.git/

リポジトリに追加しないファイルを .gitignore に追加します。

$ cat > .gitignore <<EOT 
node_modules/
.gitignore
.elasticbeanstalk/
EOT
[/code]

<p>eb init で環境を作成します。インタラクティブに行えます。<br/>
最初に、Access Key と Secret Access Key の入力が求められます。</p>

$ eb init
To get your AWS Access Key ID and Secret Access Key,
  visit "https://aws-portal.amazon.com/gp/aws/securityCredentials".
Enter your AWS Access Key ID (current value is "xxxxx*****xxxxx"):
Enter your AWS Secret Access Key (current value is "xxxxx*****xxxxx"):

リージョンは、Tokyoリージョンを選択しました。

Select an AWS Elastic Beanstalk service region.
Available service regions are:
1) US East (Virginia)
2) US West (Oregon)
3) US West (North California)
4) EU West (Ireland)
5) Asia Pacific (Singapore)
6) Asia Pacific (Tokyo)
7) Asia Pacific (Sydney)
8) South America (Sao Paulo)
Select: (1 to 8): 6

アプリケーション名と環境名は auto-generated のものを使用しました。

Enter an AWS Elastic Beanstalk application name (auto-generated value is "beanstalk-example"):
Enter an AWS Elastic Beanstalk environment name (auto-generated value is "beanstalk-example-env"):

solution stack は、64bit の Amazon Linux を選択しました。

Select a solution stack.
Available solution stacks are:
1) 32bit Amazon Linux running PHP 5.4
2) 64bit Amazon Linux running PHP 5.4
3) 32bit Amazon Linux running PHP 5.3
4) 64bit Amazon Linux running PHP 5.3
5) 32bit Amazon Linux running Node.js
6) 64bit Amazon Linux running Node.js
7) 64bit Windows Server 2008 R2 running IIS 7.5
8) 64bit Windows Server 2012 running IIS 8
9) 32bit Amazon Linux running Tomcat 7
10) 64bit Amazon Linux running Tomcat 7
11) 32bit Amazon Linux running Tomcat 6
12) 64bit Amazon Linux running Tomcat 6
13) 32bit Amazon Linux running Python
14) 64bit Amazon Linux running Python
15) 32bit Amazon Linux running Ruby 1.8.7
16) 64bit Amazon Linux running Ruby 1.8.7
17) 32bit Amazon Linux running Ruby 1.9.3
18) 64bit Amazon Linux running Ruby 1.9.3
Select: (1 to 18): 6

RDS は no を選択しました。

Create an RDS DB Instance? [y/n]: n

アプリケーションの開始

eb start コマンドで、Beanstalk上のアプリケーションを開始できます。

$ eb start
Starting application "beanstalk-sample".
Waiting for environment "beanstalk-sample-env" to launch.
2013-03-13 16:01:51INFOcreateEnvironment is starting.
2013-03-13 16:01:56INFOUsing elasticbeanstalk-ap-northeast-1-077645620084 as Amazon S3 storage bucket for environment data.
2013-03-13 16:02:40INFOCreated load balancer named: awseb-e-s-AWSEBLoa-9PIDIBHZ8XPY
2013-03-13 16:02:51INFOCreated security group named: awseb-e-s3pmwsxbq8-stack-AWSEBSecurityGroup-ZA85A2XQSSLF
2013-03-13 16:02:55INFOCreated Auto Scaling launch configuration named: awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingLaunchConfiguration-2CQ8MVC9DM3P
2013-03-13 16:03:56INFOWaiting for EC2 instances to launch. This may take a few minutes.
2013-03-13 16:03:56INFOCreated Auto Scaling group named: awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingGroup-17SFWQNFJCO79
2013-03-13 16:04:52INFOCreated Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:077645620084:scalingPolicy:64c6ecab-df01-439a-bda8-fd098958e4d4:autoScalingGroupName/awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingGroup-17SFWQNFJCO79:policyName/awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingScaleDownPolicy-FI44ZUPH7B5E
2013-03-13 16:04:55INFOCreated CloudWatch alarm named: awseb-e-s3pmwsxbq8-stack-AWSEBCloudwatchAlarmLow-11UQ8TKKEBO91
2013-03-13 16:04:58INFOCreated Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:077645620084:scalingPolicy:764d3171-e239-463b-a7b9-21aed802e105:autoScalingGroupName/awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingGroup-17SFWQNFJCO79:policyName/awseb-e-s3pmwsxbq8-stack-AWSEBAutoScalingScaleUpPolicy-IY9CLIN1XF12
2013-03-13 16:05:00INFOCreated CloudWatch alarm named: awseb-e-s3pmwsxbq8-stack-AWSEBCloudwatchAlarmHigh-6Q8V01UFMV8T

ELBやAuto Scaling Group、CloudWatch alarm などが自動で生成されました。

処理が終わったら、eb statusコマンドで、作成された情報を確認します。

$ eb status --verbose
Retrieving status of environment "beanstalk-sample-env".
URL: beanstalk-sample-env-xxxxxx.elasticbeanstalk.com
Status: Ready
Health: Green
Environment Name:beanstalk-sample-env
Environment ID:e-s3pmwsxbq8
Solution Stack:64bit Amazon Linux running Node.js
Version Label:Sample Application
Date Created:2013-03-13 16:01:52
Date Updated:2013-03-13 16:08:08
Description:None

ブラウザで上記のURL http:// beanstalk-sample-env-xxxxxx.elasticbeanstalk.com を開くと、Congratulations の画面が開きます。

Elastic Beanstalk

Beanstalk にデプロイする

Beanstalk にデプロイするには、aws.push コマンドを使用します。

$ git add .
$ git commit -m 'Initial commit.'
[master (root-commit) 7f5e89a] Initial commit.
 7 files changed, 83 insertions(+)
 create mode 100644 app.js
 create mode 100644 package.json
 create mode 100644 public/stylesheets/style.css
 create mode 100644 routes/index.js
 create mode 100644 routes/user.js
 create mode 100644 views/index.jade
 create mode 100644 views/layout.jade
 
$ git aws.push
Counting objects: 13, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (13/13), 1.57 KiB, done.
Total 13 (delta 0), reused 0 (delta 0)
remote:
To https://xxxx….
 * [new branch] HEAD -> master

push 後すぐは、Status が Updating になっています。

$ eb status --verbose
Retrieving status of environment "beanstalk-sample-env".
URL: beanstalk-sample-env-xxxxxx.elasticbeanstalk.com
Status: Updating
Health: Grey
Environment Name:beanstalk-sample-env
Environment ID:x-xxxxxxxxx
Solution Stack:64bit Amazon Linux running Node.js
Version Label:git-xxxxxx
Date Created:2013-03-13 16:01:52
Date Updated:2013-03-13 16:11:27
Description:None

少しまって、再度確認すると、Status が Ready になりました。

$ eb status --verbose
Retrieving status of environment "beanstalk-sample-env".
URL: beanstalk-sample-env-xxxxxx.elasticbeanstalk.com
Status: Ready
Health: Green
Environment Name:beanstalk-sample-env
Environment ID:x-xxxxxxxxx
Solution Stack:64bit Amazon Linux running Node.js
Version Label:git-xxxxxx
Date Created:2013-03-13 16:01:52
Date Updated:2013-03-13 16:13:35
Description:None

ブラウザで http:// beanstalk-sample-env-xxxxxx.elasticbeanstalk.com を開くと、きちんとデプロイされています。

Express

コンソールを確認してみる

Management Console では、イベントログや、

mc1

バージョンなどが確認できます。

mc2

アプリケーションの削除

確認が終わったので、環境とアプリケーションを削除します。

$ eb stop
Terminate environment? [y/n]: y
Stopping environment "beanstalk-sample-env". This may take a few minutes.
2013-03-14 01:14:24	INFO	terminateEnvironment is starting.
2013-03-14 01:14:39	INFO	Deleted CloudWatch alarm named: awseb-e-s3pmwsxbq8-stack-AWSEBCloudwatchAlarmHigh-6Q8V01UFMV8T
2013-03-14 01:14:42	INFO	Deleted Auto Scaling group policy named:・・・・
・・・・・
Stop of environment "beanstalk-sample-env" has completed.

$ eb delete
Delete application? [y/n]: y
Deleted application "beanstalk-sample".

まとめ

今回 Beanstalk を初めて触ってみましたが、コマンドラインで簡単に操作出来る点、特にgit形式でデプロイを簡単に行える部分が気に入りました。
他にもAmazon RDSやElasticacheとの連携も容易に行うことができるようなので、機会があれば次回試してみます。