您可以在AWS弹性beanstalk中将环境variables重新映射/复制/别名为新的吗?

现在我的数据库variables被定义为RDS_* ,但我想重新映射到我的应用程序的约定。

这将有助于避免在我的项目中写入AWS特有的检测,这显然是可取的。

有几个不同的select,每个都有自己的陷阱:

1.将环境variables添加到EBconfiguration

当您的环境内部导航到configuration,然后导航到软件configuration部分。 在那里你会看到一个环境variables的列表,在底部你可以列出你自己的自定义variables。 这样做的缺点是现在有办法dynamic地映射来自AWS环境variables的值。 如果AWS中的值发生更改,则需要手动更新您的值。 这在您升级/降级数据库的情况下最有可能发生。 因此,您需要将数据库的主机更新到新的RDS端点。 (注意:这是基于可用于PHP环境的选项,我已经看到其他语言的变体,但可能是旧的文档。)

2.添加一个post部署脚本

这对于beanstalk来说有点痛苦,但是可以运行post部署脚本。 我不会详细介绍,但是基本上你需要将本文描述的post部署脚本添加到默认的beanstalk ami中。 然后,您将需要将实例复制为新的ami,并将其切换到您的beanstalk实例中以默认使用它。 在post部署脚本中,您可以将映射添加到您的环境variables中。

3.将映射添加到您的代码

我意识到你不想这样做,但我认为这将是你最头痛的问题。 我在PHP中包含了一个非常简单的例子。 如果您使用PHP从不同的来源获取并可以独立更改,请小心交换$ _ENV和getenv()/ putenv()/ $ _ SERVER。

 <?php if(getenv('RDS_VAR')) { putenv('NEW_VAR', getenv('RDS_VAR')) } ?> 

最后的想法

在将应用程序部署到Beanstalk时,我使用了1和3的组合,因为它在处理dynamic环境variables时提供了最大的灵活性。 我首先将值映射到我的应用程序configuration(如#3所述),然后如果我想规划可能交换RDS端点,密码或用户名,我可以添加#1中提到的环境variables,并将覆盖覆盖到我的AWS env映射。 这使我可以与AWS环境variables保持同步,但是如果需要换出数据库进行备份,还可以在软件configuration中手动覆盖它们。