在使用boto3调用AWS时,我遇到间歇性的RateLimitExceeded错误。在下面的示例中,由于速率限制,调用instance.all()或i.vpc.tags可能会失败:
for i in instance.all():
tags = i.vpc.tags
通常,我在自己的函数上使用韧度作为装饰器,但显然此调用无法完成,因为它来自导入的库。如果不在for循环中,则可以使用重试功能,如下所示:
r = tenacity.Retrying(
reraise=True,
wait=tenacity.wait_random_exponential(multiplier=1, max=60),
stop=tenacity.stop_after_delay(130))
r.call(call_wrapped_in_tenacity())
那么,有没有一种方法可以包装这两个对AWS的调用,而又不为每个调用建立新的功能,同时又保持重试能力呢?
答案 0 :(得分:0)
如果创建自己的函数超出范围,那么这是我发现解决此问题的唯一方法。基本上,当您创建boto3客户端时,您可以向其传递对boto配置中您自己的设置的引用,如下所示:
from botocore.config import Config
config = Config(retries=dict(max_attempts=20))
ec2_client = boto3.client('ec2', config=config)