将环境属性与弹性beanstalk配置文件中的文件一起使用

时间:2014-01-21 12:59:15

标签: configuration amazon-web-services environment-variables elastic-beanstalk

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

files:
    "/etc/passwd-s3fs" :
        mode: "000640"
        owner: root
        group: root
        content: |
            ${AWS_ACCESS_KEY_ID}:${AWS_SECRET_KEY}

创建包含以下内容的/etc/passwd-s3fs文件:

ABAC73E92DEEWEDS3FG4E:aiDSuhr8eg4fHHGEMes44zdkIJD0wkmd

即。使用AWS控制台(Elastic Beanstalk/Configuration/Software Configuration/Environment Properties)中定义的环境属性来初始化系统配置文件等。

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

container_commands:
    000-create-file:
        command: echo ${AWS_ACCESS_KEY_ID}:${AWS_SECRET_KEY} > /etc/passwd-s3fs

但是,这样做需要我手动设置所有者,组,文件权限等。处理比Files:配置选项更大的配置文件时,这也更麻烦...

有人对此有任何提示吗?

3 个答案:

答案 0 :(得分:3)

这样的事情怎么样?我将使用“上下文”一词来表示开发与qa。

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

<强> DEV-envvars中

export MYAPP_IP_ADDR=111.222.0.1
export MYAPP_BUCKET=dev

<强> QA-envvars中

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

根据AWS Developer's Guide,命令“在设置应用程序和Web服务器之前运行并提取应用程序版本文件”,以及容器命令之前。我想问题是,在启动过程中是否足够早,以便在需要时使环境变量可用。我实际上编写了一个init.d脚本来启动和停止我的EC2实例中的事情。我使用上面的技术来部署脚本。

允许从安全S3下载的“资源”部分的信用到2014年5月7日Joshua @ AWS发布到this thread的帖子。

答案 1 :(得分:2)

我认为在部署应用之前您已知道AWS_ACCESS_KEY_IDAWS_SECRET_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"

您可能必须使用权限或执行cat作为sudo。另外,我将文件放入.ebextensions例如,它可以在项目的任何位置。

希望它有所帮助。

答案 2 :(得分:1)

我很沮丧,但是因为我在旅途中偶然发现了这一点,所以有一个聪明的&#34;至少在2018年,至少从2016年起的方式做你所描述的 - 。您可以使用get-config按键检索环境变量:

/opt/elasticbeanstalk/bin/get-config environment --key YOUR_ENV_VAR_KEY

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

/opt/elasticbeanstalk/bin/get-config environment

容器命令中的示例用法:

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在https://serverfault.com/a/771067中介绍了get-config。