python-3.x - Boto3 客户端组织的 TooManyRequestsException
问题描述
我正在通过 boto3 组织从主 AWS 账户中获取所有子账户。代码工作正常。我能够获得儿童帐户列表。但是,如果您再次运行我的 AWS Lambda 函数,则无法获取子账户。
收到以下错误:
Error while getting AWS Accounts : An error occurred (TooManyRequestsException) when calling the ListAccounts operation: AWS Organizations can't complete your request because another request is already in progress. Try again later
20 到 30 分钟后,我可以看到我的代码一次又一次地引发上述异常。
我是通过 AWS Gateway + AWS Lambda 运行此代码。
任何的想法?
代码:
import boto3
class Organizations(object):
"""AWS Organization"""
def __init__(self, access_key, secret_access_key, session_token=None):
self.client = boto3.client('organizations',
aws_access_key_id=access_key,
aws_secret_access_key=secret_access_key,
aws_session_token=session_token
)
def get_accounts(self, next_token=None, max_results=None):
"""Get Accounts List"""
if next_token and max_results:
result = self.client.list_accounts(NextToken=next_token,
MaxResults=max_results)
elif next_token:
result = self.client.list_accounts(NextToken=next_token)
elif max_results:
result = self.client.list_accounts(MaxResults=max_results)
else:
result = self.client.list_accounts()
return result
class AWSAccounts(object):
""" Return AWS Accounts information. """
def get_aws_accounts(self, access_key, secret_access_key, session_token):
""" Return List of AWS account Details."""
org_obj = Organizations(access_key=access_key,
secret_access_key=secret_access_key,
session_token=session_token)
aws_accounts = []
next_token = None
next_result = None
while True:
response = org_obj.get_accounts(next_token, next_result)
for account in response['Accounts']:
account_details = {"name": account["Name"],
"id": account["Id"],
"admin_role_name": self.account_role_name
}
aws_accounts.append(account_details)
if "NextToken" not in response:
break
next_token = response["NextToken"]
return aws_accounts
解决方案
通过异常处理,我的代码运行成功。
TooManyRequestsException
通过异常捕获异常并通过boto3ClientError
重试调用API。AWS list_accounts
我们可以添加 0.1 秒的睡眠时间。
代码:
class AWSAccounts(object):
""" Return AWS Accounts information. """
def get_accounts(self, next_token=None, max_results=None):
"""Get Accounts List"""
# If Master AWS account contain more child accounts(150+) then
# Too-Many-Request Exception is raised by the AWS API(boto3).
# So to fix this issue, we are calling API again by Exception Handling.
result = None
while True:
try:
if next_token and max_results:
result = self.client.list_accounts(NextToken=next_token,
MaxResults=max_results)
elif next_token:
result = self.client.list_accounts(NextToken=next_token)
elif max_results:
result = self.client.list_accounts(MaxResults=max_results)
else:
result = self.client.list_accounts()
except botocore.exceptions.ClientError as err:
response = err.response
print("Failed to list accounts:", response)
if (response and response.get("Error", {}).get("Code") ==
"TooManyRequestsException"):
print("Continue for TooManyRequestsException exception.")
continue
break
return result
推荐阅读
- android - 当 StyleLookup 设置为 arrowdowntoolbutton 时,Delphi 10.1 FMX TSpeedButton 不会在 Android 上调整为客户端的大小
- python-3.x - 如何让交换机激活密码属性?
- c# - 两个线程正在使用,但在没有迁移时也会显示有关迁移的警告
- python - 使用 Python 加载 Json Data Sql
- java - BEAM - java.lang.RuntimeException:读取数据失败
- ios - 为所有 iPhone 设备制作自适应布局
- java - 我如何将游戏循环放入我的代码中?
- node.js - Apache 不会将请求转发到 Nodejs 后端服务器
- c# - 如何使用 C# 的 XStream 序列化程序忽略字段和属性?
- javascript - 如何将 Bootstrap 3 时间选择器显示为网格