当前位置: 首页 > 知识库问答 >
问题:

TooManyRequestsException适用于Boto3客户组织

萧安怡
2023-03-14

我正在通过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网关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

共有1个答案

郎鸿
2023-03-14

通过异常处理,我的代码正在成功运行。

捕获TooManyRequestsExceptionClientError的异常exception,然后重试调用AWS列表\u帐户API。

我们可以增加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
 类似资料:
  • 问题内容: 我正在开发一个项目,该项目需要解析一些受保护的网页中的数据。为了获得对这些页面的访问权限,我必须克服SAML身份验证形式(Shibboleth)。是否有人能够在Android(Java)中实现此标准?我已经读过这个线程:Android的SAML客户端实现? 但这并不能给我一个很好的解决方案。实际上,我需要 获取某些受保护网页的数据 以便对其进行解析,而不是让用户看到此类网页的内容。因此

  • 问题内容: 有人知道iOS的Elasticsearch客户端库吗?如果它也是迅速写的,那将是一个好处。 elasticsearch的“客户端”部分显示了多个平台的多个库,但对于iOS没有任何显示,我觉得有人必须这样做吗? 干杯 问题答案: 我怀疑是否有人- 上次我检查时没有,并且有充分的理由。请记住,为了允许IOS客户端(或Android)使用客户端库连接到Elasticsearch,您必须打开集

  • 我有一个连接到WebSocket服务器并从服务器接收消息的微服务。我想在这个应用程序中集成Sleuth,因为这是我的一组微服务的网关。但是当我连接到WebSocket服务器并开始接收消息时,我无法在日志中跟踪ID,spanid。我期待着这样的事情: 但我得到了: 我的代码如下: 我们的pom条目包括:

  • 然后我使用: 这似乎无法为那些设置了该属性的客户机提供一个clusergroup。这对客户端节点不起作用吗?

  • 问题内容: 我已经设置了Go rest api。并在登录时执行此操作: 为了检查会话,我有这样的东西: 如果我执行邮递员的请求,效果很好,但是当我从客户那里收到请求时,我会得到401。你们中的任何人是否经历过类似的事情?该商店是一个CookieStore。 我已经检查了ID,将sessionId变量替换为静态字符串。大猩猩会话使用大猩猩上下文注册一个新请求,当我这样做时,来自邮递员的请求不为空,但

  • 在我的应用程序中,我为用户提供了一个选项,可以将其数据(一个db和一些音频文件)备份到应用程序文件夹中的Google Drive帐户。为此,用户必须在以下对话框中“为MyApp选择帐户”: 之后,我开始备份过程。 但是,如果用户点击该对话框之外的某个地方,它会消失并且不会建立连接-并且不会再次显示该对话框。 发生这种情况时,我如何提示系统再次向他/她显示该对话框?除此之外,我还尝试将GoogleA