特定のサブネットでec2.run_instances
を使用して新しいマシンを起動する必要がありますが、パブリックIPを自動割り当てする必要があります(固定エラスティックIPではありません)。
アマゾンのウェブEC2マネージャーからリクエストインスタンス(インスタンスの詳細)を介して新しいマシンを起動すると、パブリックIPを自動割り当てするためのパブリックIPの割り当てというチェックボックスがあります。スクリーンショットで強調表示されているものを参照してください。
boto
を使用してそのチェックボックス機能を実現するにはどうすればよいですか?
興味深いことに、この問題を抱えている人はあまりいないようです。 私にとって、これを正しく行うことができることは非常に重要でした。この機能がないと、nondefault subnet
で起動されたインスタンスからインターネットにアクセスできません。
Botoのドキュメントは役に立ちませんでした。最近修正された関連バグがありました。 https://github.com/boto/boto/pull/1705 を参照してください。
subnet_id
とセキュリティgroups
はrun_instance
ではなくネットワークインターフェースNetworkInterfaceSpecification
に提供する必要があることに注意することが重要です。
import time
import boto
import boto.ec2.networkinterface
from settings.settings import AWS_ACCESS_GENERIC
ec2 = boto.connect_ec2(*AWS_ACCESS_GENERIC)
interface = boto.ec2.networkinterface.NetworkInterfaceSpecification(subnet_id='subnet-11d02d71',
groups=['sg-0365c56d'],
associate_public_ip_address=True)
interfaces = boto.ec2.networkinterface.NetworkInterfaceCollection(interface)
reservation = ec2.run_instances(image_id='AMI-a1074dc8',
instance_type='t1.micro',
#the following two arguments are provided in the network_interface
#instead at the global level !!
#'security_group_ids': ['sg-0365c56d'],
#'subnet_id': 'subnet-11d02d71',
network_interfaces=interfaces,
key_name='keyPairName')
instance = reservation.instances[0]
instance.update()
while instance.state == "pending":
print instance, instance.state
time.sleep(5)
instance.update()
instance.add_tag("Name", "some name")
print "done", instance
boto3には、DeviceIndex = 0用に構成できるNetworkInterfacesがあり、代わりにサブネットとSecurityGroupIdsをインスタンスレベルからこのブロックに移動する必要があります。これが私のための作業バージョンです、
def launch_instance(AMI_id, name, type, size, ec2):
rc = ec2.create_instances(
ImageId=AMI_id,
MinCount=1,
MaxCount=1,
KeyName=key_name,
InstanceType=size,
NetworkInterfaces=[
{
'DeviceIndex': 0,
'SubnetId': subnet,
'AssociatePublicIpAddress': True,
'Groups': sg
},
]
)
instance_id = rc[0].id
instance_name = name + '-' + type
ec2.create_tags(
Resources = [instance_id],
Tags = [{'Key': 'Name', 'Value': instance_name}]
)
return (instance_id, instance_name)
この機能を自分で使用したことはありませんが、run_instances
呼び出しにはnetwork_interfaces
というパラメーターがあります。 documentation によると、そこでIPアドレスの詳細を指定できます。