【问题标题】:Using environment properties with files in elastic beanstalk config files将环境属性与弹性 beanstalk 配置文件中的文件一起使用
【发布时间】:2014-02-11 02:10:45
【问题描述】:

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

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:s 中可以使用环境属性,像这样:

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

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

有人对此有什么建议吗?

【问题讨论】:

  • 你有没有想过这个问题?下面的答案很有帮助,但不确定他们是否回答了能够将环境变量用于文件副本的问题。据我所知,环境变量仅适用于 container_commands,
  • 很遗憾没有。以下建议为解决方法提供了很好的选择,但这似乎仍然是 EB .config 文件的潜在改进领域...
  • 我最终使用了 PowerShell 脚本。在 commands_container 中,我执行一个 PS 脚本,然后根据环境变量从 S3 下载文件。假设它可以与 S3 以外的其他文件一起使用。

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


【解决方案1】:

这样的事情怎么样。我将使用“上下文”这个词来表示 dev 与 qa。

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

开发环境变量

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 的帖子。

【讨论】:

    【解决方案2】:

    我假设您在应用部署之前就知道 AWS_ACCESS_KEY_IDAWS_SECRET_KEY

    您可以在工作站上创建文件并将其提交到 Elastic Beanstalk 实例,代码位于$ git aws.push

    $ 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 中,例如,它可以位于项目中的任何位置。

    希望对你有帮助。

    【讨论】:

    • 我喜欢你的思维方式!围绕 Git 创建更多的自动部署可能适用于很多用例。但是AWS_ACCESS_KEY_IDAWS_SECRET_KEY 主要用作示例。我还想将其他变量传递给我的 EC2 实例配置脚本,例如 S3 存储桶的名称、IP 地址等,我想针对每个实例进行配置...
    • 为了确定一下,当您说“instance”时,您的意思是“ec2 instance”还是特定环境的实例,例如“dev”、“qa”等?顺便说一句,您在原始问题中没有提到“基于实例”的要求。
    • 对不起!我的意思是特定环境的实例,如“dev”、“qa”等。我想“环境”在我之前的评论中会是一个更清晰的措辞选择。澄清一下,从环境的软件配置中获取环境属性,并在 Elastic Beanstalk .config 文件的 files: 部分的 content: 声明中使用这些属性。
    • 所以你有多个环境用于同一个应用程序。每个环境都有一组设置,您希望将这些设置放入配置文件中。相同的文件,但每个环境的内容不同?
    • 你总结得很好。只需使用属性值,就可以很容易地使用这些环境属性来配置我的 Java 应用程序。但是,我想以同样简单的方式设置我在 Elastic Beanstalk .config 脚本中配置的其他软件包,按环境、方式(s3fs、FTP 服务器等)。当然,这可以通过container_commands: 实现,但如果在files: 中有一个聪明的方法可以做到这一点,那么当我们进行更高级的配置时,这将为我们的开发人员节省大量工作......
    【解决方案3】:

    我正在挖掘坟墓,但由于我在旅行过程中偶然发现了这一点,因此有一种“聪明”的方式来做你所描述的事情——至少在 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。

    【讨论】:

    • 截至 2020 年 6 月,Amazon Linux 2 平台没有get-config。在这里可以找到对我有帮助的解决方法:github.com/awsdocs/elastic-beanstalk-samples/issues/…
    • @penguinrob:不正确。我们在 Amazon Linux 2 环境中一直使用 get-config。见docs。问题是,您应该使用 .platform hooks 而不是 .ebextensions
    猜你喜欢
    • 2017-05-06
    • 2017-10-29
    • 2015-11-22
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2021-06-15
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多