AWS Elastic Beanstalk
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

将具有群集功能的 Geddy 应用程序部署到 Elastic Beanstalk

本部分向您演示了如何使用 Elastic Beanstalk 命令行界面 (EB CLI) 和 Git 将示例应用程序部署到 Elastic Beanstalk,然后更新该应用程序以使用 Geddy 框架和 Amazon ElastiCache 来实现集群功能。集群功能增强了 Web 应用程序的高可用性、性能和安全性。要了解有关 Amazon ElastiCache 的更多信息,请转到 Amazon ElastiCache 用户指南 中的 ElastiCache 简介

注意

本示例将创建 AWS 资源,您可能要为其付费。有关 AWS 定价的更多信息,请参阅 http://www.amazonaws.cn/pricing/。某些服务是 AWS 免费使用套餐的一部分。如果您是新客户,则可免费试用这些服务。参阅 http://www.amazonaws.cn/free/ 了解更多信息。

步骤 1:设置 Git 存储库

EB CLI 是一个命令行接口,您可以将其与 Git 结合使用以快速且更轻松地部署应用程序。EB CLI 作为 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. 根据操作系统,您可能需要设置路径才能运行 geddy 命令。如果需要设置路径,请使用上一步 (安装 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 命令行界面 (EB CLI) 在您的本地项目目录中配置 Elastic Beanstalk 应用程序存储库。

配置 Elastic Beanstalk

  1. 在创建本地存储库的目录中,键入下列命令。

    eb init
  2. 当系统提示您提供 Elastic Beanstalk 地区时,键入该地区的编号。有关此产品的区域信息,请参阅 Amazon Web Services 一般参考中的区域和终端节点。在本示例中,我们将使用 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. 当系统提示时,如果要将安全外壳 (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. 当系统提示您提供别名记录前缀时,请键入要使用的别名记录前缀。Elastic Beanstalk 将基于环境名称自动创建别名记录前缀。要接受默认值,请按 Enter

    Enter DNS CNAME prefix (default is HelloWorld):

在配置 Elastic Beanstalk 后,可随时部署示例应用程序。

要更新 Elastic Beanstalk 配置,您可再次使用 init 命令。系统提示时,请更新您的配置选项。要保留上述任一设置,请按 Enter 键。

步骤 5:查看应用程序

在浏览器窗口中查看应用程序

键入以下内容:

eb open

步骤 6:更新应用程序

在部署示例应用程序后,可将其更新为自己的应用程序。在这一步中,我们会更新示例应用程序,以使用 Geddy 框架。您可以从 http://elasticbeanstalk-samples-us-west-2.s3.amazonaws.com.cn/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 以验证环境是否工作。您应看到一个显示“您好!”的网页。

您可访问运行应用程序的 EC2 实例的日志。有关访问日志的说明,请参阅从 Elastic Beanstalk 环境的 Amazon EC2 实例查看日志

接下来,让我们创建一个环境变量,并将环境设置为生产。

创建环境变量

  1. 在本地计算机上的项目目录 (例如 myapp/) 中,创建一个名为 .ebextensions 的目录。

  2. 在本地计算机上,使用以下代码段创建一个名为 node-geddy/myapp/.ebextensions/myapp.config 的文件,以便将环境设置为生产。

    注意

    YAML 依赖一致的缩进。当替换示例配置文件中的内容时,应匹配缩进级别,并且确保您的文本编辑器使用空格而不是字符来进行缩进。

    option_settings: - option_name: NODE_ENV value: production

    有关配置文件的更多信息,请参阅“Node.js 配置命名空间”。

  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

    您的环境将在几分钟后进行更新。在环境变为绿色并准备就绪后,刷新浏览器以确保环境工作。您应该仍会看到“您好!”。

接下来,让我们更新 Geddy 应用程序以使用 Amazon ElastiCache。

更新 Geddy 应用程序以使用 Amazon ElastiCache

  1. 在本地计算机上,使用以下代码段创建配置文件 node-geddy/myapp/.ebextensions/elasticache-iam-with-script.config。此配置文件会将 ElastiCache 资源添加到环境中,并在磁盘上的 /var/nodelist 下创建 ElastiCache 中的节点列表。您还可以从 http://elasticbeanstalk-samples-us-west-2.s3.amazonaws.com.cn/nodejs-example-geddy.zip 复制该文件。有关 ElastiCache 属性的更多信息,请参阅“代码段示例:ElastiCache”。

    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.cn/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 (ElastiCache: Cache 节点指标)

      注意

      确保您查看的是您的应用程序所部署到的相同地区。

      如果您复制您的应用程序 URL 并将其粘贴到其他 Web 浏览器中,则您应看到您的 CurrItem 计数在 5 分钟后上升为 2。

    2. 拍摄日志的快照,然后在 /var/log/nodejs/nodejs.log 中查找。有关日志的更多信息,请参阅“从 Elastic Beanstalk 环境的 Amazon EC2 实例查看日志”。您应看到类似如下所示的内容:

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

步骤 7:清除

如果不再希望运行您的应用程序,您可通过终止环境并删除应用程序进行清除。

请使用 eb terminate 命令终止环境并使用 eb delete 命令删除应用程序。

终止环境

从您在其中创建本地存储库的目录中,运行 eb terminate

$ eb terminate

此过程可能耗时数分钟。成功终止环境后,Elastic Beanstalk 会立即显示一条消息。