Configuration 对弹性beanstalk配置文件中的文件使用环境属性

Configuration 对弹性beanstalk配置文件中的文件使用环境属性,configuration,amazon-web-services,environment-variables,amazon-elastic-beanstalk,Configuration,Amazon Web Services,Environment Variables,Amazon Elastic Beanstalk,使用Elastic Beanstalk.config文件有点。。。有趣。我正在尝试将环境属性用于Elastc Beanstalk.config文件中的文件:配置选项。我想做的是: files: "/etc/passwd-s3fs" : mode: "000640" owner: root group: root content: | ${AWS_ACCESS_KEY_ID}:${AWS_SECRET_

使用Elastic Beanstalk
.config
文件有点。。。有趣。我正在尝试将环境属性用于Elastc Beanstalk
.config
文件中的
文件:
配置选项。我想做的是:

files:
    "/etc/passwd-s3fs" :
        mode: "000640"
        owner: root
        group: root
        content: |
            ${AWS_ACCESS_KEY_ID}:${AWS_SECRET_KEY}
ABAC73E92DEEWEDS3FG4E:aiDSuhr8eg4fHHGEMes44zdkIJD0wkmd
要创建内容如下的
/etc/passwd-s3fs
文件:

files:
    "/etc/passwd-s3fs" :
        mode: "000640"
        owner: root
        group: root
        content: |
            ${AWS_ACCESS_KEY_ID}:${AWS_SECRET_KEY}
ABAC73E92DEEWEDS3FG4E:aiDSuhr8eg4fHHGEMes44zdkIJD0wkmd
即,使用AWS控制台中定义的环境属性(
Elastic Beanstalk/Configuration/Software Configuration/environment properties
)初始化系统配置文件等

我发现可以在
container命令:
s中使用环境属性,如下所示:

container_commands:
    000-create-file:
        command: echo ${AWS_ACCESS_KEY_ID}:${AWS_SECRET_KEY} > /etc/passwd-s3fs
但是,这样做需要我手动设置所有者、组、文件权限等。与
文件:
配置选项相比,处理更大的配置文件更麻烦

有人知道这方面的提示吗?

我假设在部署应用程序之前,您已经知道
AWS\u ACCESS\u KEY\u ID
AWS\u SECRET\u KEY

您可以在工作站上创建该文件,并使用
$git aws.push上的代码将其提交给Elastic Beanstalk实例

$ cd .ebextensions
$ echo 'ABAC73E92DEEWEDS3FG4E:aiDSuhr8eg4fHHGEMes44zdkIJD0wkmd' > passwd-s3fs
在.config中:

files:
    "/etc/passwd-s3fs" :
        mode: "000640"
        owner: root
        group: root

container_commands:
    10-copy-passwords-file:
        command: "cat .ebextensions/passwd-s3fs > /etc/passwd-s3fs"
您可能需要使用权限,或者像
sudo
那样执行
cat
。此外,我将文件放入.ebextensions中,例如,它可以位于项目中的任何位置


希望有帮助。

像这样的东西怎么样。我将使用“上下文”一词来描述开发人员与qa

为每个上下文创建一个文件:

开发环境变量

export MYAPP_IP_ADDR=111.222.0.1
export MYAPP_BUCKET=dev
export MYAPP_IP_ADDR=111.222.1.1
export MYAPP_BUCKET=qa
qa环境变量

export MYAPP_IP_ADDR=111.222.0.1
export MYAPP_BUCKET=dev
export MYAPP_IP_ADDR=111.222.1.1
export MYAPP_BUCKET=qa
将这些文件上载到私有S3文件夹S3://myapp/config

在IAM中,向aws-elasticbeanstalk-ec2-role角色添加允许读取S3://myapp/config的策略

将以下文件添加到.ebextensions目录:

envvars.config

files:
  "/opt/myapp_envvars" :
    mode: "000644"
    owner: root
    group: root
    # change the source when you need a different context
    #source: https://s3-us-west-2.amazonaws.com/myapp/dev-envvars
    source: https://s3-us-west-2.amazonaws.com/myapp/qa-envvars

Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Access:
          type: S3
          roleName: aws-elasticbeanstalk-ec2-role
          buckets: myapp

commands:
  # commands executes after files per 
  # http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
  10-load-env-vars:
    command: . /opt/myapp_envvars
根据,命令“在设置应用程序和web服务器并提取应用程序版本文件之前运行”,以及在容器命令之前运行。我想问题是,在引导过程中,这是否足够早,以便在需要时使环境变量可用。实际上,我最后编写了一个init.d脚本来启动和停止EC2实例中的事情。我使用了上面的技术来部署脚本


允许从安全S3下载的“资源”部分归功于2014年5月7日发布的文章Joshua@AWS制作。

我正在掘墓人,但由于我在旅行过程中偶然发现了这一点,有一种“聪明”的方法可以做到你所描述的——至少在2018年,至少从2016年开始。您可以通过以下键检索环境变量:

同样,所有环境变量都具有(如JSON或
--output YAML

容器命令中的用法示例:

container_commands:
    00_store_env_var_in_file_and_chmod:
        command: "/opt/elasticbeanstalk/bin/get-config environment --key YOUR_ENV_KEY | install -D /dev/stdin /etc/somefile && chmod 640 /etc/somefile"
文件中的用法示例:

files:
    "/opt/elasticbeanstalk/hooks/appdeploy/post/00_do_stuff.sh":
      mode: "000755"
      owner: root
      group: root
      content: |
        #!/bin/bash
        YOUR_ENV_VAR=$(source /opt/elasticbeanstalk/bin/get-config environment --key YOUR_ENV_VAR_KEY)
        echo "Hello $YOUR_ENV_VAR"

托马斯·雷吉(Thomas Reggi)在年介绍我获取配置。

我喜欢你的思维方式!围绕Git创建更多的自动部署可能适用于许多用例。然而,
AWS\u-ACCESS\u-KEY\u-ID
AWS\u-SECRET\u-KEY
主要用作示例。我还想将其他变量传递给我的EC2实例配置脚本,比如S3存储桶的名称、IP地址等,我想在每个实例的基础上进行配置……只是想确定一下,当你说“instance”时,你是指“EC2 instance”还是指某个特定环境的实例,比如“dev”、“qa”等等?顺便说一句,你在原来的问题中没有提到“基于每个实例”的要求。对不起!我指的是一个特定环境的实例,如“dev”、“qa”等。我想在我之前的评论中,“environment”应该是一个更清晰的措辞选择。为了澄清,请从环境的软件配置中获取环境属性,并在Elastic Beanstalk
.config
文件的
内容:
声明中使用这些属性。因此,对于同一应用程序,您有多个环境。每个环境都有一组设置,您希望将这些设置放入配置文件中。相同的文件,但每个环境中的内容不同?您可以很好地总结出来。通过简单地使用属性值,可以很容易地使用这些环境属性来配置Java应用程序。但是,我想设置其他软件包,这些软件包是我在Elastic Beanstalk
.config
脚本中配置的,使用相同的简单、按环境、按方式(s3fs、FTP服务器等)。虽然这可以通过
容器\u命令实现:
,但是如果在
文件:
中有一种聪明的方法来实现这一点,那么当我们进行更高级的配置时,这将为我们的开发人员节省大量的工作……你有没有弄明白这一点?下面的答案很有帮助,但不确定它们是否回答了能够将环境变量用于文件副本的问题。从我所看到的情况来看,env变量仅可用于container_命令,不幸的是不能。下面的建议为解决方法提供了很好的选择,但这似乎仍然是EB.config文件的一个潜在改进领域……我最终使用了PowerShell脚本。在commands_容器中,我执行一个PS脚本,然后根据环境变量从S3下载文件。假设它可以处理S3以外的其他文件。截至2020年6月,Amazon Linux 2平台没有
get config
。以下是帮助我的解决方法: