2013-09-26 5 views
19

के साथ ईसी 2 इंस्टेंस को सार्वजनिक आईपी असाइन करने के लिए कैसे करें मुझे किसी दिए गए सबनेट में ec2.run_instances के साथ एक नई मशीन शुरू करना है, लेकिन एक सार्वजनिक आईपी ऑटो असाइन किया गया है (निश्चित लोचदार आईपी नहीं)।बीओ

जब एक अनुरोध उदाहरण (उदाहरण के विवरण) के माध्यम से अमेज़न के वेब EC2 प्रबंधक से एक नई मशीन शुरू होता है एक चेक-बॉक्स है आप सौंपें सार्वजनिक आईपी के असाइन सार्वजनिक आईपी कहा जाता है। देखें कि यह स्क्रीनशॉट में हाइलाइट किए:

Request Instance wizard

मैं boto साथ कि चेक-बॉक्स कार्यक्षमता कैसे प्राप्त कर सकते हैं?

उत्तर

38

दिलचस्प है, ऐसा लगता है कि बहुत से लोगों को यह समस्या नहीं थी। मेरे लिए यह सही करने में सक्षम होना बहुत महत्वपूर्ण था। इस कार्यक्षमता के बिना कोई nondefault subnet में लॉन्च किए गए उदाहरणों से इंटरनेट तक पहुंचने में सक्षम नहीं है।

बोटो प्रलेखन ने कोई मदद नहीं दी, हाल ही में एक संबंधित बग था, देखें: 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

ऐसा करने के दौरान किसी को भी यह त्रुटि मिलती है? 'सहयोगी PublicIPAddress पैरामीटर को आईडी के साथ नेटवर्क इंटरफ़ेस के लिए निर्दिष्ट नहीं किया जा सकता है। – qwwqwwq

+0

हां, जाहिर है कि यदि आप सार्वजनिक आईपी चाहते हैं तो आप पहले इंटरफ़ेस नहीं बना सकते हैं। मैं boto3 के लिए एक उत्तर जोड़ूंगा जो इसे दर्शाता है। [ओह रुको, मुझे नहीं करना है। बैरीकु के देखें] –

0

कभी भी इस सुविधा के साथ काम नहीं किया, लेकिन run_instances कॉल में network_interfaces नामक एक पैरामीटर है। documentation के अनुसार आप वहां आईपी पता विवरण दे सकते हैं।

+0

वास्तव में नेटवर्क_इंटरफेस का उपयोग करना होगा, लेकिन दुख की बात है कि दस्तावेज उपयोगी नहीं था, मैंने कोड और अमेज़ॅन ec2 एपीआई पढ़ने को समाप्त कर दिया। – sanyi

6

boto3 NetworkInterfaces आप DeviceIndex = 0 के लिए कॉन्फ़िगर कर सकते हैं, और सबनेट और 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) 
संबंधित मुद्दे