2013-09-26 45 views
19

ec2.run_instancesという新しいマシンを特定のサブネットで起動する必要がありますが、パブリックIP自動割り当て(固定IPではない)も必要です。botoを使ってEC2インスタンスにパブリックIPを割り当てる方法

AmazonのWeb EC2マネージャからリクエストインスタンス(インスタンスの詳細)を介して新しいマシンを起動すると、という名前のチェックボックスがあり、パブリックIPの自動割り当てにパブリックIPを割り当てます。

Request Instance wizard

どのように私はbotoとそのチェックボックスの機能を実現することができます。 それはスクリーンショットでハイライトを参照してください?

答えて

38

興味深いことに、多くの人がこの問題を抱えているとは思われません。私はこのことを正しく行うことが非常に重要でした。この機能がなければ、nondefault subnetに開始されたインスタンスからインターネットにアクセスすることはできません。

botoのマニュアルには何の助けもありませんでした。関連するバグが最近修正されました。https://github.com/boto/boto/pull/1705を参照してください。

それはsubnet_idとセキュリティgroupsは、ネットワークインタフェースNetworkInterfaceSpecificationの代わりrun_instanceに提供されなければならないことに注意することが重要です。

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 
+2

これを行う間に誰かがこのエラーを受け取りますか? 'associatePublicIPAddressパラメータは、IDを持つネットワークインターフェイスに指定できません。 ' – qwwqwwq

+0

はい、パブリックIPが必要な場合は、もうインターフェイスを作成できません。これを反映するboto3の回答を追加します。 [ああ待って、私はする必要はありません。 barrykuの]を参照してください –

0

自分自身でこの機能を使用したことはありませんが、run_instances呼び出しにはnetwork_interfacesというパラメータがあります。 documentationによれば、そこにIPアドレスの詳細を与えることができます。

+0

実際にはnetwork_interfacesを使用する必要がありますが、悲しいことに、ドキュメントは役に立ちませんでした。私はコードとamazon ec2 APIを読み終えました。 – sanyi

6

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) 
関連する問題