如何通过用户数据在EC2实例上设置环境变量

Gle*_*eeb 14 linux bash amazon-ec2 amazon-web-services

我试图用EC2s用户数据设置环境变量,但我没做什么似乎工作

这是我试过的用户数据脚本

#!/bin/bash
echo "export HOST_URL=checkEmai-LoadBala-ICHJ82KG5C7P-23235232.us-east-1.elb.amazonaws.com" >> /env.sh 
source /env.sh
Run Code Online (Sandbox Code Playgroud)

而另一个:

#!/bin/bash
echo "#!/bin/bash" >> /env.sh
echo "export HOST_URL=checkEmai-LoadBala-ICHJ82KG5C7P-67323523.us-east-1.elb.amazonaws.com" >> /env.sh 
chmod +x /env.sh
/env.sh
Run Code Online (Sandbox Code Playgroud)

他们都绝对没有,如果我登录并发出命令source /env.sh/env.sh它的工作原理.所以这一定是我要做的事情是禁止的.

这是/var/log/cloud-init-output.log使用-e -x 的输出

+ echo 'export HOST_URL=checkEmai-LoadBala-ICHJ82KG5C7P-2141709021.us-east-1.elb.amazonaws.com'
+ source /env.sh
++ export HOST_URL=checkEmai-LoadBala-ICHJ82KG5C7P-2141709022.us-east-1.elb.amazonaws.com
++ HOST_URL=checkEmai-LoadBala-ICHJ82KG5C7P-2141709022.us-east-1.elb.amazonaws.com
Run Code Online (Sandbox Code Playgroud)

仍然echo $HOST_URL是空的

根据要求,完整的UserData脚本

#!/bin/bash
set -e -x 
echo "export HOST_URL=checkEmai-LoadBala-ICHJ82KG5C7P-2141709021.us-east-1.elb.amazonaws.com" >> /env.sh 
source /env.sh
/startup.sh staging 2649
Run Code Online (Sandbox Code Playgroud)

Zif*_*ion 10

EC2上的用户数据脚本在启动后在其自己的进程中执行.环境变量在该进程中设置,并在进程退出时消失.您将不会在其他进程中看到环境变量,即登录shell或其他程序.

您将不得不设计一种方法将这些环境变量放入需要查看它们的程序中.

你在哪里需要这些变量?在"/startup.sh staging 2649"中?

编辑

试试这个:

#!/bin/bash
set -e -x 
export HOST_URL="checkEmai-LoadBala-ICHJ82KG5C7P-2141709021.us-east-1.elb.amazonaws.com"
/startup.sh staging 2649
Run Code Online (Sandbox Code Playgroud)

然后编辑"/startup.sh",并将以下行放在顶部:

echo $HOST_URL > /tmp/var
Run Code Online (Sandbox Code Playgroud)

引导实例,然后在此处粘贴/ tmp/var.


Ash*_*han 10

为EC2实例定义环境变量的一种更可配置的方法是使用EC2参数存储.这种方法可以更轻松地管理大量EC2实例的不同参数,这些参数都使用AWS KMS和纯文本加密.它还允许在EC2实例级别的最小变化时更改参数值.步骤如下.

  • EC2 Systems Manager参数存储中定义字符串参数(使用KMS加密或未加密).
  • 在EC2假定的IAM角色中,提供访问参数存储所需的权限.
  • 使用适用于EC2 System Manager的AWS CLI命令,使用Get-ParameterGet-Parameters AWS CLI命令读取参数并导出到"用户数据"部分中的环境变量,并根据需要控制命令输出.

例如,使用Get-Parameter命令检索db_connection_string参数(未加密).

export DB_CONNECTION =$(aws?--region=us-east-2 ssm get-parameter?--name "db_connection" --query 'Value')
Run Code Online (Sandbox Code Playgroud)

注意:有关设置AWS KMS密钥,定义加密字符串,管理IAM策略等的更多详细信息,请参阅以下文章.


ham*_*x0r 7

我发现这是使用用户数据为所有用户设置环境变量的一种非常简单的方法.它允许我配置应用程序,以便相同的AMI可以使用多个场景:

#!/bin/bash
echo export DB_CONNECTION="some DB connection" >> /etc/profile
echo export DB_USERNAME="my user" >> /etc/profile
echo export DB_PASSWORD="my password" >> /etc/profile
Run Code Online (Sandbox Code Playgroud)

现在,所有用户都将DB_CONNECTION,DB_USERNAME和DB_PASSWORD设置为环境变量.

  • @DiegoSomar echo 不适用于 sudo。使用 tee 代替: `echo export DB_CONNECTION="some DB connection" | sudo tee -a /etc/profile` (4认同)
  • 对我不起作用。我收到错误消息:`-bash:/ etc / profile:权限被拒绝`。PS:我也尝试sudo。 (2认同)
  • 好方法...我发现在引号中回显的内容的更清晰的语法效果非常好。`echo "export GOROOT=/usr/local/go" >> /etc/profile` (2认同)

小智 6

您可以添加另一个 shell 脚本,/etc/profile.d/yourscript.sh其中将包含您要添加的一组环境变量。

此脚本将在每次启动时运行,您的变量将可供所有用户使用。

#!/bin/sh
echo 'export AWS_DEFAULT_REGION=ap-southeast-2' > ~/myconfiguration.sh
chmod +x ~/myconfiguration.sh
sudo cp ~/myconfiguration.sh /etc/profile.d/myconfiguration.sh
Run Code Online (Sandbox Code Playgroud)

上面的代码创建了一个 shell 脚本来为 aws 默认区域设置环境变量并将其复制到profile.d.