亚马逊标题自动抓取

在等待一个新项目时,我想学习一些有用的东西。 而且由于在许多项目中我们需要评估和测试正在开发的应用程序的性能,而很少有足够的硬件来生成实际负载,因此我决定学习更多有关按需在云中按需配置虚拟机的知识,即Amazon Web Services (AWS)。

我已经学到了很多有关可用于AWS的工具以及资源(机器实例,安全组,数据库等)的自动化设置以及AWS云中虚拟机实例的自动自定义的许多知识。 我想简要介绍一下AWS,并简要概述工具和自动化选项。 如果您熟悉AWS / EC2,则可能需要直接将介绍跳到自动化部分。

为什么选择AWS?

亚马逊是“基础设施即服务”的领先提供商,并正在不断为其产品增加新的服务。 AWS允许您按需创建虚拟机,对其进行负载平衡,将它们连接到“数据库即服务”(与手动管理的数据库相比具有多个优点)以及各种其他服务(例如通知,电子邮件和排队服务) 。 您可以访问内置监视,并且可以将应用程序部署到基于此的“平台即服务”,同时保留对这些低级资源的控制权。

关注官方AWS博客以了解新服务,功能等。

AWS入门

创建一个AWS账户,您将需要一部电话和一张信用卡(如果您使用任何付费服务或超出任何免费使用限制都将被收取费用)。 在注册过程中请务必小心,因为UI并非完全防错。 您的帐户可能需要最多两个小时才能正常运行。

下一步要做的是浏览AWS管理控制台 ,该控制台可让您创建和配置各种服务和资源,最有趣的是Elastic Compute Cloud(EC2),您可以在其中启动新的虚拟机。 管理控制台很容易解释,尽管不像我希望的那样友好。 您可能需要查看这些屏幕快照,以显示如何在管理控制台中创建EC2实例

简要概述

AWS的核心规则是,您仅需支付使用费用,即实例的运行时间和流量-请参阅AWS Simple Monthly Calculator

最重要的资源是EC2,因为它允许您创建称为“实例”的虚拟机。 关于它们的内存和计算能力,存在不同类型的实例 。 默认情况下,它们是瞬态的,一旦停止使用它们就会被丢弃(终止)。 您可能还拥有一个由弹性块存储(EBS)支持的实例,该实例使您可以停止并重新启动具有任何状态并保留更改的实例,Amazon会为此收取$ 0.10 / GB /月。 如果只需要保留一些数据,也可以将EBS存储作为卷装入实例。 没有快速的方法可以重新创建终止的实例,您必须再次执行向导-这是命令行工具和自动化变得很方便的地方。

设置EC2实例时,您可能还需要将它们分配到同一安全组中,并配置对安全组中的哪些人开放的端口(默认情况下,您甚至无法SSH输入)。

如果您想了解有关EC2的全部信息,请转到Amazon EC2用户指南

除了EC2外,还有许多其他有趣的服务,例如Elastic Beanstalk(PaaS,当前用于Java Webapp,使用Tomcat),分布式存储S3等。还有一些其他服务,例如Amazon CloudWatch ,这是一项(性能)针对您的AWS基础架构的监控工具。 (这可以通过New Relic监视进行补充,以进一步了解应用程序。)

利用亚马逊免费套餐

亚马逊免费为新客户提供一定数量的资源,为期一年,如果您消耗的资源更多,则只需要付费即可。 它包括例如由EBS支持的不停止运行的微型EC2实例(即它是持久的,您可以停止并再次启动它),15 GB流量,10 GB EBS存储,5 GB S3存储,10个CloudWatch指标等不幸的是,尽管它们在Amazon SimpleDB (NoSQL键值存储)中提供了1GB的空间,但它不包括Amazon管理MySQL / Oracle数据库( RDS )。

这意味着您可以免费拥有一个持续运行的EC2 Micro实例(613 MB内存)。 您可以将其用作云中的基础,例如,因为两个EC2实例之间的流量更快/更便宜,并且由于它可以完全访问同一安全组内的计算机。

最佳选择可能是将您的实例基于Amazon Linux AMI ,它是针对AWS优化的RedHat Linux的变体,配备了大多数AWS API命令行工具和CloudInit,用于自动系统设置(稍后介绍)。 建议您浏览用户指南 ,该指南描述了可用的工具以及如何使用CloudInit。

自动化呢?

如果您是第一次执行某项操作,则AWS Management Console很棒,但是对于重复任务而言,向导太耗时。 特别是如果您需要设置多个实例,比如说RDS数据库实例,EC2计算机实例以及相应的安全组或许多相同的实例。 我们将研究如何自动执行此操作。

除了设置基础架构之外,您通常还需要自定义EC2实例(至少通过安装和启动所需的EC2实例)。 您可以通过SSH登录它们,但是能够自动化它不是很好,特别是如果您需要多个类似的实例吗?

请注意,我现在只关注自动化AWS用户的工作。 也可以将AWS配置为在需要时(例如,当负载超过限制时) 自动启动新的EC2实例 ,但这是另一回事。
概述:

  • 基础架构配置自动化:
    • AWS API命令行工具(或AWS Java API或第三方工具/库)
    • AWS CloudFormation
  • 实例操作系统和软件设置自动化:
    • Canonical CloudInit(Ubuntu和Amazon Linux AMI)–也许利用Puppet或Chef
    • 创建定制的AMI
自动化基础架构配置

在没有AWS管理控制台的情况下,有两个突出的选项可用于创建EC2实例和其他资源:AWS API命令行工具和AWS CloudFormation。

AWS API命令行工具

亚马逊为其大多数服务(例如EC2和RDS)提供命令行工具。
EC2 :Robert Sosinovski早在2008年就发布了关于使用Amazon EC2命令行工具 (尽管其名称并非特定于Mac OS X)的很好的说明,但它们仍然有效,因此只要关注它们,就无需重复了。它们在这里(基本上是下载,解压缩,设置环境变量,提供凭据)。 或者,您可以转到下载页面并按照官方说明进行操作 。 我建议您创建一个文件夹,以包含所有工具=> $ AWS_FOLDER / ec2 /等,而不是〜/ .ec2 /。

如果要使用除默认us-east-1之外的其他AWS区域,则还需要设置环境变量EC2_URL,请参阅区域端点列表或命令ec2-describe-regions 。 例如 (我的URL中间有ec2,与端点列表相反,但显然也可以):

export EC2_URL=https://eu-west-1.ec2.amazonaws.com

其他工具的身份验证设置 :虽然EC2工具的文档仅描述了通过X.509证书(环境变量EC2_PRIVATE_KEY,EC2_CERT)进行的身份验证,但其他工具(至少是RDS,CloudFormation)支持通过环境变量AWS_CREDENTIAL_FILE指向统一身份验证到包含您的AWS Access Key ID和秘密密钥的文件(可以在您的AWS帐户中的 “安全性凭证-访问密钥”下找到)中,配置在工具的自述文件中进行了描述。

RDS :RDS命令行工具的设置与EC2非常相似,只需下载它们并添加环境变量,如随附的readme.txt中所述。

与EC2一样,您可能需要更改默认的RDS区域

export RDS_URL=https://eu-west-1.rds.amazonaws.com
Vaadin测试设置中的示例

我最初的计划是尝试使用Amazon Web Services进行Vaadin可伸缩性测试中描述的性能测试,不幸的是,由于测试应用程序无法运行,事实证明这是不可能的。 在此过程中,我已自动完成了各个设置步骤,如下所示。 您可能需要查看博客文章以了解上下文。

我不需要创建安全组并允许通过命令行访问它,就像通过管理控制台进行操作一样。 您可以按以下方式打开SSH端口:

ec2-authorize  -p 22

创建两个EC2实例:

ec2-run-instances ami-1a0f3d6e -t m1.large -k VaadinAS --instance-count 2 -z eu-west-1c -g quick-start-1
  • -k指定将与该实例相关联的现有密钥对的名称(管理控制台为您提供了在首次创建实例时创建的密钥对)的名称,从而无需密码即可进行ssh登录
  • -z指定区域内的可用区(AZ)(在Mgmt Console中创建实例时,您可以看到可用区),最好将所有资源都放在同一AZ中
  • -g指定一个现有的安全组(再次在控制台中创建); 我相信默认是“默认”

ec2-run-instances命令还支持–user-data或–user-data-file属性,以将设置指令传递给CloudInit,如稍后所述。

要登录实例,您将需要它们的公共域名/ IP(在命令完成时打印)和用户名,这取决于所使用的AMI(最简单的方法:在Mgmt Console中右键单击该实例,然后选择“连接”以获取)完整的SSH connect命令)和密钥文件(在我的情况下为./VaadinAS.pem)。 因此,我将以如下方式登录我的第一个实例(前提是我已经打开了安全组中的端口22):

ssh -i VaadinAS.pem ubuntu@ec2-46-137-136-253.eu-west-1.compute.amazonaws.com

使用MySQL创建RDS实例(启动完成可能需要几分钟):

rds-create-db-instance quicktickets --allocated-storage 5 -c db.m1.large  -e MySQL5.1 -u quicktickets -p V3ryS3cr3t  -z eu-west-1c --backup-retention-period 0 --db-name quicktests
  • quicktickets将是实例的名称
  • 最大 大小为5 GB(以后可以更改)
  • -c –它基于db.m1.large实例
  • -e –数据库类型为MySQL,-u用户名快捷票,-p密码V3ryS3cr3t
  • -z eu-west-1c将其置于与EC2实例相同的可用区中
  • –backup-retention-period 0 –不保留备份(默认:1天)
  • –db-name quicktests –连接到它所需

接下来,我需要使数据库可从我的EC2实例(在安全组quick-start-1中)访问:

rds-authorize-db-security-group-ingress default --ec2-security-group-name quick-start-1 --ec2-security-group-owner-id
  • 您可以找到您的AWS账户ID在AWS帐号的安全凭据下

要查找实例的主机名,请执行rds-describe-db-instance ,它还会告诉您实例是仍在启动还是已经在运行。
现在,您可以从安全组中的EC2实例连接到数据库:

mysql -h quicktickets.cpokd2djuazy.eu-west-1.rds.amazonaws.com -u quicktickets --password=V3ryS3cr3t quicktickets

AWS CloudFormation

CloudFormation是Amazon的一项新的(2/2011)免费服务,使您能够以文本格式描述所需的资源及其依赖项,并使用此“模板”通过以下方式实例化它们(“创建堆栈”): AWS管理控制台或通过CloudFormation命令行工具 。 您还可以共享您的模板,并使用和组合其他人创建的模板。 模板还支持UserData属性,您可以使用该属性将设置说明传递给CloudInit,如稍后所述。 查看此基于屏幕截图的文章,有关通过管理控制台设置CF堆栈
模板文件示例:

{  "AWSTemplateFormatVersion": "2010-09-09",
  "Description" : "One EC2 instance with a security group open for SSH",
 
  "Parameters": {
    "KeyName": {
      "Description" : "Name of an existing EC2 KeyPair to enable SSH access",
      "Type": "String"
    },
    "InstanceType": {
      "Default": "m1.large",  "Type": "String"
    }
  },
 
  "Resources": {
 
    "EC2SecurityGroup": {
      "Properties": {
        "SecurityGroupIngress": [
          {
            "FromPort": "22",
            "CidrIp": "0.0.0.0/0",
            "ToPort": "22",
            "IpProtocol": "tcp"
          }
        ],
        "GroupDescription": "SSH access"
      },
      "Type": "AWS::EC2::SecurityGroup"
    },
 
    "Ec2Instance": {
      "Properties": {
        "SecurityGroups": [{"Ref": "EC2SecurityGroup"}],
        "ImageId": { "Fn::FindInMap": ["AWSRegionArch2AMI",
            {"Ref": "AWS::Region"}, "64"
          ]
        },
        "UserData": {
          "Fn::Base64": { "Fn::Join": ["", [
              "#!/bin/bash -v\n",
              "# you init bash script here...\n"
        ]]} },
        "KeyName": { "Ref": "KeyName" },
        "InstanceType": { "Ref": "InstanceType" }
      },
      "Type": "AWS::EC2::Instance"
    }
  },
 
  "Mappings": {
    "AWSInstanceType2Arch" : {
      "m1.large"    : { "Arch" : "64" }, "m1.xlarge"   : { "Arch" : "64" }, ...
    }
  },
 
  "Outputs" : {
    "InstanceId" : {
      "Description" : "InstanceId of the newly created EC2 instance",
      "Value" : { "Ref" : "Ec2Instance" }
    },
    "AZ" : {
      "Description" : "Availability Zone of the newly created EC2 instance",
      "Value" : { "Fn::GetAtt" : [ "Ec2Instance", "AvailabilityZone" ] }
    },
    "PublicIP" : {
      "Description" : "Public IP address of the newly created EC2 instance",
      "Value" : { "Fn::GetAtt" : [ "Ec2Instance", "PublicIp" ] }
    }
  }
}
  • 4:如您所见,您可以定义属性(具有默认值),当从模板创建新堆栈时可以为其提供值
  • 16、31:接下来,它定义了两个资源:安全组和EC2实例(使用某些映射,因为AMI的名称因地区而异)
  • 38:可以通过base64编码的UserData将设置说明提供给CloudInit
  • 56:您还可以通过DescribeStacks函数定义哪些信息可用(命令行:cfn-describe-stacks)

通过CloudFormation,您可以定义任何资源(EC2实例,RDS实例,负载平衡器,安全组等),它们的依存关系,以及通过CloudInit定义各种启动时操作,如SW安装。 模板是有效的JSON文档。

示例: 使用CloudFormation和Cloud-Init安装和启动RoR应用程序 (具有WaitCondition功能)–它不太长,描述了模板文件的各个部分。 您也可以浏览公共模板文件 ,例如: 具有Amazon RDS数据库实例的单个EC2实例Web服务器

2011年6月,亚马逊还启动了CloudFormer ,这是一个原型工具,使您可以从帐户中的现有AWS资源创建CloudFormation模板。

如果您仍需要更多信息,请阅读《 CloudFormation用户指南》

使用CloudFormation元数据和帮助程序脚本自定义实例

通过AWS CloudFormation引导应用程序

AWS CloudFormation允许您通过模板中的元数据定义软件包,文件和操作系统服务的集合。 此外,它还提供了辅助功能

解释元数据并对其执行操作,安装软件包,创建文件以及在实例上启动或重新启动服务。 AWS CloudFormation脚本基于基本CloudInit功能构建,使您能够创建通用的简单CloudInit启动脚本,该脚本通过元数据进行数据驱动。 您在元数据中描述了主机上需要安装的内容,AWS CloudFormation负责此操作。

有关如何使用元数据和帮助程序脚本 (如cfn-init)的说明,请参阅文档,该脚本用于安装程序包,下载和解压缩归档文件,启动服务以及根据元数据部分中的数据创建文件。 它还提到了CloudFormation和Chef或Puppet的集成,在将AWS CloudFormation与Opscode Chef 集成以及将AWS CloudFormation与Puppet集成的白皮书中对此进行了详细描述。 如果您打算使用CloudFormation,则应完全阅读此22页的指南。

(注意: cfn-init支持下载和解压缩软件包,可用于例如获取GitHub按需提供的应用程序的最新源代码。)

您可以在此模板中看到利用元数据和帮助程序脚本的用法示例。

其他选择
  • AWS Java API(命令行工具使用它,它基于Web服务调用)
  • 第三方工具/库,例如Ruby gem Fog
  • Chef + Knife和Puppet(我相信他们为AWS WS调用提供了自己的包装器并利用CloudInit)

自动化EC2实例OS / SW设置

要在EC2实例及其配置中自定义软件,您可以创建自定义的AMI,也可以将Canonical的CloudInit与支持它的AMI(Amazon Linux和Ubuntu以及其他)一起使用。 如果您使用CloudFormation,则还有另一种基于CloudInit的可能性,如上文CF部分所述。

Canonical CloudInit和实例用户数据

您可以通过“ 用户数据”属性(最大16KB)将任何文本数据传递到新实例,然后可以从实例中的http://169.254.169.254/latest/user-data获得数据(您也可以访问各种元数据 )。 CloudInit是由Ubuntu背后的公司Canonical开发的Linux实用程序,可在启动时(大约在rc.local运行时)读取这些数据并处理其中嵌入的所有指令。 例如,如果它以#!开头。 然后在根目录下作为shell脚本运行。

CloudInit在用户数据中接受不同类型的指令,以第一行区分:脚本(#!…),云配置数据,即要安装的软件包等(#cloud-config),要处理的文件的URL(#include…) ,#upstart-job向/ etc / init(在每次启动时运行)中添加一些内容。 它甚至可以处理gzip压缩的用户数据和多部分数据,结合几种指令类型(请参阅cloud-utils和命令write-mime-multipart )。

#cloud-config类型非常有用,因为它是安装软件包和执行命令的一种比bash脚本更简单的方法。 它包含YAML格式的指令f.ex。 “ runcmd”运行命令行工具,“ packages”通过操作系统的软件包管理器安装软件包。 示例: 使用 #cloud-config 安装Jenkins CI

CloudInit的文档还不够完善,您有时可能需要阅读Python源代码 。 如果出现问题,可以检查实例的/var/log/cloud-init.log中的日志。

除了官方文档外,您可能还想查看Xebia的CloudInit简介演示文稿,并阅读Amazon Linux AMI 用户指南中有关CloudInit的部分。

创建自定义的Amazon Machine Image

CloudInit在启动时安装和配置软件,因此实例需要更长的时间才能完全可用。 如果这是一个问题,那么您可能更喜欢使用已安装和配置的所有软件来创建自己的自定义Amazon Machine Image (AMI)。 例如,在此简短的文章中描述了如何从现有的 (2007年)或官方的AMI定制文档中 创建新的AMI ,您可能还想看看EC2 AMI命令行工具 。 然后,您将基于定制的AMI创建新的EC2实例。

一些相关的东西

如果您的EC2实例需要进行通信并使用要求它们位于同一子网中的技术,则可以使用Amazon Virtual Private Cloud (VPC;免费),甚至可以通过VPN将其连接到数据中心(每小时$ 0.05)。 例如,对于运行多个JMeter实例,这可能是必需的。

关于JMeter,JörgKalsbach创建了一个AMI,该AMI简化了JMeter主从服务器场的创建(3/2010): JMeter In The Cloud –基于云的负载测试环境 (请阅读文档)。 (技巧是,主实例启动从属实例,从而知道其IP。我想可以使用CloudFormation,自动缩放和用户数据/ CloudInit来完成类似的操作。)

摘要

AWS是一个动态开发的平台,具有不断改进的工具和不断增长的服务提供。 使用基于Web的管理控制台非常容易上手,但是很快将变得更加方便,可以迁移到更加自动化的界面,例如命令行工具甚至整个基础架构堆栈设置的CloudFormation。 通过创建自定义图像或在启动时通过CloudInit和/或CloudFormation的元数据和脚本对实例进行自定义的支持非常好,人们已经将其与自己喜欢的DevOps工具Chef和Puppet结合在一起。

我建议您先使用管理控制台开始使用AWS,然后在您熟悉概念和用法后切换到命令行工具和CloudInit。 如果需要重复供应多个资源,则应使用CloudFormation及其元数据和帮助程序脚本(也许还利用Puppet / Chef)。

参考: The Holy Java博客上来自JCG合作伙伴 Jakub Holy的15分钟之内的Amazon Web Services和全自动资源供应入门

相关文章 :


翻译自: https://www.javacodegeeks.com/2011/12/getting-started-with-amazon-web.html

亚马逊标题自动抓取

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐