配置 LogStreaming 时 ElasticBeanstalk 执行过期

Posted

技术标签:

【中文标题】配置 LogStreaming 时 ElasticBeanstalk 执行过期【英文标题】:ElasticBeanstalk Execution Expired When Configuring LogStreaming 【发布时间】:2020-02-19 21:52:55 【问题描述】:

我遇到了一个以前从未遇到过的错误。我有一个多区域堆栈集,可在两个区域(us-east-1 和 eu-west-1)中构建 ElasticBeanstalk 应用程序。除了子网等 VPC 特定配置外,其他配置完全相同。

重建两个 eb 环境后,我的 us-east-1 环境无法成功部署。

日志显示其中一个挂钩未完成。那个钩子是-

/opt/elasticbeanstalk/addons/logstreaming/hooks/config/10-config.sh

钩子的内容看起来像-

#!/bin/bash -e
#==============================================================================
# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Amazon Software License (the "License"). You may not use
# this file except in compliance with the License. A copy of the License is
# located at
#
#       http://aws.amazon.com/asl/
#
# or in the "license" file accompanying this file. This file is distributed on
# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or
# implied. See the License for the specific language governing permissions
# and limitations under the License.
#==============================================================================

source /opt/elasticbeanstalk/lib/ruby/profile.sh

BASEDIR=$(dirname $0)
ruby $BASEDIR/../logstreaming_config.rb

除了在 profile.sh 中设置一些常见的 ruby​​ 环境变量,然后调用 logstreaming_config.rb 之外,这里并没有发生太多事情。在那个文件之后,内容是-

#!/opt/elasticbeanstalk/lib/ruby/bin/ruby

#==============================================================================
# Copyright 2014 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Amazon Software License (the "License"). You may not use
# this file except in compliance with the License. A copy of the License is
# located at
#
#       https://aws.amazon.com/asl/
#
# or in the "license" file accompanying this file. This file is distributed on
# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or
# implied. See the License for the specific language governing permissions
# and limitations under the License.
#==============================================================================
require 'elasticbeanstalk/log-streaming-config-manager'

if __FILE__ == $0
  begin
    log_streaming_config_manager = ElasticBeanstalk::LogStreamingConfigManager.new
    log_streaming_config_manager.config_cwl_agent
  rescue Exception => ex
    puts ex.message
    exit(1)
  end
end

这里令人不安的是调用config_cwl_agent 的那一行。可以在 aws 框上的 /opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.2.0/gems/beanstalk-core-2.12/lib/elasticbeanstalk/log-streaming-config-manager.rb 找到此代码。文件比较大,这里就不加了。

在整个过程中添加日志记录,我将其缩小到-

cloudwatch_logs.create_log_stream(
  log_group_name: "#log_group_name",
  log_stream_name: "#instance_id"
)

我还没有钻得更深。它在某个时候设法自己创建了日志流,但从那以后它就再也没有越过这条线。抛出的唯一异常是读取-

执行已过期

大约 60 秒后。

我可以尝试使用新的 log_group_name 重建环境,看看是否已解决。幸运的是,这只发生在开发环境中,所以如果我在生产环境中看到这种情况,很高兴知道如何在当前状态下解决这个问题。在多个区域使用全新的 eb 环境构建新的堆栈集需要大量时间。

【问题讨论】:

【参考方案1】:

我们发现问题出在 VPC 终端节点和私有 DNS 的使用上。我们在区域内日志端点上禁用了私有 DNS 并解决了该问题。

【讨论】:

以上是关于配置 LogStreaming 时 ElasticBeanstalk 执行过期的主要内容,如果未能解决你的问题,请参考以下文章

将仅在启动时运行一次的 Elastic Beanstalk 配置命令放在哪里?

Elastic Beanstalk 滚动环境配置更新

Elastic Beanstalk 中的 Apache 配置语法失败

Django AWS Elastic Beanstalk 错误配置不当:加载 MySQLdb 模块时出错:没有名为 MySQLdb 的模块

将环境变量添加到 NodeJS Elastic Beanstalk 时出错

发布请求的 Elastic Beanstalk CORS 配置