我有一本书。Net核心客户端应用程序,根据AWS文档使用amazon Textract和S3、SNS和SQS,检测和分析多页文档中的文本(https://docs.aws.amazon.com/textract/latest/dg/async.html)
根据留档(https://docs.aws.amazon.com/textract/latest/dg/api-async-roles.html){版本:2012-10-17,声明": [ { "效果:允许,主体:{服务": "<--PLHD--1/>" }, "行动":"sts: AssumeRole" } ] }
根据aws文档,订阅该主题的SQS,并授予亚马逊SNS主题向亚马逊SQS队列发送消息的权限。
包括S3 Bucket、SNS、SQS在内的所有资源都位于同一个us-west2区域
以下方法显示了一个通用错误“InvalidParameterException”请求的参数无效
但是如果NotificationChannel部分被注释,代码工作正常,并返回正确的作业id。
错误消息没有给出关于参数的清晰图像。非常感谢任何帮助。
public async Task<string> ScanDocument()
{
string roleArn = "aws:iam::xxxxxxxxxxxx:instance-profile/MyTextractRole";
string topicArn = "aws:sns:us-west-2:xxxxxxxxxxxx:AmazonTextract-My-Topic";
string bucketName = "mybucket";
string filename = "mytestdoc.pdf";
var request = new StartDocumentAnalysisRequest();
var notificationChannel = new NotificationChannel();
notificationChannel.RoleArn = roleArn;
notificationChannel.SNSTopicArn = topicArn;
var s3Object = new S3Object
{
Bucket = bucketName,
Name = filename
};
request.DocumentLocation = new DocumentLocation
{
S3Object = s3Object
};
request.FeatureTypes = new List<string>() { "TABLES", "FORMS" };
request.NotificationChannel = channel; /* Commenting this line work the code*/
var response = await this._textractService.StartDocumentAnalysisAsync(request);
return response.JobId;
}
您需要更改所有SQS操作的权限,然后使用下面的代码
def startJob(s3BucketName, objectName):
response = None
response = textract.start_document_text_detection(
DocumentLocation={
'S3Object': {
'Bucket': s3BucketName,
'Name': objectName
}
})
return response["JobId"]
def isJobComplete(jobId):
# For production use cases, use SNS based notification
# Details at: https://docs.aws.amazon.com/textract/latest/dg/api-async.html
time.sleep(5)
response = textract.get_document_text_detection(JobId=jobId)
status = response["JobStatus"]
print("Job status: {}".format(status))
while(status == "IN_PROGRESS"):
time.sleep(5)
response = textract.get_document_text_detection(JobId=jobId)
status = response["JobStatus"]
print("Job status: {}".format(status))
return status
def getJobResults(jobId):
pages = []
response = textract.get_document_text_detection(JobId=jobId)
pages.append(response)
print("Resultset page recieved: {}".format(len(pages)))
nextToken = None
if('NextToken' in response):
nextToken = response['NextToken']
while(nextToken):
response = textract.get_document_text_detection(JobId=jobId, NextToken=nextToken)
pages.append(response)
print("Resultset page recieved: {}".format(len(pages)))
nextToken = None
if('NextToken' in response):
nextToken = response['NextToken']
return pages
在对这个问题进行了长时间的分析之后。我终于解决了。。根据文档主题,只需要向SQS发送消息操作。但在将其更改为所有SQS操作后,它开始工作。但AWS的错误信息确实是误导和令人困惑的
AWS SDK会在本地验证您的请求对象,然后再将其发送到AWS服务器。这种验证将失败,出现不透明的错误,如OP。
由于SDK是开源的,您可以检查源以帮助缩小无效参数的范围。
在我们看代码之前:SDK(和文档)实际上是从描述API及其需求以及如何验证它们的特殊JSON文件生成的。实际代码是基于这些JSON文件生成的。
我将使用节点。以js SDK为例,但我相信类似的方法可能适用于其他SDK,包括。网
在我们的例子(AWS Textract)中,最新的Api版本是2018-06-27
。毫无疑问,JSON源文件位于GitHub上。
在我的例子中,实验将问题缩小到ClientUrestToken
。该错误是不透明的InvalidParameterExc0019
。我在SDK源JSON文件中搜索了它,果然,在第392行:
"ClientRequestToken": {
"type": "string",
"max": 64,
"min": 1,
"pattern": "^[a-zA-Z0-9-_]+$"
},
一大堆未记录的要求!
在我的例子中,我使用的令牌违反了正则表达式(上面源代码中的模式
)。更改我的令牌代码以满足正则表达式解决了这个问题。
我推荐这种方法用于这类不透明类型错误。