检测VM中的云类型



在解决方案中,我们计划将多个云(AWS、Azure和GCP(作为一个解决方案。相同的代码将部署在不同云中运行的多个虚拟机中。

在许多情况下,我们需要检测云并相应地编写代码。例如,在AWS上运行时使用AWS S3 SDK,在Azure上运行时则使用Azure Blob SDK。

在AWS中,我们可以点击元数据URL来检测(http://169.254.169.254/latest/meta-data/(是否为AWS。

我想知道是否有任何方法可以检测VM内的云提供商(比如通过环境变量或元数据URL或任何其他方式(。

首选代码可以是python或shell脚本。

加上CSharpRocks和Dany L的答案:

Azure:

http://169.254.169.254/metadata/instance?api-版本=2021-02-01

谷歌

http://metadata.google.internal/computeMetadata/v1带标题:Metadata-Flavor: Google

URL解析为:http://169.254.169.254/

亚马逊

http://169.254.169.254/latest/meta-data/

文档

  • 不要为这些请求使用代理服务器
  • https://learn.microsoft.com/en-us/azure/virtual-machines/linux/instance-metadata-service?tabs=windows
  • https://cloud.google.com/compute/docs/metadata/overview
  • https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

我们可以考虑多种方法来识别依赖实例元数据的当前云

  1. 云初始化
  2. 元数据基URL
  3. 元数据特定项
  4. 自定义标记/元数据

云初始化

#! /bin/bash
# cloud-name, cloud_name, cloud_id, platform
cloud=$(cloud-init query cloud-name)
case ${cloud} in
aws)   echo "AWS Cloud"     ;;
azure) echo "Azure Cloud"   ;;
gce)   echo "GCP Cloud"     ;;
*)     echo "Unknown Cloud" ;;
esac

元数据基础URL

#! /bin/bash
# set -x -e
# AWS Cloud
token=$(curl -X PUT -s -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" http://169.254.169.254/latest/api/token)
status=$(curl -s -o /dev/null -w "%{http_code}" -H "X-aws-ec2-metadata-token: ${token}" http://169.254.169.254/latest/meta-data/)
[[ "${status}" -eq 200 ]] && cloud="aws"
# Azure Cloud
status=$(curl -s -o /dev/null -w "%{http_code}" -H "Metadata: true" --noproxy "*" "http://169.254.169.254/metadata?api-version=2021-02-01&format=text")
[[ "${status}" -eq 200 ]] && cloud="azure"
# GCP Cloud
status=$(curl -s -o /dev/null -w "%{http_code}" -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/ || true)
[[ "${status}" -eq 200 ]] && cloud="gcp"
echo $cloud

自定义标签/元数据

对于这个例子,我们应该在AWS上设置TagCloud=aws,在Azure上设置Cloud=azure,在创建实例时为GCP设置元数据Cloud=gcp

#! /bin/bash
# set -x -e
# AWS Cloud
token=$(curl -X PUT -s -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" http://169.254.169.254/latest/api/token)
get_cloud=$(curl -s -H "X-aws-ec2-metadata-token: ${token}" http://169.254.169.254/latest/meta-data/tags/instance/Cloud)
[[ "${get_cloud}" == "aws" ]] && cloud="aws"
# Azure Cloud
get_cloud=$(curl -s -H "Metadata: true" --noproxy "*" "http://169.254.169.254/metadata/instance/compute/tags?api-version=2021-02-01&format=text" | awk -F ';|Cloud:' '/Cloud/ {print $2}')
[[ "${get_cloud}" == "azure" ]] && cloud="azure"
# GCP Cloud
get_cloud=$(curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/attributes/Cloud || true)
[[ "${get_cloud}" == "gcp" ]] && cloud="gcp"
echo $cloud

附加信息

  1. AWS-实例元数据和用户数据
  2. Azure实例元数据服务
  3. GCP-访问VM元数据
  4. 云初始化-实例元数据

最新更新