2016-09-11 162 views
-1

我正在创建一个Lambda函数,目的是用他们的快照备份我的EC2实例。然而,我注意到阅读boto文档ec2.describe_instances的调用是由MaxResults/NextToken限制的。我怎样才能将这两个组合在一起安全地迭代列表50?下面是我的工作进展情况:处理EC2描述限制在Boto3 Lambda?

import boto3 
import datetime 
import time 

ec2 = boto3.client('ec2') 

def lambda_handler(event, context): 
    try: 
     print("Creating snapshots on " + str(datetime.datetime.today()) + ".") 
     maxResults = 50 
     schedulers = ec2.describe_instances(Filters=[{'Name':'tag:GL-sub-purpose', 'Values':[Schedule]}], MaxResults=maxResults) 
     nextToken = schedulers['NextToken'] 
     totalSchedulers = len(schedulers) 
     while totalSchedulers == maxResults: 
     schedulers = ec2.describe_instances(Filters=[{'Name':'tag:GL-sub-purpose', 'Values':[Schedule]}], MaxResults=maxResults, NextToken=nextToken) 
     nextToken = result['NextToken'] 
     totalSchedulers = len(schedulers) 
     print("Performing backup on " + str(len(schedulers)) + " schedules.") 
     successful = [] 
     failed  = [] 
     for s in schedulers: 
      #[...] More operations here, done 50 at a time. 

我真的不知道,如果我使用的maxResults /参数的nextToken正确或有效地在这里。这是实现我想要的结果的最佳方式吗?我是否正确?

回答

2

只需迭代直到NextToken不返回。这是一个迭代通过一批实例的示例代码。改变它以适应您的需求。

import boto3 

ec2 = boto3.client('ec2') 
insts = ec2.describe_instances(MaxResults=50) 
while True: 
    # 
    # Process Instances (insts) 
    # 
    if 'NextToken' not in insts: break 
    next_token = insts['NextToken'] 
    insts = ec2.describe_instances(MaxResults=50, NextToken=next_token)