是否有相当于
curl http://169.254.169.254/latest/meta-data/instance-id
用boto3在python中获取当前正在运行的实例instance-id?
它没有api,没有。有InstanceMetadataFetcher
,但目前仅用于获取 IAM 角色进行身份验证。
不过,任何一种都GET
应该为您服务。Botocore 使用了requests
相当不错的 python 库。
import requests
response = requests.get('http://169.254.169.254/latest/meta-data/instance-id')
instance_id = response.text
事实上,放弃那个答案。您只需要ec2-metadata
https://github.com/adamchainz/ec2-metadata
pip3 install ec2-metadata
from ec2_metadata import ec2_metadata
print(ec2_metadata.instance_id)
我迟到了,但是在遇到这个问题并且对获取当前 ec2 的 instanceid 没有令人满意的基于 boto3 的答案感到失望之后,我开始着手解决这个问题。
您使用套接字获取主机名(也是 PrivateDnsName)并将其输入到查询中的过滤器以 describe_instances 并使用它来获取 InstanceId。
import socket
import boto3
session = boto3.Session(region_name="eu-west-1")
ec2_client = session.client('ec2')
hostname = socket.gethostname()
filters = [ {'Name': 'private-dns-name',
'Values': [ hostname ]}
]
response = ec2_client.describe_instances(Filters=filters)["Reservations"]
instanceid = response[0]['Instances'][0]['InstanceId']
print(instanceid)
您的实例将需要通过 IAM 授予的 EC2 读取权限。授予您的实例角色的策略 AmazonEC2ReadOnlyAccess 将适用于此。
仍然没有 boto3 api 可以做到这一点。但是如果你当前的实例是Linux系统,那么你可以使用下面的python3代码来获取instance_id:
import subprocess
cmd='''set -o pipefail && sudo grep instance-id /run/cloud-init/instance-data.json | head -1 | sed 's/.*\"i-/i-/g' | sed 's/\",//g\''''
status, instance_id = subprocess.getstatusoutput(cmd)
print(status, instance_id)