【问题标题】:GCP metadata access from startup script从启动脚本访问 GCP 元数据
【发布时间】:2020-03-03 03:03:05
【问题描述】:

我正在使用 googleapiclient 库从我的 python 代码启动 GCP 实例。现在,我将 AWS 凭证作为元数据传递给实例配置:

现在,我正在尝试从我的启动脚本中访问此元数据,该脚本也作为元数据 [key, value] 对传递。在我的启动脚本中,我按如下方式访问元数据:

getMetadata() {
  curl -fs http://metadata/computeMetadata/v1/instance/attributes/$1 \
    -H "Metadata-Flavor: Google"
}

aws_access_key_id=`getMetadata aws_access_key_id`
aws_secret_access_key=`getMetadata aws_secret_access_key`

echo 'export aws_access_key_id = aws_access_key_id' >> ~/.bashrc
echo 'export aws_secret_access_key = $aws_secret_access_key' >> ~/.bashrc

由于某种原因,这似乎没有任何效果。奇怪的是,当我ssh 进入实例时,我可以看到元数据服务器有这些键值对,但我不确定为什么它们在启动脚本中没有被访问。

此外,我什至看不到我的.bashrc 文件中的导出语句,即使是空值。所以,不知道发生了什么。

为了完整起见,这里是完整的启动脚本:

#!/bin/bash

set -e

echo "Installing docker"
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-cache policy docker-ce
apt-get install -y docker-ce make

echo "Checking for CUDA and installing."
# Check for CUDA and try to install.
if ! dpkg-query -W cuda-10-0; then
  curl -O http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.243-1_amd64.deb
  wget -qO - https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub | sudo apt-key add -
  dpkg -i ./cuda-repo-ubuntu1804_10.1.243-1_amd64.deb
  apt-get update
  apt-get install cuda -y
fi

# Enable persistence mode
nvidia-smi -pm 1
nvidia-smi --auto-boost-default=DISABLED

echo "Installing nvidia docker"
# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list
apt-get update

apt-get update && apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

getMetadata() {
  curl -fs http://metadata/computeMetadata/v1/instance/attributes/$1 \
    -H "Metadata-Flavor: Google"
}

aws_access_key_id=`getMetadata aws_access_key_id`
aws_secret_access_key=`getMetadata aws_secret_access_key`

echo 'export aws_access_key_id = aws_access_key_id' >> ~/.bashrc
echo 'export aws_secret_access_key = $aws_secret_access_key' >> ~/.bashrc

另一件事是,到目前为止,其他一切都运行良好。控制台日志也没有显示任何错误。

编辑

所以我放了一些echo 语句并查看了控制台日志,似乎正确检索了密钥和密码,但是这些行:

echo 'export aws_access_key_id = $aws_access_key_id' >> ~/.bashrc

似乎没有任何作用。不确定文件是否被覆盖或其他原因,但我也尝试过:

echo 'export aws_access_key_id = $aws_access_key_id' >> $HOME/.bashrc

但没有快乐。

【问题讨论】:

  • 1) 你有 curl 选项 -f 这意味着静默失败。删除它。 2)重新启动并检查控制台日志。 3) 在您的启动脚本中安装 Stackdriver 日志记录。 4) 之后 Stackdriver 中会出现什么吗?然后应该记录整个启动过程。
  • @JohnHanley 我根据你的建议做了一些修改。
  • 您进行了我没有建议的更改并忽略了我建议的更改。
  • 我查看了控制台日志,Slackdriver 没有报告任何异常。还删除了-f 选项,但什么也没出现。无论如何,感谢您到目前为止的帮助。
  • 您在启动脚本的哪个位置安装 Stackdriver?如果您需要帮助,您的详细信息必须准确无误。我询问了 Stackdriver 日志,而您甚至没有安装 Stackdriver。第一步,从启动脚本中删除与您要解决的问题无关的所有内容。不要告诉我们 Stackdriver 报告的内容,请在您的问题中包含 Stackdriver 的输出。

标签: google-cloud-platform google-compute-engine


【解决方案1】:

当您启动/重置 Google VM 实例时,启动脚本以 root 用户身份运行。

我建议在启动脚本中使用完整路径。 所以,替换

echo 'export aws_access_key_id = $aws_access_key_id' >> ~/.bashrc

与

echo 'export aws_access_key_id=$aws_access_key_id' >> /root/.bashrc

另外,您需要在导出 UNIX 环境变量时删除 = 前后的空格。

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    波浪号 (~) 是用户主目录的简写,因为您使用的是启动脚本,但并未登录系统,因此 (~) 没有任何值。我会使用您要编辑的 ~/.bashrc 文件的完整路径。

    如果您想为所有用户设置此设置,请在 askubuntu 中使用 /etc/bash.bashrc 或 /etc/profile per this thread

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2013-02-13
      • 2018-02-13
      • 2021-01-01
      • 2021-11-04
      • 1970-01-01
      相关资源
      最近更新 更多