2013-09-26 167 views
19

Tôi phải khởi động máy mới với ec2.run_instances trong một mạng con cụ thể nhưng cũng phải có một ip công cộng được gán tự động (không cố định ip đàn hồi).Cách tự động gán IP công khai cho trường hợp EC2 với boto

Khi khởi động máy mới từ Trình quản lý EC2 web của Amazon qua Yêu cầu (Chi tiết trường hợp) có hộp kiểm được gọi là Gán IP công cộng để Tự động gán IP công khai. Xem nó được nhấn mạnh trong các ảnh chụp màn hình:

Request Instance wizard

Làm thế nào tôi có thể đạt được điều đó chức năng check-box với boto?

Trả lời

38

Điều thú vị đủ, có vẻ như không có nhiều người gặp sự cố này. Đối với tôi rất quan trọng để có thể làm điều này đúng. Nếu không có chức năng này, người dùng không thể truy cập internet từ các trường hợp được đưa vào một số nondefault subnet.

Tài liệu boto không cung cấp trợ giúp, có lỗi liên quan gần đây đã được sửa, xem tại: https://github.com/boto/boto/pull/1705.

Điều quan trọng cần lưu ý là subnet_id và bảo mật groups phải được cung cấp cho giao diện mạng NetworkInterfaceSpecification thay vì 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

Bất kỳ ai gặp phải lỗi này khi thực hiện việc này? Không thể chỉ định tham số liên kếtPublicIPAddress cho giao diện mạng có ID.' – qwwqwwq

+0

có, rõ ràng là bạn không thể tạo giao diện đầu tiên nữa nếu bạn muốn có IP công khai. Tôi sẽ thêm một câu trả lời cho boto3 phản ánh điều này. [oh chờ đợi, tôi không phải. xem barryku's] –

0

Không bao giờ tự làm việc với tính năng này, nhưng cuộc gọi run_instances có thông số được gọi là network_interfaces. Theo số documentation, bạn có thể cung cấp chi tiết địa chỉ IP tại đó.

+0

Thật vậy, người dùng phải sử dụng network_interfaces, nhưng thật đáng buồn là tài liệu này không hữu ích, tôi đã đọc mã và API amazon ec2. – sanyi

6

boto3 có NetworkInterfaces bạn có thể định cấu hình cho DeviceIndex = 0 và Subnet và SecurityGroupIds sẽ được di chuyển từ cấp độ mẫu sang khối này thay thế. Đây là phiên bản dành cho tôi,

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)