【问题标题】:Amazon Elastic Beanstalk - Change TimezoneAmazon Elastic Beanstalk - 更改时区
【发布时间】:2014-10-13 12:20:01
【问题描述】:

我正在通过 AWS Elastic Beanstalk 运行 EC2 实例。不幸的是,它的时区不正确 - 它比应有的时间早了 2 小时,因为时区设置为 UTC。我需要的是 GMT+1。

有没有办法设置 .ebextensions 配置,以强制 EC2 实例使用正确的时区?

【问题讨论】:

标签: amazon-web-services timezone amazon-elastic-beanstalk


【解决方案1】:

是的,你可以。

只需创建一个包含以下内容的文件 /.ebextensions/00-set-timezone.config

commands:
  set_time_zone:
    command: ln -f -s /usr/share/zoneinfo/Australia/Sydney /etc/localtime

这是假设您使用默认的 Amazon Linux AMI 映像。如果您使用其他 Linux 发行版,只需将命令更改为在该 Linux 中设置时区所需的任何内容。

【讨论】:

  • 您好,谢谢您,我只是想指出它不会更新 PHP 的时区,并且时区不是 Beanstalk 上 PHP 容器的 API 配置选项。所以使用 UTC 似乎仍然更容易。
  • 我对PhP不熟悉,所以我真的说不出来。但它适用于我在 Beanstalk 中的 Node.js 容器中。
  • 不要那样做。这也会影响 AWS Healthd 使用的一些日志文件,当您启用扩展监控时,这些文件会向 AWS Beanstalk Health 报告。当设置不同于 UTC 的时区时,扩展监控将不再起作用(P99、P90、P75、2xx、3xx 将不会显示在运行状况下)
  • 它对我们的 PHP 项目没有奏效。@JesúsDiaz 的回答成功了。
  • @xwk 你知道如何在基于 Windows Server 的系统中执行此操作吗?
【解决方案2】:

这是来自 aws Support Business 的回复,并且有效!

---- 原始消息----

如何将环境的时区或更确切地说将 Elastic Beasntalk 中的环境实例更改为 UTC/GMT -3 小时(阿根廷布宜诺斯艾利斯)? 我目前正在使用 Amazon Linux 2016.03。在此先感谢您的帮助。 问候。

--------- 响应 ----------

您好,感谢您联系 AWS 支持,将您的 Elastic Beanstalk 实例时区修改为使用 UTC/GMT -3 小时(阿根廷布宜诺斯艾利斯),请参阅以下有关如何执行此修改的步骤。

以下示例展示了如何使用 Amazon Linux OS 的 .ebextensions 修改 Elastic Beanstalk 环境的时区:

  1. 在应用程序的根目录中创建 .ebextensions 文件夹
  2. 创建一个 .config 文件,例如 00-set-timezone.config 文件,并以 yaml 格式添加以下内容。

    container_commands:
      01changePHP:
        command: sed -i '/PHP_DATE_TIMEZONE/ s/UTC/America\/Argentina\/Buenos_Aires/' /etc/php.d/environment.ini
      01achangePHP:
        command: sed -i '/aws.php_date_timezone/ s/UTC/America\/Argentina\/Buenos_Aires/' /etc/php.d/environment.ini
      02change_AWS_PHP:
        command: sed -i '/PHP_DATE_TIMEZONE/ s/UTC/America\/Argentina\/Buenos_Aires/' /etc/httpd/conf.d/aws_env.conf
      03php_ini_set:
        command: sed -i '/date.timezone/ s/UTC/America\/Argentina\/Buenos_Aires/' /etc/php.ini
    commands:
      01remove_local:
        command: "rm -rf /etc/localtime"
      02link_Buenos_Aires:
        command: "ln -s /usr/share/zoneinfo/America/Argentina/Buenos_Aires /etc/localtime"
      03restart_http:
        command: sudo service httpd restart
    
  3. 将应用程序部署到 Elastic Beanstalk,包括 .ebextensions,并且时区将按照上述更改。

希望对你有帮助

问候!

【讨论】:

  • 非常感谢分享这个!像魅力一样工作:)
【解决方案3】:

如果您在 eb 环境中运行 Windows... .

在项目的根目录中创建一个名为 .ebextensions 的文件夹。

在该文件夹中创建一个名为 timezone.config 的文件

在该文件中添加以下内容:

commands:
    set_time_zone:
        command: tzutil /s "Central Standard Time"

根据需要设置时区

screenshot

【讨论】:

  • 正确的时区名称是通过在 Windows 命令控制台中运行 tzutil /l 来完成的
【解决方案4】:

我正在使用 php.d 文件夹中的自定义 .ini 文件以及来自http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html#change_time_zone 的常规建议:

sed 命令仅插入(重写)/etc/sysconfig/clock 的第一行,因为根据上述 AWS 文档,第二行 (UTC=true) 应保留。

# .ebextensions/02-timezone.config
files:
  /etc/php.d/webapp.ini:
    mode: "000644"
    owner: root
    group: root
    content: |
      date.timezone="Europe/Amsterdam"

commands:
  01_set_ams_timezone:
    command:
      - sed -i '1 s/UTC/Europe\/Amsterdam/g' /etc/sysconfig/clock
      - ln -sf /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime

【讨论】:

    【解决方案5】:

    使用 Elastic Beanstalk 更改 EC2 的时区很简单:

    1. 在根目录下创建.ebextensions 文件夹
    2. 添加文件名以 .config 结尾的文件 (timezone.config)

    文件内部

    container_commands:
      time_zone:
        command: ln -f -s /usr/share/zoneinfo/America/Argentina/Buenos_Aires /etc/localtime
    

    那么你就完成了。 请注意,container_commandscommands 不同,从它声明的文档来看:

    commands 在设置应用程序和 Web 服务器之前运行 应用程序版本文件被提取。

    那是你的时区命令不起作用的原因,因为服务器还没有启动。

    container_commands 在应用程序和 Web 服务器都已完成后运行 设置并提取应用程序版本文件,但之前 应用程序版本已部署。

    【讨论】:

      【解决方案6】:

      如果您正在运行 java/Tomcat 容器,只需将 JVM 选项放在配置中即可。

      -Duser.timezone=America/Sao_Paulo

      可能的值:timezones

      【讨论】:

        【解决方案7】:

        这些解决方法仅修复应用程序的时区。但是,当您有任何系统服务(例如 cron 运行)时,它会查看 /etc/sysconfig/clock 并且始终是 UTC。如果您跟踪 cron 日志或 aws-sqsd 日志,您会注意到时间戳仍然落后 2 小时 - 在我的情况下。对时钟设置的更改需要重新启动才能生效 - 如果您有自动缩放功能或者您想使用 ebextensions 更改系统时钟的配置,则不应该考虑这个选项。

        亚马逊已经意识到这个问题,我认为他们还没有解决它。

        【讨论】:

          【解决方案8】:

          如果您的 EB 应用程序正在使用 Java/Tomcat 容器,您可以将 JVM 时区选项添加到 Procfile configuration。示例:

          web: java -Duser.timezone=Europe/Berlin -jar application.jar
          

          确保在 -jar 选项之前添加所有配置选项,否则将被忽略。

          【讨论】:

            【解决方案9】:

            迁移到 AWS Linux 2 具有挑战性。我花了一段时间才弄清楚如何在 .ebextensions 中轻松做到这一点。

            我在another stackoverflow question 中编写了简单的解决方案.. 但对于任何需要即时满足的人.. 将以下命令添加到文件 .ebextensions/xxyyzz.config 中:

            container_commands:
              01_set_bne:
                command: "sudo timedatectl set-timezone Australia/Brisbane"
                command: "sudo systemctl restart crond.service"
            

            【讨论】:

              【解决方案10】:

              通过puttyssh连接AMI(amazon linux instance)并执行以下命令;

              sudo rm /etc/localtime
              sudo ln -sf /usr/share/zoneinfo/Europe/Istanbul /etc/localtime
              sudo reboot
              

              上面过程的解释很简单;

              1. 删除本地时间,
              2. 更新时区,
              3. 重启

              请通知我已将我的时区更改为土耳其当地时间,您可以通过以下命令列出 zoneinfo 目录来找到您的时区;

              ls /usr/share/zoneinfo
              

              或者只是通过维基百科查看时区缩写;

              http://en.wikipedia.org/wiki/Category:Tz_database

              您也可以查看相关的亚马逊AWS文档;

              http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html

              注意:我不确定这是否是最佳做法(可能不是),但是我已经应用了上面编写的程序并且它对我有用。

              【讨论】:

              • 以这种方式解决问题的问题在于 AWS Elastic Beanstalk 旨在根据您定义的阈值处理负载平衡和 Auto Scaling。一次更新单个实例只能暂时解决问题,因为 Auto Scaling 会根据需要构建和销毁新实例。
              猜你喜欢
              • 2018-10-13
              • 2020-11-27
              • 2014-12-15
              • 1970-01-01
              • 2014-11-15
              • 2013-12-05
              • 2013-06-12
              • 2015-02-23
              相关资源
              最近更新 更多