2011-11-09 32 views
21

Có cách nào với API python boto để chỉ định các thẻ khi tạo một cá thể không? Tôi đang cố gắng tránh phải tạo một cá thể, tìm nạp nó và sau đó thêm các thẻ. Nó sẽ dễ dàng hơn nhiều để có trường hợp một trong hai cấu hình sẵn có thẻ nhất định hoặc chỉ định các thẻ khi tôi thực hiện lệnh sau:Boto EC2: Tạo một cá thể với các thẻ

ec2server.create_instance(
     ec2_conn, ami_name, security_group, instance_type_name, key_pair_name, user_data 
    ) 
+0

Bạn thực sự có thể chỉ định thẻ tại thời điểm tạo thời gian - xem câu trả lời của tôi: https://stackoverflow.com/a/43723682/4988742 –

Trả lời

24

Thẻ không thể được thực hiện cho đến khi cá thể đã được tạo. Mặc dù hàm này được gọi là create_instance, nhưng nó thực sự làm là đặt trước và dụ. Sau đó, trường hợp đó có thể hoặc không thể được khởi chạy. (Thông thường, nhưng đôi khi ...)

Vì vậy, bạn không thể thêm thẻ cho đến khi thẻ được khởi chạy. Và không có cách nào để nói nó được tung ra mà không bỏ phiếu cho nó. Giống như vậy:

reservation = conn.run_instances(...) 

# NOTE: this isn't ideal, and assumes you're reserving one instance. Use a for loop, ideally. 
instance = reservation.instances[0] 

# Check up on its status every so often 
status = instance.update() 
while status == 'pending': 
    time.sleep(10) 
    status = instance.update() 

if status == 'running': 
    instance.add_tag("Name","{{INSERT NAME}}") 
else: 
    print('Instance status: ' + status) 
    return None 

# Now that the status is running, it's not yet launched. The only way to tell if it's fully up is to try to SSH in. 
if status == "running": 
    retry = True 
    while retry: 
     try: 
      # SSH into the box here. I personally use fabric 
      retry = False 
     except: 
      time.sleep(10) 

# If we've reached this point, the instance is up and running, and we can SSH and do as we will with it. Or, there never was an instance to begin with. 
+3

Một bổ sung cho giải pháp này có thể là sử dụng [conn.create_tags (instance_id_list, tag_dict)] (http://boto.readthedocs.org/en/latest/ref/ec2.html#boto.ec2.connection.EC2Connection.create_tags) cho phép bạn thêm nhiều thẻ vào nhiều cá thể (đã được tạo!) bằng một lệnh. – dghubble

+2

Vòng lặp bỏ phiếu là không cần thiết; bạn có thể thiết lập các thẻ trong khi một cá thể vẫn còn trong trạng thái 'pending'. –

+0

Tôi muốn thêm vào nhận xét @ChrisMartin: Bạn thực sự không muốn chờ cho cá thể chạy trước khi thêm thẻ; bạn muốn thêm chúng càng sớm càng tốt, vì nếu bạn có tập lệnh cloud-init hoặc user-data hoạt động trên các giá trị của thẻ, bạn muốn đảm bảo rằng các thẻ ở đó trước khi các tập lệnh khởi động này chạy. – grayaii

0

Phương pháp này đã làm việc cho tôi:

rsvn = image.run(
    ... standard options ... 
) 

sleep(1) 

for instance in rsvn.instances: 
    instance.add_tag('<tag name>', <tag value>) 
+1

vâng, đó là mã của tôi hiện đang làm, nhưng như câu hỏi đã nêu, tôi đang tìm kiếm cho một cách để định cấu hình trước thẻ hoặc đưa chúng vào lệnh create_instance. – stevebot

+0

@stevebot Tại sao? Theo cách nào thì phương pháp này không đủ? –

+1

Bạn có một giấc ngủ (1) mà tôi giả sử là như vậy trường hợp sẽ khởi động và được cấu hình. Điều gì xảy ra nếu điều này không bao giờ xảy ra hoặc mất nhiều thời gian hơn? Điều này có nghĩa là code.It sẽ đẹp hơn nhiều để có cấu hình đã được chăm sóc và không phải lo lắng về các trường hợp bị trì hoãn trong trường hợp này. – stevebot

3

Sử dụng boto 2.9.6, tôi có thể thêm thẻ vào ví dụ ngay sau khi nhận được phản hồi của tôi từ run_instances. Một cái gì đó như thế này hoạt động mà không cần ngủ:

reservation = my_connection.run_instances(...) 
for instance in reservation.instances: 
    instance.add_tag('Name', <whatever>) 

Tôi đã xác minh rằng phiên bản vẫn đang ở trạng thái chờ sau khi thêm thẻ thành công. Nó sẽ rất dễ dàng để bọc logic này trong một chức năng tương tự như yêu cầu của bài gốc.

2

You can tag instance or volume on creation

Từ run_instances docs:

Bạn có thể tag trường và khối lượng EBS trong khởi động, sau khi khởi động, hoặc cả hai. Để biết thêm thông tin, hãy xem CreateTagsTagging Your Amazon EC2 Resources.

Using Tags AWS doc bao gồm một bảng với các nguồn lực hỗ trợ gắn thẻ và hỗ trợ gắn thẻ trên tạo (Instance và EBS hỗ trợ Khối lượng cả hai kể từ ngày 01-May-2017)

Đây là một đoạn mã để gắn thẻ dụ tại tạo thời gian trong Python (tài liệu tham khảo SDK khác được liệt kê trên this page):

import boto3 
assert boto3.__version__ >= '1.4.4', \ 
    "Older version of boto3 installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U boto3>=1.4.4'".format(boto3.__version__) 
import botocore 
assert botocore.__version__ >= '1.5.63', \ 
    "Older version of botocore installed {} which doesn't support instance tagging on creation. Update with command 'pip install -U botocore>=1.5.63'".format(botocore.__version__) 
ec2 = boto3.resource('ec2') 
tag_purpose_test = {"Key": "Purpose", "Value": "Test"} 
instance = ec2.create_instances(
    ImageId=EC2_IMAGE_ID, 
    MinCount=1, 
    MaxCount=1, 
    InstanceType=EC2_INSTANCE_TYPE, 
    KeyName=EC2_KEY_NAME, 
    SecurityGroupIds=[EC2_DEFAULT_SEC_GROUP], 
    SubnetId=EC2_SUBNET_ID, 
    TagSpecifications=[{'ResourceType': 'instance', 
         'Tags': [tag_purpose_test]}])[0] 

tôi đã sử dụng

Python 2.7.13 
boto3 (1.4.4) 
botocore (1.5.63) 
+1

''Xác thực tham số không thành công: Tham số không xác định trong đầu vào:" ThẻSpecifications ", phải là một trong: DryRun, ImageId, MinCount ... ' – Zulu

+0

@Zulu bạn có thể chia sẻ đoạn mã và các phiên bản libs của mình không? Tự hỏi nếu định nghĩa API đã thay đổi với phiên bản libs mới hơn. –

+0

@Zulu bạn chắc chắn có phiên bản boto3 cũ hơn. Tôi thấy boto3 cũ hơn không hỗ trợ chức năng TagSpecifications cho hàm create_instances. cập nhật boto3 của bạn: pip install -U boto3> = 1.4.4 và thử lại. –

Các vấn đề liên quan