Google cloud platform 从启动脚本访问GCP元数据

Google cloud platform 从启动脚本访问GCP元数据,google-cloud-platform,google-compute-engine,Google Cloud Platform,Google Compute Engine,我正在使用GoogleAppClient库从python代码启动GCP实例。现在,我将AWS凭据作为元数据传递给实例配置: 现在,我正在尝试从我的启动脚本访问此元数据,该脚本也作为元数据[key,value]对传递。在我的启动脚本中,我按如下方式访问元数据: getMetadata() { curl -fs http://metadata/computeMetadata/v1/instance/attributes/$1 \ -H "Metadata-Flavor: Google"

我正在使用
GoogleAppClient
库从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
文件中看到export语句,即使是空值。所以,我不知道发生了什么

为完整起见,以下是完整的启动脚本:

#!/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
但是没有乐趣。

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


如果要为所有用户设置此选项,请在askubuntu中使用
/etc/bash.bashrc
/etc/profile
,启动/重置Google VM实例时,启动脚本将以root用户身份运行

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

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

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


希望这对您有所帮助。

1)您有
curl
选项
-f
,这意味着无提示地失败。去掉那个。2) 重新启动并检查控制台日志。3) 在启动脚本中安装Stackdriver日志记录。4) 在那之后Stackdriver中会出现什么?整个启动过程都应该记录下来。@JohnHanley我根据你的建议做了一些编辑。你做了我没有建议的更改,忽略了我建议的更改。我查看了控制台日志,Slackdriver没有报告任何异常情况。还删除了thre
-f
选项,但没有出现任何问题。无论如何,感谢您迄今为止的帮助。您在启动脚本中的何处安装Stackdriver?如果您需要帮助,您的详细信息必须准确。我要求提供Stackdriver日志,但您甚至没有安装Stackdriver。第一步,从启动脚本中删除与您试图解决的问题无关的所有内容。不要告诉我们Stackdriver报告了什么,在您的问题中包括Stackdriver的输出。
echo 'export aws_access_key_id=$aws_access_key_id' >> /root/.bashrc