AWS マイスターシリーズ ~AWS Elastic Beanstalk~ 2012 年 04 月 16 日 片山暁雄 ( @c9katayama ) ソリューションアーキテクト
2011/11/22 リリース! IAM を使用して Elastic Beanstalk のアクセス制御が可能に! アプリケーション毎に操作権限を付与可能 http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/index.html?aws HowTo.iam.html
2012/3/20 リリース! PHP and Git Deployment for AWS Elastic Beanstalk PHP5.3 Git リポジトリ
Agenda AWS Elastic Beanstalkの概要しくみ HostManager 開発 デプロイ各種設定他サービスとの連携その他 Tips まとめ Copyright 2011 Amazon Web Services
AWS Elastic Beanstalk の概要
AWS Elastic Beanstalk とは Beanstalk = 豆の木 アプリケーションが実る幹 のイメージ Web アプリケーションの実行環境を構築 管理するサービス 使用可能な言語 :Java(OpenJDK6),PHP 5.3 コンテナとして Tomcat6 7 Apache(PHP) をサポート
AWS Elastic Beanstalk とは 利用出来るAPIの制約 処理時間の制約はない ServletおよびPHPの機能はすべて利用可能 ライブラリやフレームワークの制約もない Java:Warでデプロイ PHP:ZIP or Git デプロイ ロードバランサー オートスケーリング ロードバランサーとオートスケーリングが標準装備 詳細な条件設定が可能 実行環境の設定 サーバスペック VM 設定など 40 項目以上の設定が可能
AWS Elastic Beanstalk とは Webアプリケーションのバージョン管理 WARやZIPの世代管理が可能 アプリのロールバック ロールフォワードが容易 複数環境の構築が可能 本番 テストなど目的別に構築可能 開発 管理ツールを提供 AWS Management Console コマンドラインツール Eclipseプラグイン
開発 管理ツール AWS Management Console AWS Toolkit for Eclipse
しくみ
アプリケーション管理の論理構成 Application Environment URL Environment Configuration Environment URL Environment Configuration Environment URL Environment Configuration Version WAR/ZIP WAR/ZIP WAR/ZIP WAR/ZIP WAR/ZIP Configuration Template
用語説明 Application トップレベルの論理単位 Application の中に Environment や Version が入る デプロイするアプリケーション (WAR/ZIP ファイル ) と混同しやすいので注意 Environment ConfigurationTemplate を元に構成される WAR をデプロイする環境 環境毎に URL が付与される URL は XXX.elasticbeanstalk.com 各環境毎に EC2 ELB などが立ち上がる ログも環境毎に取得できる (1 時間おきに S3 へ送信可能 )
用語説明 Version Web アプリケーションのバージョン管理 アプリケーションファイルの履歴管理が可能 S3 上でファイルを保持 Version で管理した WAR/ZIP ファイルを 各 Environment と紐付け
テクニカルアーキテクチャ Environment URL この環境が自動で構成される ElasticLoadBalanceing Management Console SNS S3 HM HM CloudWatch eclipse EC2 AutoScaling EC2 Security Group
HostManager
HostManager 各 EC2インスタンス上で動作 Rubyで実装 /opt/elasticbeanstalk/srv/hostmanager/lib/ OS 起動と同時に起動 動作に必要なパラメータは userdata を通じて入手 プロセス起動と監視 Tomcat Apache Thin(HostManager 用 Webサーバ ) の起動 Bluepill というアプリでプロセスを監視 プロセスが落ちると プロセスを再起動 HostManager
HostManager Web アプリケーションの生存確認 ELB からの通信を受け取り Web サーバ内部で Web アプリの生存を確認して返答 /_hostmanager/healthcheck EC2 HostManager 指定 URL を確認
HostManager WAR/ZIP 入れ替え アプリサーバ再起動 設定反映などの処理 各処理の指示が入った HTTP 通信を受け取り 指定の処理を実行 通信は AES-256 で暗号化 Java->war ファイル入れ替え PHP->htdocs に zip 展開 /_hostmanager/tasks 暗号化データを POST 処理を実行 HostManager
開発 デプロイ
開発 AWS Toolkit for Eclipse http://aws.amazon.com/jp/eclipse/ Eclipseマーケットプレースから AWS で検索 Eclipse IDE for Java EE Developers 3.6 or higher
開発 機能 AWSサービスのエクスプローラー Webアプリ作成ウィザード Beanstalkの環境構築 環境設定 Webアプリケーションのデプロイ Tomcatのリモートデバッガー Environmentのイベント ログビューア
デプロイ Java -> Eclipse もしくは Management Console PHP -> Git もしくは Management Console
Eclipse:WAR ファイルのデプロイ プロジェクト右クリック >Run As >Run on Server
デプロイ先の Environment を選択
Finish を選択
Version 管理時のラベルを入力 S3 にアップロード開始完了後に自動でデプロイ
イベントログでデプロイ完了を確認
Git Git をインストール AWS の開発キットをダウンロード http://aws.amazon.com/code/6752709412171743 AWSDevTools-OneTimeSetup で git に機能を追加 ローカルにリポジトリを作成 AWSDevTools-RepositorySetup を使い リポジトリを初期化 AWS の情報を設定 git aws.config コマンド AccessID エンドポイント 対象の Beanstalk App など http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/create_deplo y_php.html
Git でデプロイ ローカルリポジトリにソースをコミット次のコマンドでデプロイ git aws.push 自動生成されたgitリポジトリにソースが入るコミット後 リポジトリの中身が丸ごとzipになりS3へ格納 バージョン付けされる Hostmanagerがzipをデプロイ Apacheのhtdocs 以下を削除 -> 展開 DEMO
AWS ManagementConsole Deploy a Different Version を選択
Version ラベルを入力 WAR ファイルを選択
Event ログで確認
デプロイ ステージ毎に環境を分けることが可能 本番用 テスト用 開発用 URL スワップ機能とバージョン機能を利用する Environment デプロイするアプリは自由に選択出来る Version URL Environment Configuration WAR/ZIP URL を入れ替えることで テスト済みの環境をそのまま公開できる Environment URL Environment Configuration Environment URL Environment Configuration WAR/ZIP WAR/ZIP WAR/ZIP WAR/ZIP
Java で Git デプロイ 一応出来ます ただし git リポジトリに war を展開した形で配置する必要あり WEB-INF/classes にクラスファイルを並べる必要あり
各種設定
各種設定 Environment 毎に設定が可能 サーバ設定 インスタンスタイプ セキュリティグループ キーペア 監視間隔 AMI オートスケール設定 最小 / 最大サーバ数 配置 AZ スケール時のトリガーロードバランサ HTTP/HTTPSポート ヘルスチェック設定 セッションStickey
各種設定 ( つづき ) サーブレットコンテナ設定 (Java) ヒープサイズ ( 最小 / 最大 /permgen) Tomcat 起動引数 リモートデバッグ有無 環境変数 HTTPサーバ設定 (PHP) ドキュメントルート位置 メモリ URL Fopen Zlib 圧縮 Display Erroes Max Exection Time
各種設定 ( つづき ) ログ設定 S3 へのバックアップ ( 毎時 ) イベント通知 トピック設定 宛先設定
設定方法 Eclipse,Console いずれでも設定可能 DEMO
他サービスとの連携
他サービスとの連携 AWS の他のサービスとの連携は可能 Relational Database Service(RDB サービス ) Oracle,MySQL Simple DB( キーバリューストア ) ElastiCache(memcached) Simple Email Service( メール送信 ) CloudFront( コンテンツ配信 ) Simple Queue Service( キューイング )
他サービスとの連携 DB のエンドポイントや SimpleDB のドメインなどの引き渡し Userdata が使えないため 現状では環境変数で設定
さらに密に連携する AMI の ID を設定できるため Beanstalk の AMI を元に作り込む 常に使うアプリケーションはインストールしておく Tomcat PHP のライブラリ配置も必要であれば行う OS 起動時に Chef/puppet を起動するようにスクリプトを仕込む
その他 Tips
その他 Tips SSH でログイン可能 障害時の詳細調査 アプリケーションのインストール デフォルト構成で使用 手間 パラメータ調整他サービスとの連携 柔軟性 テンプレートカスタマイズ SSH 接続
その他 Tips 1 つの Tomcat 上の複数 WAR 管理は不可 手動でのデプロイは可能だが 管理対象外 セッションクラスタリングはデフォルト OFF サーバのスケールアップ InstanceType を変更すると 新しいインスタンスタイプのサーバを起動後 ELB 設定を切り替えて古いサーバをシャットダウンしてくれる SSL も利用可能 API 経由で SSL 証明書を登録後 Environment の ELB 設定を実施
料金 Elastic Beanstalk 自体の利用は \0 Environment 構築に伴って利用した AWS サービスに対して課金 利用サービス単位コスト計算コスト Amazon EC2 t1.micro instance 1 $0.02/hr * 24 hours * 30 days $14.40 Elastic Load Balancer 1 $0.025/hr * 24 hours * 30 days $18.00 ELB Data Processing 15GB $0.008/GB * 15GB $0.12 Elastic Block Store volume 8GB $0.10/GB * 8GB $0.80 S3 Storage for WAR File 1GB $0.14/1GB + $0.01 PUT,GET $0.15 Bandwidth In and Out 15GB Inbound is free, 15 GB out * $0.12 $1.80 月額 $35.27
制約事項 cloud-init が使用不可 CloudFromationとの密接な連携はこれから AMI 作り込みか カスタムスクリプトで Amazon VPC(Virtual Private Cloud) は未対応 現在米国東部 (US-EAST) でのみ利用可能 しばし しばしお待ちを
まとめ
まとめ Beanstalk で 容易に Java/PHP 実行環境の構築が可能 ステージ毎の環境構築が可能 Eclipse/Git を使用して 実装 設定 デプロイがシームレスに AWS の他サービスとも連携 必要に応じて パラメータ設定 カスタム AMI の利用が可能
Elastic Beanstalk で 大きな実 ( アプリケーション ) を 育てよう!