65.9K
CodeProject 正在变化。 阅读更多。
Home

Elastic Beanstalk 应用 v2

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2017 年 7 月 28 日

CPOL

6分钟阅读

viewsIcon

8603

无人工干预地安装 Elastic Beanstalk 的步骤

引言

本文介绍了配置我的 Elastic Beanstalk 服务器部署到完成的步骤,无需手动干预。这是迈向 CI/CD 的又一步。

背景

我最新的任务是在 AWS Elastic Beanstalk 托管的 Web 服务器上安装几个应用程序。我从 Visual Studio 中的应用程序创建一个 zip 文件,然后添加一些内容,通过键入“deploy”来安装 Elastic Beanstalk 服务器集群上的所有其他应用程序。

Using the Code

我必须在同一台服务器上托管多个应用程序,所以我写了另一篇文章这里 [这可能是一个赤裸裸的推广,但只是为我的情况设置了先决条件]。

我们知道部署到 EB 时会发生什么,从宏观上看。我们在 Visual Studio 中右键单击我们的 Web 应用程序,然后单击“发布到 Elastic Beanstalk”。输入一些数据后,单击最终的“发布”按钮,应用程序就会构建,打包成 zip 文件,并复制到我们集群中所有实例的c:\cfn\ebdata\source_bundle.zip。内容将被部署到每个实例中。

很好。现在服务器上已经有了应用程序。我的下一步——在该服务器集群上部署 1 到 n 个附加应用程序。我的原始做法是:手动远程桌面到每个实例,复制其他应用程序的内容,然后从该内容创建 IIS 应用程序和应用程序池。

因此,本文的目的就此而来。我不想对单个实例做任何事情。如果我的集群有 100 个实例怎么办?我希望我的构建服务器运行一个完成所有工作的命令文件,无需手动干预。使用 Amazon 工具“eb”,我们将自动化这些手动步骤:复制内容并运行一个命令文件来安装该内容。

步骤:安装 ebtools,包括安装 python、pip 和 ebcli

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-windows.html 描述了需要做什么。Eb tools是用 python 编写的,所以我们先安装 python,然后使用 pip 下载并安装该包。下载并运行 python 安装程序后,键入 python --version,然后键入 pip --version 来验证您是否已正确安装。然后键入 pip install --user --upgrade awsebcli

我个人不得不经历的一个小插曲:安装完所有这些之后,我无法运行 eb。事实证明我的路径变量没有得到更新,所以我运行了控制面板->系统->环境变量,并将 eb 所在的目录添加到%path%的末尾。

C:\>dir eb.* /s/b
C:\Users\username\AppData\Roaming\Python\Python36\Scripts\eb
C:\Users\username\AppData\Roaming\Python\Python36\Scripts\eb.exe
set path=%path%;C:\Users\username\AppData\Roaming\Python\Python36\Scripts\

现在我可以运行 eb 了,而且它能工作。

步骤:配置 aws。所有 aws 命令都取决于您的授权。我只能更新我拥有的 Amazon 站点。

C:\>aws configure
AWS Access Key ID [****************WR3W]:  I enter my big garbage string here
AWS Secret Access Key [****************96kh]: I enter my other big garbage string here
Default region name [us-east-2]:
Default output format []:

C:\>

如上所示,我交互式地输入了我的菜单选择。要实现真正的无人值守,可以按如下方式脚本化输入:

(echo big_garbage_string & echo big_garbage_string & 
echo us-east-2 &echo "" ) | "c:\Program Files\Amazon\AWSCLI\aws.exe" configure

步骤:配置 eb 工具。假设我是一名顾问,有 10 个不同的客户,每个客户在 Elastic Beanstalk 上托管 10 个不同的应用程序。因此,我必须通过运行 eb init 来告诉 eb 更新哪个应用程序。

C:\eb init

选择一个默认区域

  1. us-east-1 : 美国东部 (弗吉尼亚北部)
  2. us-west-1 : 美国西部 (加利福尼亚北部)
  3. us-west-2 : 美国西部 (俄勒冈)
  4. eu-west-1 : 欧洲 (爱尔兰)
  5. eu-central-1 : 欧洲 (法兰克福)
  6. ap-south-1 : 亚太地区 (孟买)
  7. ap-southeast-1 : 亚太地区 (新加坡)
  8. ap-southeast-2 : 亚太地区 (悉尼)
  9. ap-northeast-1 : 亚太地区 (东京)
  10. ap-northeast-2 : 亚太地区 (首尔)
  11. sa-east-1 : 南美洲 (圣保罗)
  12. cn-north-1 : 中国 (北京)
  13. us-east-2 : 美国东部 (俄亥俄)
  14. ca-central-1 : 加拿大 (中部)
  15. eu-west-2 : 欧洲 (伦敦)

(默认值为 3):1

选择一个要使用的应用程序

  1. Application_name_1
  2. Application_name_2
  3. Application_name_3
  4. [创建新应用程序]

(默认值为 4): 1

选择默认环境。
您可以稍后通过键入“eb use [environment_name]”来更改此设置。

  1. Integration-Test-A
  2. Applications-Dev

(默认值为 1): 2

现在我使用 eb 发出的任何命令都将引用托管在弗吉尼亚北部 Application_name_1 应用程序中的 Applications-Dev 环境。如上所示,我交互式地输入了我的菜单选择。要实现真正的无人值守,可以按如下方式脚本化输入。注意:如果菜单选择发生更改,例如向列表中添加了新应用程序,则您的数字值可能会发生变化。也许在未来版本中,解析实用程序将提取这些菜单选择。目前对我来说是有效的,并且明确期望在后续版本中改进。

C: \>(echo 1 & echo 1 & echo 2)|eb init

步骤:在我的 Web 项目中,我使用 TFS 进行源代码控制。不使用 git,我将 eb 配置为使用本地构件(zip 文件)。当我们完成 eb init 时,我们立即被告知以下信息。

无法设置 CodeCommit,因为没有设置源代码控制,继续初始化

所以我们键入以下命令

c:\>eb codesource local
Default set to use local sources

在 eb init 过程中,会创建一个隐藏目录“.elasticbeanstalk”,其中包含一个名为“config.yml”的文件。它包含我们所做的配置选择。我们需要修改此文件,追加 3 行。

deploy:
  artifact: initial_deploy.zip

我说了三行。在最后一行 [artifact: initial_deploy.zip] 之后,有一行只包含一个空格字符;请不要忘记这个重要的细节。
参考:https://medium.com/@obezuk/deploying-git-submodules-to-elastic-beanstalk-981670817029

步骤:指定 ebextensions

Amazon 的文档指出,您可以指定安装后命令。经过大量实验和与 Amazon 支持的合作,我发现:在您的项目目录中创建一个名为“.ebextensions”的目录,如下所示的解决方案资源管理器。它暗示它是隐藏的[通常,以 . 开头的目录是隐藏的;在这种情况下,您不需要隐藏目录]。

参考文献

我的文件bootstrap.config中的示例代码

container_commands:
  remove_hook:
    command:  powershell.exe -ExecutionPolicy Bypass -Command "C:\\cfn\\ebdata\\filename.ps1"
files:
  "C:\\cfn\\ebdata\\filename.ps1":
    content: |
      dir > C:\cfn\ebdata\filename.txt;

在我的应用程序安装完成后,上面块中指定的代码将执行。当然,您部署的应用程序中不会想要这个简单的示例。我在 bootstrap 配置中所做的是从 Amazon S3 检索一个大的 zip 文件,将其解压到我的目标目录,然后发出 IIS 命令来创建 Web 应用程序,并引用那些目标目录。

步骤:压缩您的可部署应用程序

del initial_deploy.zip
cd initial_deploy
powershell.exe -nologo -noprofile -command "& 
{ Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]
::CreateFromDirectory('.', '..\initial_deploy.zip'); }"
copy /y c:\temp\initial_deploy.zip c:\that_dir_we_did_that_eb_codesource_local

我在这里没有展示的是我如何将应用程序放入我的“initial_deploy”目录。另一个未来的增强功能。现在,我右键单击 Visual Studio 中的 Web 应用程序,单击“发布到 Elastic Beanstalk”,完成后,我复制 Amazon 在临时目录中创建的内容。随着时间的推移,我将使其在单个 msbuild 命令中工作。

步骤:部署压缩的应用程序

c:\>eb deploy Applications-Dev --staged --verbose

INFO: Deploying code to Applications-Dev in region us-east-1
INFO: Uploading archive to s3 location: AppName/app-170725_142636-stage-170725_142636.zip
Uploading: [##################################################] 100% Done...
INFO: Creating AppVersion app-170725_142636-stage-170725_142636
INFO: Environment update is starting.
INFO: Deploying new version to instance(s).
INFO: Waiting for current scaling activities to complete
INFO: Current scaling activities are complete
INFO: Instance 'i-0b99c77d19f9c1cfb' has been removed from your environment.
INFO: New instances found after commands have completed: i-0a962f04a2f1fc17f. 
      Re-running commands on these instances..
INFO: New application version was deployed to running EC2 instances.
INFO: Environment update completed successfully.

在此期间,转到您的 Elastic Beanstalk 控制台;您将看到您的应用程序状态从绿色变为灰色。随着安装的进行,并在您的应用程序集群中的所有 1 到 N 个实例上完成,状态将变回绿色。成功。

步骤:访问您的网站

步骤:上面我描述了每个步骤,并展示了我输入的内容。下一步是将上述所有步骤打包到一个名为deployer.cmddeployer.ps1的单个文件中。完成此操作后,我可以重复更新c:\temp\initial_deploy目录中的内容,并通过键入“deployer.cmd”来将其部署到我的 AWS 集群。

关注点

我期待将其发展为真正的 CI/CD,并报告我的结果。要描述脚本化的服务器安装,我将引用这句话:“牛群;而非宠物”。

历史

  • 2017/07/25:初版
© . All rights reserved.