在解决方案中,我们计划将多个云(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
我们可以考虑多种方法来识别依赖实例元数据的当前云
- 云初始化
- 元数据基URL
- 元数据特定项
- 自定义标记/元数据
云初始化
#! /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
附加信息
- AWS-实例元数据和用户数据
- Azure实例元数据服务
- GCP-访问VM元数据
- 云初始化-实例元数据