google-cloud-platform - 从启动脚本访问 GCP 元数据
问题描述
我正在使用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
但没有快乐。
解决方案
当您启动/重置 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 环境变量之前和之后删除空格。
希望这对您有所帮助。
推荐阅读
- sql - 过去 10 周在 SQL Server 中
- java - 执行 linux echo 命令时,StringBuilder 输出为空
- javascript - 什么触发 webRTC API 连接到 stun 服务器
- javascript - Jquery Ajax post 方法出现 404 错误,GET 工作正常(文件存在)。服务器文件存在于节点服务器中
- git - git 没有正确合并分支
- php - Eloquent 5.4,hasOneThrough 方法?
- php - 从文件路径获取目录名之后的所有内容
- java - 让 Java IO Socket 像 ServerSocket 一样监听
- html - 如何将 div 与导航栏对齐?
- javascript - 只需要设置验证树中的子节点可以添加6个级别