に相当するものはありますか
curl http://169.254.169.254/latest/meta-data/instance-id
boto3を使用して、Pythonで現在実行中のインスタンスinstance-idを取得しますか?
そのための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)
私はパーティーに遅れましたが、この質問に出くわし、現在のec2のインスタンスIDを取得するための満足のいく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はそのために機能します。
実際、その答えを捨ててください。必要なのはec2-metadata https://github.com/adamchainz/ec2-metadata
pip3 install ec2-metadata
from ec2_metadata import ec2_metadata
print(ec2_metadata.instance_id)