メニュー
AWS Elastic Beanstalk
開発者ガイド (API Version 2010-12-01)

クラスタリング付き Geddy アプリケーションを Elastic Beanstalk にデプロイする

ここでは、Elastic Beanstalk コマンドラインインターフェイス(EB CLI)と Git を使用してサンプルアプリケーションを Elastic Beanstalk にデプロイした後、Geddy フレームワークと Amazon ElastiCache を使用してクラスタリングするようにアプリケーションを更新する手順について説明します。クラスタリングはウェブアプリケーションの高可用性、パフォーマンス、セキュリティを拡張します。Amazon ElastiCache の詳細については、『Amazon ElastiCache User Guide』の ElastiCache の概要のページを参照してください。

注記

この例では、課金対象となる可能性のある AWS リソースを作成します。AWS の料金詳細については、http://aws.amazon.com/pricing/ を参照してください。一部のサービスは、AWS 無料利用枠の対象です。新規のお客様は、無料でこれらのサービスをテストできる場合があります。詳細については、http://aws.amazon.com/free を参照してください。

ステップ 1: Git リポジトリの設定

EB CLI は Git で使用できるコマンドラインインターフェイスで、アプリケーションを迅速かつより簡単にデプロイすることができます。EB は、Elastic Beanstalk のコマンドラインツールパッケージの一部として利用できます。EB CLI のインストール手順については、「Elastic Beanstalk コマンドラインインターフェイス(EB CLI)のインストール」を参照してください。

Git リポジトリを初期化します。次のコマンドを実行した後で、eb init を実行すると、EB CLI ではアプリケーションが Git を使用して設定されたと認識されます。

git init .

ステップ 2: Geddy 開発環境の設定

Geddy を設定し、プロジェクト構造を作成します。次のステップでは、Linux オペレーティングシステムで Geddy を設定する手順を示します。

ローカルコンピュータで Geddy 開発環境を設定するには

  1. Node.js をインストールします。手順については、http://nodejs.org/ を参照してください。次のステップに進む前に、インストールが成功したことを確認してください。

    $ node -v

    注記

    サポートされている Node.js のバージョンについては、Elastic Beanstalk でサポートされているプラットフォーム を参照してください。

  2. Geddy アプリケーション用のディレクトリを作成します。

    $ mkdir node-geddy
    $ cd node-geddy
  3. npm をインストールします。

    node-geddy$ cd . && yum install npm
  4. geddy ジェネレータを入れるかサーバーを起動するため、Geddy をグローバルにインストールします。

    node-geddy$ npm install -g geddy
  5. オペレーティングシステムによっては、geddycode> コマンドを実行するパスを設定する必要があります。パスを設定する必要がある場合、Geddy インストール時の以前のステップの出力を使用します。次に例を示します。

    node-geddy$ export:PATH=$PATH:/usr/local/share/npm/bin/geddy
  6. アプリケーション用のディレクトリを作成します。

    node-geddy$ geddy app myapp
    node-geddy$ cd myapp
  7. サーバーを起動します。すべて正しく動作していることを確認したら、サーバーを停止します。

    myapp$ geddy
    myapp$ curl localhost:4000 (or use web browser)

    サーバーを停止するには、Ctrl+C を押します。

  8. Git リポジトリを初期化します。

    myapp$ git init 
  9. 次のファイルをリポジトリへの追加から除外します。このステップは必須ではありませんが、行うことをお勧めします。

    myapp$ cat > .gitignore <<EOT 
    log/
    .gitignore
    .elasticbeanstalk/
    EOT

ステップ 3: Elastic Beanstalk の設定

次の手順では、Elastic Beanstalk command line interface(EB CLI)を使用して、ローカルプロジェクトディレクトリに Elastic Beanstalk アプリケーションレポジトリを設定します。

Elastic Beanstalk を設定するには

  1. ローカルリポジトリを作成したディレクトリから、次のコマンドを入力します。

    eb init
  2. Elastic Beanstalk リージョンを要求されたら、リージョンの番号を入力します。この製品のリージョンについては、『Amazon Web Services General Reference』のリージョンとエンドポイントのページを参照してください。この例では、[US West (Oregon)] を使用します。

  3. Elastic Beanstalk アプリケーションの使用を求められたら、オプション [Create new Application] に対応する数値を入力します。アプリケーション名がまだ設定されていない場合、Elastic Beanstalk により現在のディレクトリ名に基づいてアプリケーション名が生成されます。この例では、geddyapp を使用します。

    Enter an AWS Elastic Beanstalk application name (auto-generated value is "myapp"): geddyapp

    注記

    アプリケーション名にスペースが含まれる場合でも、引用符は使用しないでください。

  4. 使用している正しいプラットフォームが Elastic Beanstalk で正常に検知された場合は、「y」と入力します。それ以外の場合は「n」と入力し、正しいプラットフォームを指定します。

  5. プロンプトが表示されたら、インスタンスに接続するように Secure Shell (SSH) を設定する場合は、「y」と入力します。SSH を設定しない場合は、「n」と入力します。この例では、「n」を入力します。

    Do you want to set up SSH for your instances?
    (y/n): n
  6. 実行中の環境を作成します。

    eb create
  7. Elastic Beanstalk の環境名の入力を求められたら、環境の名前を入力してください。Elastic Beanstalk は、アプリケーション名に基づいて環境名を自動的に作成します。デフォルトを使用する場合は、Enter キーを押します。

    Enter Environment Name
    (default is HelloWorld-env):

    注記

    アプリケーション名にスペースが含まれる場合、環境名にはスペースが含まれないようにしてください。

  8. CNAME プレフィックスを指定するように求められたら、使用する CNAME プレフィックスを入力します。Elastic Beanstalk では、環境の名前に基づいて CNAME プレフィックスを自動的に作成します。デフォルトを使用する場合は、Enter キーを押します。

    Enter DNS CNAME prefix
    (default is HelloWorld):

Elastic Beanstalk を設定すると、サンプルアプリケーションをデプロイできるようになります。

Elastic Beanstalk の設定を更新する場合は、もう一度 init コマンドを使用します。プロンプトが表示されたら、設定オプションを更新できます。前の設定を維持する場合は、Enter キーを押します。

ステップ 5: アプリケーションの表示

アプリケーションを表示するには

  • ブラウザウィンドウでアプリケーションを開くには、次を入力します。

    eb open

ステップ 6: アプリケーションの更新

サンプルアプリケーションをデプロイした後、独自のアプリケーションで更新できます。このステップでは、Geddy フレームワークを使用するようサンプルアプリケーションを更新します。http://elasticbeanstalk-samples-us-east-1.s3.amazonaws.com/nodejs-example-geddy.zip から最終ソースコードをダウンロードできます。

Geddy を使用するようアプリケーションを更新するには

  1. ローカルコンピュータで node-geddy/myapp/package.json というファイルを作成します。このファイルには必要な依存関係が含まれます。

    {
        "name": "Elastic_Beanstalk_Geddy",
        "version": "0.0.1",
        "dependencies": {
            "geddy": "0.6.x"
        }
    }
  2. ローカルコンピュータで、プログラムへのエントリポイントとして node-geddy/maypp/app.js というファイルを作成します。

    var geddy = require('geddy');
    
    geddy.startCluster({
        hostname: '0.0.0.0',
        port: process.env.PORT || '3000',
        environment: process.env.NODE_ENV || 'development'
    });

    前のスニペットでは、環境設定用の環境変数を使用します。手動で環境を本番に設定できます(environment: 'production')。また、環境変数を作成し、上の例のように使用することもできます。ここでは、環境変数を作成し、次の手順で環境を本番に設定します。

  3. ローカルでテストします。

    myapp$ npm install
    myapp$ node app

    サーバーが起動します。サーバーを停止するには、Ctrl+C を押します。

  4. Elastic Beanstalk にデプロイします。

    myapp$ git add .
    myapp$ git commit -m "First Geddy app"
    myapp$ eb deploy
  5. 数分後、環境が更新されます。環境が緑色で示されていて準備完了したら、URL を再表示して正しく動作することを確認します。ウェブページに "Hello, World!" が表示されます。

アプリケーションを実行している EC2 インスタンスのログにアクセスできます。ログのアクセス手順については、「インスタンスログ」を参照してください。

次に、環境変数を作成して、環境を本番に設定します。

環境変数を作成するには

  1. ローカルコンピュータのプロジェクトディレクトリ(例えば、myapp/)に .ebextensions というディレクトリを作成します。

  2. ローカルコンピュータで、環境を本番に設定する次のスニペットが入ったファイル node-geddy/myapp/.ebextensions/myapp.config を作成します。

    注記

    YAML は、一貫したインデントに依存します。設定ファイルの例でコンテンツを置き換える際はインデントレベルを一致させ、テキストエディタがインデントにタブ文字ではなくスペースを使用していることを確認します。

    option_settings:
      - option_name: NODE_ENV
        value: production

    設定ファイルの詳細については、「設定ファイル」を参照してください。

  3. "geddy secret" を実行してシークレット値を取得します。アプリケーションを正しくデプロイするには、シークレット値が必要です。

    myapp$ geddy secret

    node-geddy/myapp/config/secrets.json.gitignore に追加できます。また、環境変数にシークレット値を入れ、内容を書き出すコマンドを作成することもできます。この例では、コマンドを使用します。

  4. node-geddy/myapp/config/secrets.json から node-geddy/myapp/.elasticbeanstalk/optionsettings.gettyapp-env ファイルにシークレット値を追加します。(optionsettings ファイルの名前には、環境名と同じ拡張子が付きます)。ファイルは次のようになります。

    [aws:elasticbeanstalk:application:environment]
    secret=your geddy secret
    PARAM1=
  5. 更新したオプション設定を使用して Elastic Beanstalk 環境を更新します。

    myapp$ eb update

    環境が緑色で示されていて準備完了したことを確認したら、次のステップに進みます。

  6. ローカルコンピュータで、次のコマンドが入った設定ファイル node-geddy/myapp/.ebextensions/write-secret.config を作成します。

    container_commands:
      01write:
        command: |
          cat > ./config/secrets.json << SEC_END
            { "secret":   "`{ "Fn::GetOptionSetting": {"OptionName": "secret", "Namespace":"aws:elasticbeanstalk:application:environment"}}`" }
          SEC_END
  7. ファイルをローカルリポジトリに追加し、変更をコミットし、更新したアプリケーションをデプロイします。

    myapp$ git add .
    myapp$ git commit -m "added config files"
    myapp$ eb deploy

    数分後、環境が更新されます。環境が緑色で示されていて準備が完了したら、ブラウザを再表示して正しく動作することを確認します。まだ "Hello, World!" が表示されます。

次に、Amazon ElastiCache を使用するよう Geddy アプリケーションを更新します。

Amazon ElastiCache を使用するよう Geddy アプリケーションを更新するには

  1. ローカルコンピュータで、次のスニペットが入った設定ファイル node-geddy/myapp/.ebextensions/elasticache-iam-with-script.config を作成します。この設定ファイルでは、elasticache リソースを環境に追加し、/var/nodelist にディスクにある elasticache のノードリストを作成します。また、http://elasticbeanstalk-samples-us-east-1.s3.amazonaws.com/nodejs-example-geddy.zip からファイルをコピーすることもできます。ElastiCache プロパティの詳細については、「スニペット例: ElastiCache」を参照してください。詳細なリファレンスについては、「AWS リソースプロパティタイプのリファレンス」を参照してください。

    Resources:
      MyElastiCache:
        Type: AWS::ElastiCache::CacheCluster
        Properties:
          CacheNodeType: 
             Fn::GetOptionSetting:
                 OptionName : CacheNodeType
                 DefaultValue: cache.m1.small
          NumCacheNodes: 
               Fn::GetOptionSetting:
                 OptionName : NumCacheNodes
                 DefaultValue: 1
          Engine: 
               Fn::GetOptionSetting:
                 OptionName : Engine
                 DefaultValue: memcached
          CacheSecurityGroupNames:
            - Ref: MyCacheSecurityGroup
      MyCacheSecurityGroup:
        Type: AWS::ElastiCache::SecurityGroup
        Properties:
          Description: "Lock cache down to webserver access only"
      MyCacheSecurityGroupIngress:
        Type: AWS::ElastiCache::SecurityGroupIngress
        Properties:
          CacheSecurityGroupName: 
            Ref: MyCacheSecurityGroup
          EC2SecurityGroupName:
            Ref: AWSEBSecurityGroup
      AWSEBAutoScalingGroup :
        Metadata :
          ElastiCacheConfig :
            CacheName :
              Ref : MyElastiCache
            CacheSize :
               Fn::GetOptionSetting:
                 OptionName : NumCacheNodes
                 DefaultValue: 1
      WebServerUser : 
        Type : AWS::IAM::User
        Properties :
          Path : "/"
          Policies:
            -
              PolicyName: root
              PolicyDocument :
                Statement :
                  -
                    Effect : Allow
                    Action : 
                      - cloudformation:DescribeStackResource
                      - cloudformation:ListStackResources
                      - elasticache:DescribeCacheClusters
                    Resource : "*"
      WebServerKeys :
        Type : AWS::IAM::AccessKey
        Properties :
          UserName :
            Ref: WebServerUser
    
    Outputs:
      WebsiteURL:
        Description: sample output only here to show inline string function parsing
        Value: |
          http://`{ "Fn::GetAtt" : [ "AWSEBLoadBalancer", "DNSName" ] }`
      MyElastiCacheName:
        Description: Name of the elasticache
        Value:
          Ref : MyElastiCache
      NumCacheNodes:
        Description: Number of cache nodes in MyElastiCache
        Value:
          Fn::GetOptionSetting:
            OptionName : NumCacheNodes
            DefaultValue: 1
    
    files:
      "/etc/cfn/cfn-credentials" :
        content : |
          AWSAccessKeyId=`{ "Ref" : "WebServerKeys" }`
          AWSSecretKey=`{ "Fn::GetAtt" : ["WebServerKeys", "SecretAccessKey"] }`
        mode : "000400"
        owner : root
        group : root
    
      "/etc/cfn/get-cache-nodes" :
        content : |
          # Define environment variables for command line tools
          export AWS_ELASTICACHE_HOME="/home/ec2-user/elasticache/$(ls /home/ec2-user/elasticache/)"
          export AWS_CLOUDFORMATION_HOME=/opt/aws/apitools/cfn
          export PATH=$AWS_CLOUDFORMATION_HOME/bin:$AWS_ELASTICACHE_HOME/bin:$PATH
          export AWS_CREDENTIAL_FILE=/etc/cfn/cfn-credentials
          export JAVA_HOME=/usr/lib/jvm/jre
    
          # Grab the Cache node names and configure the PHP page
          cfn-list-stack-resources `{ "Ref" : "AWS::StackName" }` --region `{ "Ref" : "AWS::Region" }` | grep MyElastiCache | awk '{print $3}' | xargs -I {} elasticache-describe-cache-clusters {} --region `{ "Ref" : "AWS::Region" }` --show-cache-node-info | grep CACHENODE | awk '{print $4 ":" $6}' > `{ "Fn::GetOptionSetting" : { "OptionName" : "NodeListPath", "DefaultValue" : "/var/www/html/nodelist" } }`
        mode : "000500"
        owner : root
        group : root
    
      "/etc/cfn/hooks.d/cfn-cache-change.conf" :
        "content": |
          [cfn-cache-size-change]
          triggers=post.update
          path=Resources.AWSEBAutoScalingGroup.Metadata.ElastiCacheConfig
          action=/etc/cfn/get-cache-nodes
          runas=root
    
    sources :
      "/home/ec2-user/elasticache" : "https://s3.amazonaws.com/elasticache-downloads/AmazonElastiCacheCli-latest.zip"
    
    commands: 
      make-elasticache-executable:
        command: chmod -R ugo+x /home/ec2-user/elasticache/*/bin/*
    
    packages : 
      "yum" :
        "aws-apitools-cfn"  : []
    
    container_commands:
      initial_cache_nodes:
        command: /etc/cfn/get-cache-nodes
  2. ローカルコンピュータで、次のスニペットが入った設定ファイル node-geddy/myapp/.ebextensions/elasticache_settings.config を作成します。

    option_settings:
      "aws:elasticbeanstalk:customoption" :
         CacheNodeType : cache.m1.small
         NumCacheNodes : 1
         Engine : memcached
         NodeListPath : /var/nodelist
  3. ローカルコンピュータで node-geddy/myapp/config/production.js を更新します。ファイルの先頭(ヘッダーの直後)に次の行を追加します。

    var fs = require('fs')

    次に、modules.exports の直前に次のスニペットを追加します。

    var data = fs.readFileSync('/var/nodelist', 'UTF8', function(err) {
        if (err) throw err;
    });
    
    var nodeList = [];
    if (data) {
        var lines = data.split('\n');
        for (var i = 0 ; i < lines.length ; i++) {
            if (lines[i].length > 0) {
                nodeList.push(lines[i]);
            }
        }
    }
    
    if (nodeList) {
        config.sessions = {
          store: 'memcache',
          servers: nodeList,
          key: 'sid',
          expiry: 14*24*60*60
        }
    }
  4. ローカルコンピュータで node-geddy/myapp/package.json を更新して memcached を含めます。

    {
       "name": "Elastic_Beanstalk_Geddy",
       "version": "0.0.1",
       "dependencies": {
          "geddy": "0.6.x",
          "memcached": "*"
       }
    }
  5. ファイルをローカルリポジトリに追加し、変更をコミットし、更新したアプリケーションをデプロイします。

    myapp$ git add .
    myapp$ git commit -m "added elasticache functionality"
    myapp$ git aws.push
  6. 数分後、環境が更新されます。環境が緑色で示されていて準備が完了したら、すべて正しく動作することを確認します。

    1. Amazon CloudWatch コンソール で ElastiCache メトリクスを表示します。ElastiCache メトリクスを表示するには、左パネルで [ElastiCache] をクリックし、[Viewing] リストから [ElastiCache: Cache Node Metrics] を選択します。

      注記

      アプリケーションのデプロイ先と同じリージョンを調べていることを確認してください。

      アプリケーション URL をコピーして別のウェブブラウザに貼り付けた場合、5 分後に CurrItem カウントは 2 に上がります。

    2. ログのスナップショットを取り、/var/log/nodejs/nodejs.log を調べます。ログの詳細については、「インスタンスログ」を参照してください。次のような結果が表示されます。

      "sessions": {
          "key": "sid",
          "expiry": 1209600,
          "store": "memcache",
          "servers": [
            "aws-my-1awjsrz10lnxo.ypsz3t.0001.usw2.cache.amazonaws.com:11211"
          ]
        },

ステップ 7: クリーンアップ

アプリケーションを実行したくない場合は、環境を終了し、アプリケーションを削除してクリーンアップできます。

環境を終了するには terminate コマンドを、アプリケーションを削除するには delete コマンドを使用します。

環境を終了するには、アプリケーションを削除できます。

  • ローカルリポジトリを作成したディレクトリから、eb terminate を実行します。

    $ eb terminate

    このプロセスには数分かかることがあります。環境が正常に終了すると、Elastic Beanstalk にメッセージが表示されます。