19

是否有相当于

curl http://169.254.169.254/latest/meta-data/instance-id

用boto3在python中获取当前正在运行的实例instance-id?

4

4 回答 4

30

它没有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
于 2015-10-23T16:55:09.837 回答
9

事实上,放弃那个答案。您只需要ec2-metadata https://github.com/adamchainz/ec2-metadata

pip3 install ec2-metadata
from ec2_metadata import ec2_metadata
print(ec2_metadata.instance_id)
于 2020-03-05T12:34:28.797 回答
3

我迟到了,但是在遇到这个问题并且对获取当前 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 将适用于此。

于 2020-03-05T11:34:11.107 回答
1

仍然没有 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)
于 2019-08-16T07:32:28.767 回答