AWS Elastic Beanstalkとちょっと試してみた

http://aws.typepad.com/aws_japan/2011/01/introducing-amazon-beanstalk.html

WARをアップロードして動かすことができるというので、Servletが1つだけのWebアプリを動かしてみた。ヘルスチェックでちょっとハマったので、覚え書き。

Servletのコードはこんな感じ。

public class TestServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().println("Hello, world!!");
		response.getWriter().println("ServerInfo: " + getServletInfo());
		ServletContext sc = getServletContext();
		response.getWriter().println("API version: " + sc.getMajorVersion() + "." + sc.getMinorVersion());
		response.getWriter().println("Servlet name: " + getServletConfig().getServletName());
	}
}

このServletを含んだwarファイルを作成して、AWS Management Consoleからアップロードして動かしてみる。しばらく待ったあと、なんだかうまく動いてないようだ。ログを見ると「Environment health has been set to RED」と表示されている。
http://gyazo.com/3b8dc6c617db9b6e026962357c825f1f.png


色々確認してみたが、どうやらヘルスチェックで失敗しているらしい。
Basic Health Reporting - AWS Elastic Beanstalk
デフォルトでは、アプリケーションルート(http://<任意>.elasticbeanstalk.com/)へのHTTP HEADに反応しないと、アプリケーションが動いていないと判断されるらしい。

web.xmlservlet-mappingが下記のようになっていたので、アプリケーションルートへのHEADに反応できなかったのが原因らしい。

  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>

対策としては、下記のいずれか。

  1. ヘルスチェックのURLを変える
    • Edit Configuration -> Load Balancer -> EC2 Instance Health Check -> Application Health Check URL を /TestServlet に変える
  2. アプリケーションルートへのHTTP HEADに反応するようにアプリケーションを直す
    • 例えば、web.xmlservlet-mappingのurl-patternを /* に変える

1つめの対策を取ったら、無事Environment healthがGREENに変わった。
http://gyazo.com/027afe8aabcdfc81cb52008d88fb0d7b.png

http://<任意>.elasticbeanstalk.com/TestServlet でブラウザを開いて、動いていることを確認できた。
http://gyazo.com/86bfbad694523f7292c55127e92c4633.png