如何从boto3获取当前实例ID?

How to obtain current instance ID from boto3?

有没有等同于

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

用boto3获取当前运行实例instance-id in python?

没有api,没有。有 InstanceMetadataFetcher,但目前仅用于获取 IAM 角色进行身份验证。

任何类型的 GET 都应该为您服务。 Botocore 使用 python requests 库非常好。

import requests
response = requests.get('http://169.254.169.254/latest/meta-data/instance-id')
instance_id = response.text

还没有boto3api可以做。但是如果你当前的实例是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)

我参加晚会迟到了,但在遇到这个问题并且对没有令人满意的基于 boto3 的答案来获取当前 ec2 的 instanceid 感到失望后,我着手解决这个问题。

您使用套接字获取主机名(也是 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 适用于此。

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

pip3 install ec2-metadata
from ec2_metadata import ec2_metadata
print(ec2_metadata.instance_id)