

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# スロットルコールとドロップされた接続の処理
<a name="handling-errors"></a>

Amazon Textract オペレーションは、1 秒あたりの最大トランザクション数 (TPS) を超え、サービスがアプリケーションをスロットルしたり、接続が切断されたりすると、失敗することがあります。たとえば、短期間で Amazon Textract オペレーションへの呼び出しが多すぎると、コールがスロットルされ、`ProvisionedThroughputExceededException`オペレーション応答でエラーが発生しました。Amazon Textract TPS クォータの詳細については、「」を参照してください。[Amazon Textract クォータ](https://docs.aws.amazon.com/general/latest/gr/textract.html)。

操作を自動的に再試行することで、スロットリングとドロップされた接続を管理できます。再試行回数を指定するには、`Config`Amazon Textract クライアントを作成するときのパラメータです。再試行回数は 5 にすることをお勧めします。-AWSSDK では、指定した回数だけ操作が再試行された後に失敗となり、例外がスローされます。詳細については、[AWS でのエラーの再試行とエクスポネンシャルバックオフ](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)を参照してください。

**注記**  
自動再試行は、同期操作と非同期操作の両方で機能します。自動再試行を指定する前に、AWS SDK の最新バージョンがインストールされていることを確認します。詳細については、「[ステップ 2: のセットアップAWS CLIそしてAWSSDK](setup-awscli-sdk.md)」を参照してください。

次の例では、複数のドキュメントを処理するときに Amazon Textract オペレーションを自動的に再試行する方法を示しています。

**前提条件**
+ まだ実行していない場合:

  1. を使用して IAM ユーザーを作成または更新する`AmazonTextractFullAccess`そして`AmazonS3ReadOnlyAccess`アクセス許可。詳細については、「[ステップ 1: AWS アカウントを設定して IAM ユーザーの作成](setting-up.md#setting-up-iam)」を参照してください。

  1. AWS CLI と AWS SDK をインストールして設定します。詳細については、「[ステップ 2: のセットアップAWS CLIそしてAWSSDK](setup-awscli-sdk.md)」を参照してください。

**オペレーションを自動的に再試行するには**

1. S3 バケットに複数のドキュメントイメージをアップロードして、Synchronous の例を実行します。複数ページのドキュメントを S3 バケットにアップロードして実行します。`StartDocumentTextDetection`その上で、非同期の例を実行します。

   手順については、以下を参照してください。[Amazon S3 へのオブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/UploadingObjectsintoAmazonS3.html)の*Amazon Simple Storage Service ユーザーガイド*。

1. 次の例では、の使い方をデモンストレーションします。`Config`パラメータを使用して、操作を自動的に再試行します。同期の例では、`DetectDocumentText`オペレーション。非同期の例では`GetDocumentTextDetection`オペレーション.

------
#### [ Sync Example ]

   以下の例を使用して、`DetectDocumentText`Amazon S3 バケット内のドキュメントに対する操作。Eclipse`main`で、の値を変更するには`bucket`S3 バケットにアップロードします。の値を変更するには`documents`ステップ 2 でアップロードしたドキュメントイメージの名前を入力します。

   ```
   import boto3
   from botocore.client import Config
   # Documents
   
   def process_multiple_documents(bucket, documents):
       
       config = Config(retries = dict(max_attempts = 5))
    
       # Amazon Textract client
       textract = boto3.client('textract', config=config)
    
       for documentName in documents:
    
           print("\nProcessing: {}\n==========================================".format(documentName))
    
           # Call Amazon Textract
           response = textract.detect_document_text(
               Document={
                   'S3Object': {
                       'Bucket': bucket,
                       'Name': documentName
                   }
               })
    
           # Print detected text
           for item in response["Blocks"]:
               if item["BlockType"] == "LINE":
                   print ('\033[94m' +  item["Text"] + '\033[0m')
   
   
   def main():
       bucket = ""
       documents = ["document-image-1.png",
       "document-image-2.png", "document-image-3.png",
       "document-image-4.png", "document-image-5.png" ]
       process_multiple_documents(bucket, documents)
   
   
   
   if __name__ == "__main__":
       main()
   ```

------
#### [ Async Example ]

   以下の例を使用して、`GetDocumentTextDetection` オペレーションを呼び出します。これは、既に呼び出されていることを前提としています。`StartDocumentTextDetection`Amazon S3 バケットのドキュメントで、`JobId`。Eclipse`main`で、の値を変更するには`bucket`S3 バケットの値`roleArn`Textract ロールに割り当てられた Arn に指定します。また、の値を変更する必要もあります。`document`を Amazon S3 バケット内の複数ページドキュメントの名前に変更します。最後に、の値を置き換えます。`region_name`お住まいの地域の名前を入力し、`GetResults`の名前を持つ関数を使用します。`jobId`。

   ```
   import boto3
   from botocore.client import Config
   
   class DocumentProcessor:
       jobId = ''
       region_name = ''
   
       roleArn = ''
       bucket = ''
       document = ''
   
       sqsQueueUrl = ''
       snsTopicArn = ''
       processType = ''
   
       def __init__(self, role, bucket, document, region):
           self.roleArn = role
           self.bucket = bucket
           self.document = document
           self.region_name = region
           self.config = Config(retries = dict(max_attempts = 5))
   
           self.textract = boto3.client('textract', region_name=self.region_name, config=self.config)
           self.sqs = boto3.client('sqs')
           self.sns = boto3.client('sns')
   
   # Display information about a block
       def DisplayBlockInfo(self, block):
   
           print("Block Id: " + block['Id'])
           print("Type: " + block['BlockType'])
           if 'EntityTypes' in block:
               print('EntityTypes: {}'.format(block['EntityTypes']))
   
           if 'Text' in block:
               print("Text: " + block['Text'])
   
           if block['BlockType'] != 'PAGE':
               print("Confidence: " + "{:.2f}".format(block['Confidence']) + "%")
   
           print('Page: {}'.format(block['Page']))
   
           if block['BlockType'] == 'CELL':
               print('Cell Information')
               print('\tColumn: {} '.format(block['ColumnIndex']))
               print('\tRow: {}'.format(block['RowIndex']))
               print('\tColumn span: {} '.format(block['ColumnSpan']))
               print('\tRow span: {}'.format(block['RowSpan']))
   
               if 'Relationships' in block:
                   print('\tRelationships: {}'.format(block['Relationships']))
   
           print('Geometry')
           print('\tBounding Box: {}'.format(block['Geometry']['BoundingBox']))
           print('\tPolygon: {}'.format(block['Geometry']['Polygon']))
   
           if block['BlockType'] == 'SELECTION_ELEMENT':
               print('    Selection element detected: ', end='')
               if block['SelectionStatus'] == 'SELECTED':
                   print('Selected')
               else:
                   print('Not selected')
   
       def GetResults(self, jobId):
           maxResults = 1000
           paginationToken = None
           finished = False
   
           while finished == False:
   
               response = None
   
               if paginationToken == None:
                   response = self.textract.get_document_text_detection(JobId=jobId,
                                                                            MaxResults=maxResults)
               else:
                   response = self.textract.get_document_text_detection(JobId=jobId,
                                                                            MaxResults=maxResults,
                                                                            NextToken=paginationToken)
   
               blocks = response['Blocks']
               print('Detected Document Text')
               print('Pages: {}'.format(response['DocumentMetadata']['Pages']))
   
               # Display block information
               for block in blocks:
                   self.DisplayBlockInfo(block)
                   print()
                   print()
   
               if 'NextToken' in response:
                   paginationToken = response['NextToken']
               else:
                   finished = True
   
   def main():
       roleArn = 'role-arn'
       bucket = 'bucket-name'
       document = 'document-name'
       region_name = 'region-name'
       analyzer = DocumentProcessor(roleArn, bucket, document, region_name)
       analyzer.GetResults("job-id")
   
   if __name__ == "__main__":
       main()
   ```

------