【问题标题】:How to set an environment variable in Amazon EC2如何在 Amazon EC2 中设置环境变量
【发布时间】:2015-04-22 23:50:30
【问题描述】:

我在 AWS 控制台上为我的一个 EC2 实例创建了一个标签。

但是,当我查看服务器时,没有设置这样的环境变量。

弹性豆茎也是如此。 env 显示了我在控制台上创建的标签。

$ env
 [...]
 DB_PORT=5432

如何在 Amazon EC2 中设置环境变量?

【问题讨论】:

  • 标签是不是环境变量。标签是一种组织 AWS 资源的方式。例如,您可以将“project=abc”标签应用于 EC2 实例,以及属于同一项目的 S3 存储桶和 Lambda。

标签: amazon-web-services amazon-ec2 debian environment-variables


【解决方案1】:

您可以从元数据中检索此信息,然后运行您自己的设置环境命令。

您可以从元数据中获取 instance-id(详见此处:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-retrieval

curl http://169.254.169.254/latest/meta-data/instance-id

然后您可以使用预安装的 AWS CLI 调用 describe-tags(或将其安装在您的 AMI 上)

aws ec2 describe-tags --filters "Name=resource-id,Values=i-5f4e3d2a" "Name=Value,Values=DB_PORT"

然后就可以使用OS设置环境变量命令了

export DB_PORT=/what/you/got/from/the/previous/call

您可以在您的用户数据脚本中运行所有这些。详情见这里:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html

【讨论】:

  • 我建议为您的实例使用 IAM 角色 - 这将允许您在不指定凭证的情况下执行 API 调用。 Guy 给出的这个答案正是我们在生产中使用的。
  • 感谢您的回答。我创建了一个允许 ec2:DescribeTags 的 IAM 角色,但是当我执行 aws ec2 describe-tags 时,我得到了 A client error (UnauthorizedOperation) occurred when calling the DescribeTags operation: You are not authorized to perform this operation。我错过了什么?
  • 好的,我必须执行 rm -rf .awsaws configure(不输入任何 API 密钥)才能让 aws 从实例元数据中读取新凭据。
  • 您需要为 ec2 实例创建一个角色以允许它执行调用:docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
  • @Shih-MinLee 只为您的数据使用一个标签,并将其内容编码为 json 或类似格式。
【解决方案2】:

按照Guy 给出的说明,我编写了一个小shell 脚本。此脚本使用 AWS CLI 和 jq。它允许您将 AWS 实例和 AMI 标签作为 shell 环境变量导入。

我希望它可以帮助一些人。

https://github.com/12moons/ec2-tags-env

【讨论】:

【解决方案3】:

我使用了以下工具的组合:

  • 安装 jq 库 (sudo apt-get install -y jq)
  • 安装 EC2 实例元数据查询工具

下面是代码的要点,以防我将来更新它:https://gist.github.com/marcellodesales/a890b8ca240403187269

######
# Author: Marcello de Sales (marcello.desales@gmail.com)
# Description: Create Create Environment Variables in EC2 Hosts from EC2 Host Tags
# 
### Requirements:  
# * Install jq library (sudo apt-get install -y jq)
# * Install the EC2 Instance Metadata Query Tool (http://aws.amazon.com/code/1825)
#
### Installation:
# * Add the Policy EC2:DescribeTags to a User
# * aws configure
# * Souce it to the user's ~/.profile that has permissions
#### 
# REboot and verify the result of $(env).

# Loads the Tags from the current instance
getInstanceTags () {
  # http://aws.amazon.com/code/1825 EC2 Instance Metadata Query Tool
  INSTANCE_ID=$(./ec2-metadata | grep instance-id | awk '{print $2}')

  # Describe the tags of this instance
  aws ec2 describe-tags --region sa-east-1 --filters "Name=resource-id,Values=$INSTANCE_ID"
}

# Convert the tags to environment variables.
# Based on https://github.com/berpj/ec2-tags-env/pull/1
tags_to_env () {
    tags=$1

    for key in $(echo $tags | /usr/bin/jq -r ".[][].Key"); do
        value=$(echo $tags | /usr/bin/jq -r ".[][] | select(.Key==\"$key\") | .Value")
        key=$(echo $key | /usr/bin/tr '-' '_' | /usr/bin/tr '[:lower:]' '[:upper:]')
        echo "Exporting $key=$value"
        export $key="$value"
    done
}

# Execute the commands
instanceTags=$(getInstanceTags)
tags_to_env "$instanceTags"

【讨论】:

    【解决方案4】:

    最近,AWS Parameter Store 似乎是一个更好的解决方案。

    现在甚至还有一个秘密管理器,可以自动管理敏感配置,如数据库密钥等......

    使用基于 GuyPJ Bergeron 之前的解决方案的 SSM 参数存储查看此脚本。

    https://github.com/lezavala/ec2-ssm-env

    【讨论】:

    • 我看到该脚本是一个 bash 脚本。我假设我在 EC2 实例的 USER DATA 部分中调用了它 (sh import-params.sh -p /NAMESPACE/ENV/ -r us-west-1),但是我应该在哪里存储脚本以便在实例启动时可以访问它?
    • @chrisFrisina 我相信在 Linux 中,将脚本存储在 /usr/local/bin 目录中是一种常见的做法。您可以通过 cron @reboot 或 /etc/rc.local 在启动时运行命令我的偏好是通过 AWS Run Command 触发它,因为我可以定位/更新多个实例。
    【解决方案5】:

    如果您的 ec2 实例使用的是 linux 或 mac os,那么,

    进入你的根目录并写入命令:

    vim .bash_profile
    

    您可以看到您的 bash_profile 文件,现在按“i”插入一行,然后添加

    export DB_PORT="5432"
    

    添加此行后你需要保存文件,所以按'Esc'按钮然后按':',在冒号后写'w'它将保存文件而不退出。

    要退出,在写“退出”之后再次按“:”,现在您退出文件。要检查您的环境变量是否已设置,请编写以下命令:

    python
    >>>import os
    >>>os.environ.get('DB_PORT')
    >>>5432 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2012-12-21
      • 2021-04-26
      • 1970-01-01
      • 2018-11-03
      • 2023-03-16
      • 2019-07-02
      相关资源
      最近更新 更多