繁体   English   中英

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

[英]How to set Environment Variables on EC2 instance via User Data

我正在尝试使用 EC2s 用户数据设置环境变量,但我所做的一切似乎都不起作用

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

#!/bin/bash echo "export HOST_URL=checkEmai-LoadBala-ICHJ82KG5C7P-23235232.us-east-1.elb.amazonaws.com" >> /env.sh source /env.sh

还有一个:

 #!/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

他们都没有做任何事情,如果我登录并发出命令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

尽管如此, 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

为 EC2 实例定义环境变量的一种更可配置的方法是使用Systems Manager Parameter Store 这种方法将使管理大量 EC2 实例的不同参数变得更加容易,这些实例都使用AWS KMS以及纯文本加密。 它还允许通过对 EC2 实例级别的最小更改来更改参数值。 步骤如下。

  • EC2 Systems Manager Parameter Store 中定义字符串参数(使用 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')

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

我发现这是为使用用户数据的所有用户设置环境变量的一种非常简单的方法。 它允许我配置应用程序,以便同一个 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

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

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

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

echo $HOST_URL > /tmp/var

启动实例,然后在此处粘贴/tmp/var

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

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

#!/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

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

您可以使用此脚本:

#!/bin/bash
echo HOST_URL=\"checkEmai-LoadBala-ICHJ82KG5C7P-23235232.us-east-1.elb.amazonaws.com\" >> /etc/environment

我使用 Amazon Linux AMI 2018.03.0 创建了一个 EC2 实例,并将此用户数据添加到其中,它工作正常。

有关更多详细信息,请参阅此答案

完成用户数据脚本中的内容后,进程退出。 因此,您导出的任何环境变量都不会出现在下一个过程中。 一种方法是将导出放在 .bashrc 文件中,以便它在下一个会话中也可用。

    echo "export HOST_URL=checkEmai-LoadBala-ICHJ82KG5C7P-23235232.us-east-1.elb.amazonaws.com" >> ~/.bashrc

这可能不是对 OP 问题的确切答案,但类似。 我已经想过分享这个,因为我浪费了足够的时间来寻找答案并最终弄明白了。

假设示例 - AWS EC2 运行ubuntu

如果您需要定义环境变量并在同一个 bash 会话(相同的用户数据进程)中使用它,那么您可以将变量添加到/etc/profile/etc/environment/home/ubuntu/.zshrc文件。 我还没有尝试过/home/ubuntu/.profile文件顺便说一句。

假设添加到.zshrc文件,

sudo su ubuntu -c "$(cat << EOF 
    echo 'export PATH="/tmp:\$PATH"' >> /home/ubuntu/.zshrc
    echo 'export ABC="XYZ"' >> /home/ubuntu/.zshrc
    echo 'export PY_VERSION=3.8.1' >> /home/ubuntu/.zshrc
    source /home/ubuntu/.zshrc
    echo printenv > /tmp/envvars  # To test
EOF
)"

用户数据运行完成后,您可以看到在脚本中添加的环境变量已回显到envvars文件中。 使用source /home/ubuntu/.zshrc重新加载 bash 使新添加的变量在 bash 会话中可用。

(附加信息)如何安装zshoh-my-zsh

sudo apt-get install -y zsh
sudo su ubuntu -c "$(cat << EOF 
    ssh-keyscan -H github.com >> /home/ubuntu/.ssh/known_hosts
    git clone https://github.com/robbyrussell/oh-my-zsh.git /home/ubuntu/.oh-my-zsh
    cp /home/ubuntu/.oh-my-zsh/templates/zshrc.zsh-template /home/ubuntu/.zshrc
    echo DISABLE_AUTO_UPDATE="true" >> /home/ubuntu/.zshrc
    cp /home/ubuntu/.oh-my-zsh/themes/robbyrussell.zsh-theme /home/ubuntu/.oh-my-zsh/custom
EOF
)"
sudo chsh -s /bin/zsh ubuntu

想知道为什么我没有在.bashrc中添加环境变量? 我上面提到的场景(在同一用户数据会话中使用环境变量)添加到.bashrc将不起作用。 .bashrc仅用于交互式 Bash shell,因此不需要 .bashrc 检查它是否在交互式 shell 中运行。 所以就像上面一样,

source /home/ubuntu/.bashrc

不会重新加载 bash。 您可以在.bashrc文件的开头查看此内容,

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

这篇 Medium.com 文章中,您可以在UserData中放置一个脚本,该脚本写入/etc/profile.d中的一个文件,该文件将在运行新 shell 时自动运行。

这是一个示例cloudformation.yaml

Parameters:
  SomeOtherResourceData:
    default: Fn::ImportValue: !Sub "SomeExportName"
Resources:
  WebApi:
    Type: AWS::EC2::Instance
    Properties:
      # ...
      UserData:
        Fn::Base64: !Sub
          - |
            #!/bin/bash

            cat > /etc/profile.d/load_env.sh << 'EOF'

            export ACCOUNT_ID=${AWS::AccountId}
            export REGION=${AWS::Region}
            export SOME_OTHER_RESOURCE_DATA=${SomeOtherResourceData}

            EOF
            chmod a+x /etc/profile.d/load_env.sh

还有一个导出东西的 YAML

# ...
Outputs:
  SomeExportName:
    Value: !Sub "${WebDb.Endpoint.Address}"
    Export:
      Name: SomeExportName

将此添加到节点的初始化脚本将在启动时添加环境变量。 它们不会出现在节点配置页面中,但它们将能够用于任何工作。

#!/bin/bash
echo 'JAVA_HOME="/usr/lib/jvm/java-8-oracle/"' | sudo tee -a /etc/profile#

这个答案与 hamx0r 提出的类似,但是 jenkins 无权在有或没有 sudo 的情况下回显到/etc/profiles

这对我有用

   UserData:
    Fn::Base64:
      !Sub |
        #!/bin/bash
        echo "TEST=THISISTEST" >> /etc/environment

最简单的方法肯定是使用 AWS Elastic Beanstalk,它可以轻松地为您创建所需的一切,并且在整个 AWS 生态系统中拥有最简单的方法来设置您的环境变量。

看看吧,还有一些基于不同语言的详尽教程https://docs.aws.amazon.com/elastic-beanstalk/index.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM