web-dev-qa-db-ja.com

boto3から現在のインスタンスIDを取得するにはどうすればよいですか?

に相当するものはありますか

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

boto3を使用して、Pythonで現在実行中のインスタンスinstance-idを取得しますか?

12
bmargulies

そのための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
19
Jordon Phillips

それを行うための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)
0
shifu.zheng

私はパーティーに遅れましたが、この質問に出くわし、現在の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はそのために機能します。

0
pixiemops

実際、その答えを捨ててください。必要なのはec2-metadata https://github.com/adamchainz/ec2-metadata

   pip3 install ec2-metadata

    from ec2_metadata import ec2_metadata
    print(ec2_metadata.instance_id)

0
pixiemops