Elastic Beanstalk:环境创建持续时间与不可变部署

Posted

技术标签:

【中文标题】Elastic Beanstalk:环境创建持续时间与不可变部署【英文标题】:Elastic Beanstalk: duration of environment creation vs immutable deployment 【发布时间】:2019-03-22 03:15:05 【问题描述】:

在使用 AWS Elastic Beanstalk (EB) 上的环境时,我注意到 创建 一个新的单实例环境比 不可变部署 到同一环境(使用完全相同的应用程序版本)。

我说的是 3 分钟14 分钟,分别是在环境健康状况“正常”之前。

谁能解释一下?

可能我对环境与实例的概念是错误的,但我希望差异(如果有的话)是相反的。

这是工作流程的一个最小示例:

    使用 EB(Web)管理控制台,使用默认 Python/Amazon-Linux 和默认示例应用程序创建新的单实例环境。默认配置仅更改为在开始创建环境之前将部署策略设置为“不可变”而不是“一次性”。这大约需要。 3 分钟

    2018-10-17 12:14:17 UTC+0200    INFO    Environment health has transitioned from Pending to Ok. Initialization completed 33 seconds ago and took 3 minutes.
    2018-10-17 12:13:39 UTC+0200    INFO    Successfully launched environment: create-vs-deploy
    

    从“应用程序版本”页面选择示例应用程序(即与步骤 1 中使用的完全相同的应用程序版本),并将其部署(不可变)到步骤 1 中创建的环境。这大约需要 10 分钟。 14 分钟

    2018-10-17 12:36:16 UTC+0200    INFO    Environment health has transitioned from Info to Ok. Application update completed 67 seconds ago and took 14 minutes.
    

后续部署也是如此,自定义应用版本的结果也类似。

两个实例的eb-activity.log 文件具有相同的命令和输出,并且从开始到Application deployment - Command CMD-Startup succeeded 的持续时间也几乎相同:都超过1 分钟。

不可变部署的日志会在 6 分钟后开始显示一些额外的行:

[2018-10-17T10:22:10.227Z] INFO  [2269]  - [Initialization] : Starting activity...
...
[2018-10-17T10:23:21.610Z] INFO  [2620]  - [Application deployment Sample Application@2/AddonsAfter] : Completed activity.
[2018-10-17T10:23:21.610Z] INFO  [2620]  - [Application deployment Sample Application@2] : Completed activity. Result:
  Application deployment - Command CMD-Startup succeeded
[2018-10-17T10:29:58.110Z] INFO  [3055]  - [Re-associating instance] : Starting activity...
...
[2018-10-17T10:29:58.115Z] INFO  [3055]  - [Re-associating instance] : Completed activity. Result:
  Re-associating instance - Command CMD-ImmutableDeploymentFlip succeeded

知道在 6 分钟的暂停期间发生了什么吗? EB每次都要等待6分钟的健康检查吗?

此外,大约之间存在很大差异。 eb-activity.log 中从开始到结束的持续时间为 8 分钟,事件页面报告的持续时间为 14 分钟。

不确定它是否有帮助,但这是来自 healthd/daemon.log 的不可变部署:

# Logfile created on 2018-10-17 10:22:04 +0000 by logger.rb/47272
A, [2018-10-17T10:22:05.218449 #2186]   ANY -- : healthd daemon 1.0.3 initialized
W, [2018-10-17T10:22:05.369315 #2186]  WARN -- : log file "/var/log/httpd/healthd/application.log.2018-10-17-10" does not exist
...
W, [2018-10-17T10:23:16.646199 #2186]  WARN -- : log file "/var/log/httpd/healthd/application.log.2018-10-17-10" does not exist
W, [2018-10-17T10:36:55.231184 #2186]  WARN -- : discarding statistic item after validation error (Invalid timestamp): :id=>"0", :namespace=>"application", :timestamp=>1539771800, :data=>"\"duration\":10,\"latency_histogram\":[[0.213,1]],\"http_counters\":\"status_200\":1,\"request_count\":1"

新创建的 env 的日志除了最后一行之外看起来完全一样。

附加信息:

从下面的事件(在不同时间部署的同一应用程序)我假设新实例在应用程序更新开始后大约 12 分钟接管,之后旧实例被终止等。

2018-10-17 14:29:07 UTC+0200    INFO    Environment health has transitioned from Info to Ok. Application update completed 37 seconds ago and took 13 minutes.
2018-10-17 14:28:38 UTC+0200    INFO    Environment update completed successfully.
2018-10-17 14:28:38 UTC+0200    INFO    New application version was deployed to running EC2 instances.
2018-10-17 14:28:07 UTC+0200    INFO    Removed instance [i-0*******] from your environment.
2018-10-17 14:26:25 UTC+0200    INFO    Deployment succeeded. Terminating old instances and temporary Auto Scaling group.
2018-10-17 14:24:36 UTC+0200    INFO    Waiting for post-deployment configuration to complete.
2018-10-17 14:24:31 UTC+0200    INFO    Starting post-deployment configuration on new instances.
2018-10-17 14:23:31 UTC+0200    INFO    Attached new instance(s) to the permanent auto scaling group awseb-e-******-stack-AWSEBAutoScalingGroup*****.
2018-10-17 14:23:29 UTC+0200    INFO    Detached new instance(s) from temporary auto scaling group awseb-e-******-immutable-stack-AWSEBAutoScalingGroup*****.
2018-10-17 14:19:32 UTC+0200    INFO    Waiting for instance(s) (i-0******) to pass health checks.
2018-10-17 14:17:08 UTC+0200    INFO    Added instance [i-0******] to your environment.
2018-10-17 14:17:08 UTC+0200    INFO    Environment health has transitioned from Ok to Info. Application update in progress on 1 instance. 0 out of 1 instance completed (running for 2 minutes).
2018-10-17 14:15:19 UTC+0200    INFO    Created temporary auto scaling group awseb-e-*****-immutable-stack-AWSEBAutoScalingGroup-*******.
2018-10-17 14:14:33 UTC+0200    INFO    Immutable deployment policy enabled. Launching one instance with the new settings to verify health.
2018-10-17 14:14:24 UTC+0200    INFO    Environment update is starting.

【问题讨论】:

遇到类似问题,以前需要 20 秒的部署在设置为不可变时需要 12 分钟。 @BookOfGreg:不确定它是否会对您有所帮助,但您可以在下面找到我从 AWS 支持收到的答案。 【参考方案1】:

事实证明,与环境创建相比,不可变部署涉及的内容要多得多。以下是我从 AWS 支持 收到的部分回复,比以往任何时候都更清楚地解释了这些差异:

环境创建会发生什么

1) 发出新的环境创建命令

2) 创建 CloudFormation 堆栈以启动资源 与环境相关

3) 将作为 配置了 AutoScaling 组:这意味着要执行,因为 特殊情况,CMD-StartUp 也会执行所有的钩子 联系。此时环境已配置完毕。

不可变部署会发生什么

1) 创建了一个新的 CloudFormation 堆栈,因此当前堆栈不是 正在修改

2) 一个实例正在临时 AutoScaling 组中启动

3) 实例的配置方式与现有实例相同 在使用 CMD-StartUp 创建环境时

4) 实例一旦准备就绪,就会添加到环境的负载中 平衡器

5) 实例必须通过所有健康检查。如果环境是 “Web服务器”类型的,需要连续通过12次健康检查; 如果环境是“工人”类型,则需要通过 18 健康 检查。由于增强型健康检查每 10 次报告一次状态 秒,这意味着在最好的情况下,这将 花费 2 分钟 (10 x 12 = 120)。 (有关此 [1] 的更多信息)

6) “CMD-ImmutableDeploymentFlip”命令需要在 新的实例/实例,然后将调用 “infra-reregister-cfn-hup.rb”脚本并执行不同的操作

7) 部署后配置开始

8) 部署成功后,旧实例需要 终止

9) 部署完成。

【讨论】:

以上是关于Elastic Beanstalk:环境创建持续时间与不可变部署的主要内容,如果未能解决你的问题,请参考以下文章

创建新的 Elastic Beanstalk 工作程序环境时 RubyVersionMismatch

为 Rails 应用程序创建 AWS Elastic Beanstalk 环境时出错

Amazon Elastic Beanstalk 在创建新环境时创建服务器实例

使用 RDS 实例快照创建 Elastic Beanstalk 环境

Elastic Beanstalk CLI,如何使用 RDS 实例创建环境?

如何让两个 Elastic Beanstalk 环境共享一个数据库实例