如何获取使用 boto3 创建的 spot 实例的 ip 地址

How to get ip address of spot instance created with boto3

我可以使用以下代码使用 boto3 创建 spot 实例

import boto3
import datetime, random, string
client = boto3.client('ec2')
response = client.request_spot_instances(
    DryRun=False,
    ClientToken=''.join(random.choices(string.ascii_uppercase + string.digits, k=10)),
    InstanceCount=1,
    Type='one-time',
    LaunchSpecification={
        'ImageId': 'ami-053ebee0bc662f9b3',
        'SecurityGroups': ['default'],
        'InstanceType': 't3.medium',
        'Placement': {
            'AvailabilityZone': 'us-east-1a',
        },
        'BlockDeviceMappings': [
            {
            },
        ],
        'EbsOptimized': True,
        'Monitoring': {
            'Enabled': True
        },
        'SecurityGroupIds': [
            'sg-03432e1f',
        ]
    }
)
print(response)

我得到的回复如下。我怎样才能得到所有创建的机器的IP地址。我知道请求是异步的,但是如果我想轮询创建实例的详细信息,有什么办法?

{
  "SpotInstanceRequests": [
    {
      "CreateTime": "2022-05-22 05:21:54+00:00",
      "LaunchSpecification": {
        "SecurityGroups": [
          {
            "GroupName": "default",
            "GroupId": "sg-03432e1f"
          }
        ],
        "EbsOptimized": true,
        "ImageId": "ami-053ebee0bc662f9b3",
        "InstanceType": "t3.medium",
        "Placement": {
          "AvailabilityZone": "us-east-1a"
        },
        "SubnetId": "subnet-b9f4aadf",
        "Monitoring": {
          "Enabled": true
        }
      },
      "ProductDescription": "Linux/UNIX",
      "SpotInstanceRequestId": "sir-88tef9gh",
      "SpotPrice": "0.041600",
      "State": "open",
      "Status": {
        "Code": "pending-evaluation",
        "Message": "Your Spot request has been submitted for review, and is pending evaluation.",
        "UpdateTime": "2022-05-22 05:21:55+00:00"
      },
      "Type": "one-time",
      "InstanceInterruptionBehavior": "terminate"
    }
  ],
  "ResponseMetadata": {
    "RequestId": "ac39fdad-cb4d-4e26-82a5-1f55c1f0d5af",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amzn-requestid": "ac39fdad-cb4d-4e26-82a5-1f55c1f0d5af",
      "cache-control": "no-cache, no-store",
      "strict-transport-security": "max-age=31536000; includeSubDomains",
      "content-type": "text/xml;charset=UTF-8",
      "content-length": "1696",
      "date": "Sun, 22 May 2022 05:21:54 GMT",
      "server": "AmazonEC2"
    },
    "RetryAttempts": 0
  }
}

与常规实例相同。您必须获得 NetworkInterfaceId 个可以使用 describe_instances 获得的 spot 实例。调用的结果为您提供 InstanceLifecycle 等于 spot 的现货实例。

一旦您拥有 NetworkInterfaceId 个 spot 实例,您就可以使用 describe_network_interfaces 获得与接口关联的 PublicIp