SlideShare uma empresa Scribd logo
1 de 30
Baixar para ler offline
Node.js Auto Scaling
      in 10 minutes
with AWS CloudFormation
   2012/6/28 東京Node学園 6時限目
          @hakobera
Question



AWSでNode.jsを何ノードま
で動かしたことありますか?
Node.jsで1億リクエスト/日


 1億リクエスト/日

 => 417万リクエスト/時

 => 7万リクエスト/分

 => 1200リクエスト/秒
AWS なら簡単
AWS なら簡単
EC2

  AMI (VMイメージ)の作成

  Node.js 、依存パッケージのインストール

セキュリティグループ

  ポート番号や接続制限

ELB

  プロトコルとポート番号

Auto Scale

  CloudWatch の設定

  Auto Scale Group ポリシーの設定

アプリケーションのDeployとUpdate
AWS なら簡単
EC2

  AMI (VMイメージ)の作成

  Node.js 、依存パッケージのインストール

セキュリティグループ

  ポート番号や接続制限

ELB      じゃなかった orz
  プロトコルとポート番号

Auto Scale

  CloudWatch の設定

  Auto Scale Group ポリシーの設定

アプリケーションのDeployとUpdate
そこで AWS CloudFormation の出番

 http://aws.amazon.com/jp/cloudformation/


 AWS インフラ構成のテンプレート

 設定の一部をパラメータ化できる

 JSON 形式 (Noder にはお馴染み)


 DynamoDBとCloudFront の先週からサポート開始
                       詳細はこちらを参照
自分だけの PaaS が
  簡単に作れる
とりあえずやってみる


Tempalte:
 https://cf-templates-for-nodejs.s3.amazonaws.com/cf-node-autoscale-tmpl.json

App:
 https://github.com/hakobera/tng6_sample/zipball/master

GitHub:
 https://github.com/hakobera/tng6_sample
Node.js と CloudFormation の勘所


  Node.js の
                  AutoScale
  インストール



                  Elastic Load
    アプリの
                  Balancer と
Deploy と Update
                  WebSocket
Node.js のインストール
Node.jsのインストール
バイナリパッケージを使おう
   ∵ micro インスタンスで Node.js のビルドが遅い


       Installing Node.js via package manager
https://github.com/joyent/node/wiki/Installing-Node.js-
                  via-package-manager
 $ sudo yum localinstall --nogpgcheck http://nodejs.tchol.org/repocfg/amzn1/nodejs-stable-release.noarch.rpm

 $ sudo yum install nodejs-compat-symlinks npm




                                                     残念ながら v0.8 はまだない
Node.jsのインストール
Cloud Init でパッケージ指定
"AppServerLaunchConfig": {
  "Type" : "AWS::AutoScaling::LaunchConfiguration",
  "Metadata": {
   "AWS::CloudFormation::Init": {
    "config": {
     "packages": {
       "rpm" : {
         "nodejs" : "http://nodejs.tchol.org/repocfg/amzn1/nodejs-stable-release.noarch.rpm"
       },
       "yum": {
         "gcc-c++": [],
         "make": [],
         "git" : [],
         "nodejs-compat-symlinks": [],
         "npm": []
       }
     },

     "sources" : {
       "/var/opt/app" : { "Ref": "AppURL" }
     }
    }, ...
Node.jsのインストール
         Cloud Init の起動設定
"Properties": {
    (省略)
    "UserData": {
     "Fn::Base64": {
      "Fn::Base64": {
       "Fn::Join": ["", [
        "#!/bin/bash -vn",
        "yum update -y aws-cfn-bootstrapn",

         "# Helper functionn",
         "function error_exitn",
         "{n",
         " /opt/aws/bin/cfn-signal -e 1 -r "$1" '", { "Ref": "WaitHandle" }, "'n",
         " exit 1n",
         "}n",

         "# Install packagesn",
         "/opt/aws/bin/cfn-init -s ", { "Ref": "AWS::StackName" }, " -r AppServerLaunchConfig ",
         " --access-key ", { "Ref": "HostKeys" },
         " --secret-key ", { "Fn::GetAtt": ["HostKeys", "SecretAccessKey"] },
         " --region ", { "Ref": "AWS::Region" }, " || error_exit 'Failed to run cfn-init'n",
Auto Scale
Cloud Watch
   http://aws.amazon.com/jp/cloudwatch/
   http://aws.amazon.com/jp/autoscaling/


Auto Scale の条件(拡張・縮小のトリガー)は、
Cloud Watch のアラームで実現している

アプリの特性の応じて、チェックする対象を変更

 CPUUtilization, DiskReadBytes, DiskReadOps, DiskWriteBytes,
 DiskWriteOps, NetworkIn, NetworkOut

 Node.js だと、CPUUtilization か NetworkOut のどちらかで大体OK
設定例: CPUUtilization
    "AppServerScaleUpPolicy" : {
     "Type" : "AWS::AutoScaling::ScalingPolicy",
     "Properties" : {
       "AdjustmentType" : "ChangeInCapacity",
       "AutoScalingGroupName" : { "Ref" : "AppServerGroup" },
       "Cooldown" : "60",
       "ScalingAdjustment" : "2"
     }
   },

   "CPUAlarmHigh": {
    "Type": "AWS::CloudWatch::Alarm",
    "Properties": {
      "AlarmDescription": "Scale-up if CPU > 90% for 10 minutes",
      "MetricName": "CPUUtilization",
      "Namespace": "AWS/EC2",
      "Statistic": "Average",
      "Period": "300",
      "EvaluationPeriods": "2",
      "Threshold": "90",
      "AlarmActions": [ { "Ref": "AppServerScaleUpPolicy" } ],
      "Dimensions": [
       {
         "Name": "AutoScalingGroupName",
         "Value": { "Ref": "AppServerGroup" }
       }
      ],
アプリの Deploy と Update
アプリのDeploy
                        "AppServerLaunchConfig": {
                          "Type" : "AWS::AutoScaling::LaunchConfiguration",
                          "Metadata": {
                            "AWS::CloudFormation::Init": {
                               "sources" : {
                                  "/var/opt/app" : { "Ref": "AppURL" }
                                }
                              }, ...
                         指定したフォルダにダウンロード、展開してくれる
                            }
                          },
                          "Properties": {
                            "UserData": {
zipball または tarball   のURL "Fn::Base64": {
                                "Fn::Base64": {
                                  "Fn::Join": ["", [
                                    "# Start applicationn",
                                    "cd /var/opt/appn",
                                    "npm config set PORT ", { "Ref": "AppServerPort" }, "n",
                                    "npm install --productionn",
                                    "NODE_ENV=production npm start > app.log 2>&1 &n",


                                npm start で起動できるアプリならなんでもOK
環境変数の取得
/**                                                                  NPM package config
 * Returns a value related by given key.
 * This method search following priority.                            NPM config (global)
 *                                                                      process.env
 * 1. NPM package config
 * 2. NPM config                                                     の順で環境変数を解決する
 * 3. process.env
 *
 * @param {String} key Environment key
 * @param {String} [defaultValue] Default value if key not found.
 * @return {String}
 */
module.exports = function (key, defaultValue) {
  var NPM_PACKAGE_PREFIX = 'npm_package_config_';
  var NPM_PREFIX = 'npm_config_';

  var value = process.env[NPM_PACKAGE_PREFIX + key];
  if (!value) {
    value = process.env[NPM_PREFIX + key];
    if (!value) {
      value = process.env[key];
    }
  }
  value = (!value && defaultValue) ? defaultValue : value;
  return value;
};
環境変数の取得
                                                                                開発時は package.json を参照

                                                                                {
   var http = require('http'),
                                                                                    "name": "harite",
       env = require(‘./env’);
                                                                                    "version": "0.1.0",
                                                                                    "scripts": {
   var server = http.createServer(function (req, res) {
                                                                                      "start": "node app.js",
     res.writeHead(200, { 'Content-Type': 'text/plain' });
                                                                                      "test": "make test"
     res.end('hello');
                                                                                    },
   });
                                                                                    "config": {
   server.listen(env(‘PORT’), function () {
                                                                                      "PORT": 5100,
     console.log('Server is running on port %d', server.address().port);
                                                                                      "REDIS_URL": "redis://localhost"
   });
                                                                                    }
                                                                                }


"npm config set harite:HOST_NAME `curl http://169.254.169.254/latest/meta-data/public-hostname`", "n",
"npm config set harite:PORT ", { "Ref": "HariteServerPort" }, "n",
"npm config set harite:REDIS_URL ", { "Fn::Join" : [ "", [ "redis://", { "Fn::GetAtt" : [ "RedisServer", "PrivateIp" ]}, n",
"npm install --productionn",                                                   AWS ではCloudInit で指定
"NODE_ENV=production npm start > harite.log 2>&1 &n",


                                   参考資料: http://d.hatena.ne.jp/sugyan/20110909/1315575343
                                            http://d.hatena.ne.jp/Jxck/20120410/1334071898
Github の場合
Branch 単位で zipball が取得できる


https://github.com/hakobera/tng6_sample/zipball/master



                リポジトリ                   ブランチ名
アプリのUpdate
Update Stack =>
                                  LoadBalancer から現行バージョン
                                  のサーバを徐々に切り離す

                                  AutoScale の最低サーバ数以下に
                                  なると、新規サーバが起動

                                  新規サーバは新しいアプリが
    zipball または tarball のURLを更新   デプロイされた状態で起動する

                                  (今回のテンプレートはなっていな
                                  いが)タグにアプリケーションの
                                  バージョンを仕込んでおいて、API
                                  経由で判定 => 停止などやれば自動
                                  化できるかも
WebSocket
ELBと相性が悪い
プロトコルでHTTPを選択すると、HTTP1.1 のUpdate
リクエストが通らないので、WebSocket がつながらな
い

プロトコルをTCPを選択すれば接続はできるが、接続先
サーバを固定できない (Socket.IO で苦労する)

60秒で必ずタイムアウトする(設定の変更はできない)


     参考: Socket.IO or WebSocket を AmazonELB でバランスする検証
                    http://d.hatena.ne.jp/Jxck/20120228/1330444857
AutoScaleと相性が悪い

AutoScale は WebSocket がつながっていても縮退し
てしまう

クライアント側での再接続処理が必要

ただし、普通に再接続すると、EC2インスタンス自体が
落ちているので、つながらない
回避策




WebSocket の URL を返す API に ELB 経由でアクセス (HTTPヘッダで返すのでも良い)

  EC2 の Public DNS名は curl http://169.254.169.254/latest/meta-data/public-hostname で取得可能

クライアントは各EC2インスタンスと直接接続する

再接続時には、また ELB 経由で新しい WebSocket サーバのURLを取得

  これを実現するクライアントライブラリ(WebSocketラッパー)を作成する
閑話休題
Pusher クローン作ってます
https://github.com/hakobera/tuppari           来週公開予定
https://github.com/hakobera/tuppari-servers




 CloudFormation のテンプレートも配布
Any Question ?

Mais conteúdo relacionado

Mais procurados

Ansible quickstart
Ansible quickstartAnsible quickstart
Ansible quickstartHideki Saito
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜Sotaro Omura
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )hiro345
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較Sugawara Genki
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼうDaiki Ichinose
 
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)CLARA ONLINE, Inc.
 
Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレperyaudo
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTMasahiro Nagano
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
WebサーバのチューニングYu Komiya
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略Hiroshi SHIBATA
 
Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Hidetoshi Hirokawa
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChefMasahiro NAKAYAMA
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境Katsutoshi Nagaoka
 

Mais procurados (20)

Zabbix API
Zabbix APIZabbix API
Zabbix API
 
Ansible quickstart
Ansible quickstartAnsible quickstart
Ansible quickstart
 
omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜omoon.org の裏側 〜FuelPHP の task 活用例〜
omoon.org の裏側 〜FuelPHP の task 活用例〜
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
 
CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼう
 
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
 
Using Windows Azure
Using Windows AzureUsing Windows Azure
Using Windows Azure
 
Docker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレDocker+CoreOS+GCEで自動スケール分散レイトレ
Docker+CoreOS+GCEで自動スケール分散レイトレ
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
 
Ansible入門
Ansible入門Ansible入門
Ansible入門
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChef
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境
 
Ansible入門...?
Ansible入門...?Ansible入門...?
Ansible入門...?
 
Ansible handson
Ansible handsonAnsible handson
Ansible handson
 

Destaque

Exifの画像方向情報
Exifの画像方向情報Exifの画像方向情報
Exifの画像方向情報Atsushi Matsuo
 
INTER-Mediator 5.1の新機能
INTER-Mediator 5.1の新機能INTER-Mediator 5.1の新機能
INTER-Mediator 5.1の新機能Atsushi Matsuo
 
INTER-Mediatorのポータルアクセスモード
INTER-MediatorのポータルアクセスモードINTER-Mediatorのポータルアクセスモード
INTER-MediatorのポータルアクセスモードAtsushi Matsuo
 
IMCakeの現状と今後
IMCakeの現状と今後IMCakeの現状と今後
IMCakeの現状と今後Atsushi Matsuo
 
INTER-MediatorによるWebアプリケーション開発入門
INTER-MediatorによるWebアプリケーション開発入門INTER-MediatorによるWebアプリケーション開発入門
INTER-MediatorによるWebアプリケーション開発入門Atsushi Matsuo
 
INTER-MediatorによるWebアプリケーション開発入門(2014年版)
INTER-MediatorによるWebアプリケーション開発入門(2014年版)INTER-MediatorによるWebアプリケーション開発入門(2014年版)
INTER-MediatorによるWebアプリケーション開発入門(2014年版)Atsushi Matsuo
 
FileMaker Server 15の新機能と改善点
FileMaker Server 15の新機能と改善点FileMaker Server 15の新機能と改善点
FileMaker Server 15の新機能と改善点Atsushi Matsuo
 

Destaque (9)

Exifの画像方向情報
Exifの画像方向情報Exifの画像方向情報
Exifの画像方向情報
 
INTER-Mediator 5.0
INTER-Mediator 5.0INTER-Mediator 5.0
INTER-Mediator 5.0
 
INTER-Mediator 5.1の新機能
INTER-Mediator 5.1の新機能INTER-Mediator 5.1の新機能
INTER-Mediator 5.1の新機能
 
INTER-Mediatorのポータルアクセスモード
INTER-MediatorのポータルアクセスモードINTER-Mediatorのポータルアクセスモード
INTER-Mediatorのポータルアクセスモード
 
IMCakeの現状と今後
IMCakeの現状と今後IMCakeの現状と今後
IMCakeの現状と今後
 
INTER-MediatorによるWebアプリケーション開発入門
INTER-MediatorによるWebアプリケーション開発入門INTER-MediatorによるWebアプリケーション開発入門
INTER-MediatorによるWebアプリケーション開発入門
 
INTER-MediatorによるWebアプリケーション開発入門(2014年版)
INTER-MediatorによるWebアプリケーション開発入門(2014年版)INTER-MediatorによるWebアプリケーション開発入門(2014年版)
INTER-MediatorによるWebアプリケーション開発入門(2014年版)
 
FMPress Publisher 3
FMPress Publisher 3FMPress Publisher 3
FMPress Publisher 3
 
FileMaker Server 15の新機能と改善点
FileMaker Server 15の新機能と改善点FileMaker Server 15の新機能と改善点
FileMaker Server 15の新機能と改善点
 

Semelhante a 10分で作る Node.js Auto Scale 環境 with CloudFormation

AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-靖 小田島
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
BCPに活かせ!一撃 CloudFormation
BCPに活かせ!一撃 CloudFormationBCPに活かせ!一撃 CloudFormation
BCPに活かせ!一撃 CloudFormation真吾 吉田
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライMasanobu Sato
 
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAmazon Web Services Japan
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみたYuki Takei
 
当社のawsへの取組
当社のawsへの取組当社のawsへの取組
当社のawsへの取組Mercari Inc.
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 
Cinnamon - simple deploy tool
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy toolYuki Shibazaki
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefnpsg
 
現場的!AWSとオンプレの違い(赤べこバージョン)
現場的!AWSとオンプレの違い(赤べこバージョン)現場的!AWSとオンプレの違い(赤べこバージョン)
現場的!AWSとオンプレの違い(赤べこバージョン)真吾 吉田
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツールtotty jp
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)Iwana Chan
 
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成Kiyoshi Sawada
 

Semelhante a 10分で作る Node.js Auto Scale 環境 with CloudFormation (20)

AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
 
densan2014-late01
densan2014-late01densan2014-late01
densan2014-late01
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
BCPに活かせ!一撃 CloudFormation
BCPに活かせ!一撃 CloudFormationBCPに活かせ!一撃 CloudFormation
BCPに活かせ!一撃 CloudFormation
 
Nginx
NginxNginx
Nginx
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライ
 
Nodejs
NodejsNodejs
Nodejs
 
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic BeanstalkAWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
AWS Black Belt Tech シリーズ 2015 - AWS Elastic Beanstalk
 
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
 
当社のawsへの取組
当社のawsへの取組当社のawsへの取組
当社のawsへの取組
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
Cinnamon - simple deploy tool
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy tool
 
ネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chefネットワークエンジニアのための Puppet / Chef
ネットワークエンジニアのための Puppet / Chef
 
現場的!AWSとオンプレの違い(赤べこバージョン)
現場的!AWSとオンプレの違い(赤べこバージョン)現場的!AWSとオンプレの違い(赤べこバージョン)
現場的!AWSとオンプレの違い(赤べこバージョン)
 
恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
OpenStack API
OpenStack APIOpenStack API
OpenStack API
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
 
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
EWD 3トレーニング・コース #4 ewd-xpressのインストールと構成
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 

Mais de Kazuyuki Honda

5分でできる ebfly
5分でできる ebfly5分でできる ebfly
5分でできる ebflyKazuyuki Honda
 
東の方からきました@鹿駆動勉強会
東の方からきました@鹿駆動勉強会東の方からきました@鹿駆動勉強会
東の方からきました@鹿駆動勉強会Kazuyuki Honda
 
Run Multi Version of Node.js on Heroku
Run Multi Version of Node.js on HerokuRun Multi Version of Node.js on Heroku
Run Multi Version of Node.js on HerokuKazuyuki Honda
 
Noder が Titanium Mobile で 作ってみた
Noder が Titanium Mobile で 作ってみた Noder が Titanium Mobile で 作ってみた
Noder が Titanium Mobile で 作ってみた Kazuyuki Honda
 
初心者の初心者による初心者のための JavaScript ゲーム開発入門
初心者の初心者による初心者のための  JavaScript ゲーム開発入門初心者の初心者による初心者のための  JavaScript ゲーム開発入門
初心者の初心者による初心者のための JavaScript ゲーム開発入門Kazuyuki Honda
 
enchant.js source reading
enchant.js source readingenchant.js source reading
enchant.js source readingKazuyuki Honda
 

Mais de Kazuyuki Honda (7)

5分でできる ebfly
5分でできる ebfly5分でできる ebfly
5分でできる ebfly
 
東の方からきました@鹿駆動勉強会
東の方からきました@鹿駆動勉強会東の方からきました@鹿駆動勉強会
東の方からきました@鹿駆動勉強会
 
Run Multi Version of Node.js on Heroku
Run Multi Version of Node.js on HerokuRun Multi Version of Node.js on Heroku
Run Multi Version of Node.js on Heroku
 
Noder が Titanium Mobile で 作ってみた
Noder が Titanium Mobile で 作ってみた Noder が Titanium Mobile で 作ってみた
Noder が Titanium Mobile で 作ってみた
 
初心者の初心者による初心者のための JavaScript ゲーム開発入門
初心者の初心者による初心者のための  JavaScript ゲーム開発入門初心者の初心者による初心者のための  JavaScript ゲーム開発入門
初心者の初心者による初心者のための JavaScript ゲーム開発入門
 
enchant.js source reading
enchant.js source readingenchant.js source reading
enchant.js source reading
 
Kinect de-theremin
Kinect de-thereminKinect de-theremin
Kinect de-theremin
 

Último

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Último (10)

SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

10分で作る Node.js Auto Scale 環境 with CloudFormation

  • 1. Node.js Auto Scaling in 10 minutes with AWS CloudFormation 2012/6/28 東京Node学園 6時限目 @hakobera
  • 3. Node.jsで1億リクエスト/日 1億リクエスト/日 => 417万リクエスト/時 => 7万リクエスト/分 => 1200リクエスト/秒
  • 5. AWS なら簡単 EC2 AMI (VMイメージ)の作成 Node.js 、依存パッケージのインストール セキュリティグループ ポート番号や接続制限 ELB プロトコルとポート番号 Auto Scale CloudWatch の設定 Auto Scale Group ポリシーの設定 アプリケーションのDeployとUpdate
  • 6. AWS なら簡単 EC2 AMI (VMイメージ)の作成 Node.js 、依存パッケージのインストール セキュリティグループ ポート番号や接続制限 ELB じゃなかった orz プロトコルとポート番号 Auto Scale CloudWatch の設定 Auto Scale Group ポリシーの設定 アプリケーションのDeployとUpdate
  • 7. そこで AWS CloudFormation の出番 http://aws.amazon.com/jp/cloudformation/ AWS インフラ構成のテンプレート 設定の一部をパラメータ化できる JSON 形式 (Noder にはお馴染み) DynamoDBとCloudFront の先週からサポート開始 詳細はこちらを参照
  • 8. 自分だけの PaaS が 簡単に作れる
  • 10. Node.js と CloudFormation の勘所 Node.js の AutoScale インストール Elastic Load アプリの Balancer と Deploy と Update WebSocket
  • 12. Node.jsのインストール バイナリパッケージを使おう ∵ micro インスタンスで Node.js のビルドが遅い Installing Node.js via package manager https://github.com/joyent/node/wiki/Installing-Node.js- via-package-manager $ sudo yum localinstall --nogpgcheck http://nodejs.tchol.org/repocfg/amzn1/nodejs-stable-release.noarch.rpm $ sudo yum install nodejs-compat-symlinks npm 残念ながら v0.8 はまだない
  • 13. Node.jsのインストール Cloud Init でパッケージ指定 "AppServerLaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata": { "AWS::CloudFormation::Init": { "config": { "packages": { "rpm" : { "nodejs" : "http://nodejs.tchol.org/repocfg/amzn1/nodejs-stable-release.noarch.rpm" }, "yum": { "gcc-c++": [], "make": [], "git" : [], "nodejs-compat-symlinks": [], "npm": [] } }, "sources" : { "/var/opt/app" : { "Ref": "AppURL" } } }, ...
  • 14. Node.jsのインストール Cloud Init の起動設定 "Properties": { (省略) "UserData": { "Fn::Base64": { "Fn::Base64": { "Fn::Join": ["", [ "#!/bin/bash -vn", "yum update -y aws-cfn-bootstrapn", "# Helper functionn", "function error_exitn", "{n", " /opt/aws/bin/cfn-signal -e 1 -r "$1" '", { "Ref": "WaitHandle" }, "'n", " exit 1n", "}n", "# Install packagesn", "/opt/aws/bin/cfn-init -s ", { "Ref": "AWS::StackName" }, " -r AppServerLaunchConfig ", " --access-key ", { "Ref": "HostKeys" }, " --secret-key ", { "Fn::GetAtt": ["HostKeys", "SecretAccessKey"] }, " --region ", { "Ref": "AWS::Region" }, " || error_exit 'Failed to run cfn-init'n",
  • 16. Cloud Watch http://aws.amazon.com/jp/cloudwatch/ http://aws.amazon.com/jp/autoscaling/ Auto Scale の条件(拡張・縮小のトリガー)は、 Cloud Watch のアラームで実現している アプリの特性の応じて、チェックする対象を変更 CPUUtilization, DiskReadBytes, DiskReadOps, DiskWriteBytes, DiskWriteOps, NetworkIn, NetworkOut Node.js だと、CPUUtilization か NetworkOut のどちらかで大体OK
  • 17. 設定例: CPUUtilization "AppServerScaleUpPolicy" : { "Type" : "AWS::AutoScaling::ScalingPolicy", "Properties" : { "AdjustmentType" : "ChangeInCapacity", "AutoScalingGroupName" : { "Ref" : "AppServerGroup" }, "Cooldown" : "60", "ScalingAdjustment" : "2" } }, "CPUAlarmHigh": { "Type": "AWS::CloudWatch::Alarm", "Properties": { "AlarmDescription": "Scale-up if CPU > 90% for 10 minutes", "MetricName": "CPUUtilization", "Namespace": "AWS/EC2", "Statistic": "Average", "Period": "300", "EvaluationPeriods": "2", "Threshold": "90", "AlarmActions": [ { "Ref": "AppServerScaleUpPolicy" } ], "Dimensions": [ { "Name": "AutoScalingGroupName", "Value": { "Ref": "AppServerGroup" } } ],
  • 19. アプリのDeploy "AppServerLaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata": { "AWS::CloudFormation::Init": { "sources" : { "/var/opt/app" : { "Ref": "AppURL" } } }, ... 指定したフォルダにダウンロード、展開してくれる } }, "Properties": { "UserData": { zipball または tarball のURL "Fn::Base64": { "Fn::Base64": { "Fn::Join": ["", [ "# Start applicationn", "cd /var/opt/appn", "npm config set PORT ", { "Ref": "AppServerPort" }, "n", "npm install --productionn", "NODE_ENV=production npm start > app.log 2>&1 &n", npm start で起動できるアプリならなんでもOK
  • 20. 環境変数の取得 /** NPM package config * Returns a value related by given key. * This method search following priority. NPM config (global) * process.env * 1. NPM package config * 2. NPM config の順で環境変数を解決する * 3. process.env * * @param {String} key Environment key * @param {String} [defaultValue] Default value if key not found. * @return {String} */ module.exports = function (key, defaultValue) { var NPM_PACKAGE_PREFIX = 'npm_package_config_'; var NPM_PREFIX = 'npm_config_'; var value = process.env[NPM_PACKAGE_PREFIX + key]; if (!value) { value = process.env[NPM_PREFIX + key]; if (!value) { value = process.env[key]; } } value = (!value && defaultValue) ? defaultValue : value; return value; };
  • 21. 環境変数の取得 開発時は package.json を参照 { var http = require('http'), "name": "harite", env = require(‘./env’); "version": "0.1.0", "scripts": { var server = http.createServer(function (req, res) { "start": "node app.js", res.writeHead(200, { 'Content-Type': 'text/plain' }); "test": "make test" res.end('hello'); }, }); "config": { server.listen(env(‘PORT’), function () { "PORT": 5100, console.log('Server is running on port %d', server.address().port); "REDIS_URL": "redis://localhost" }); } } "npm config set harite:HOST_NAME `curl http://169.254.169.254/latest/meta-data/public-hostname`", "n", "npm config set harite:PORT ", { "Ref": "HariteServerPort" }, "n", "npm config set harite:REDIS_URL ", { "Fn::Join" : [ "", [ "redis://", { "Fn::GetAtt" : [ "RedisServer", "PrivateIp" ]}, n", "npm install --productionn", AWS ではCloudInit で指定 "NODE_ENV=production npm start > harite.log 2>&1 &n", 参考資料: http://d.hatena.ne.jp/sugyan/20110909/1315575343 http://d.hatena.ne.jp/Jxck/20120410/1334071898
  • 22. Github の場合 Branch 単位で zipball が取得できる https://github.com/hakobera/tng6_sample/zipball/master リポジトリ ブランチ名
  • 23. アプリのUpdate Update Stack => LoadBalancer から現行バージョン のサーバを徐々に切り離す AutoScale の最低サーバ数以下に なると、新規サーバが起動 新規サーバは新しいアプリが zipball または tarball のURLを更新 デプロイされた状態で起動する (今回のテンプレートはなっていな いが)タグにアプリケーションの バージョンを仕込んでおいて、API 経由で判定 => 停止などやれば自動 化できるかも
  • 25. ELBと相性が悪い プロトコルでHTTPを選択すると、HTTP1.1 のUpdate リクエストが通らないので、WebSocket がつながらな い プロトコルをTCPを選択すれば接続はできるが、接続先 サーバを固定できない (Socket.IO で苦労する) 60秒で必ずタイムアウトする(設定の変更はできない) 参考: Socket.IO or WebSocket を AmazonELB でバランスする検証 http://d.hatena.ne.jp/Jxck/20120228/1330444857
  • 26. AutoScaleと相性が悪い AutoScale は WebSocket がつながっていても縮退し てしまう クライアント側での再接続処理が必要 ただし、普通に再接続すると、EC2インスタンス自体が 落ちているので、つながらない
  • 27. 回避策 WebSocket の URL を返す API に ELB 経由でアクセス (HTTPヘッダで返すのでも良い) EC2 の Public DNS名は curl http://169.254.169.254/latest/meta-data/public-hostname で取得可能 クライアントは各EC2インスタンスと直接接続する 再接続時には、また ELB 経由で新しい WebSocket サーバのURLを取得 これを実現するクライアントライブラリ(WebSocketラッパー)を作成する
  • 29. Pusher クローン作ってます https://github.com/hakobera/tuppari 来週公開予定 https://github.com/hakobera/tuppari-servers CloudFormation のテンプレートも配布