2

我知道这是一个满口的标题,但我被撞到了墙上,我想我会伸出手看看是否有什么我遗漏的东西。

我的目标:一个 lambda,它将访问 S3 存储桶内的文件,通过 textract 运行它,然后将结果写入 RDS 数据库。(此时要访问 RDS,我必须在 VPC 中运行我的 lambda)

所以,我的 lambda 函数在 VPC 中运行。我已经设置了必要的权限、策略、端点等,以便 lambda 可以使用以下代码访问 s3 文档:

s3 = boto3.client('s3')
def lambda_handler(event, context):
    bucket = 'my-bucket'
    key = my-file.json'
    try:
        data = s3.get_object(Bucket=bucket, Key=key)
        json_data = data['Body'].read()
        return json_data    
    except Exception as e:
        print(e)
        raise e

现在......这是问题所在。我用下面的代码替换上面的代码并在 VPC 中运行——我得到了可怕的超时。

def lambda_handler(event, context):
    # Document
    s3BucketName = "my-bucket"
    documentName = "test.png" 
    # Amazon Textract client
    textract = boto3.client('textract')

    # Call Amazon Textract
    response = textract.detect_document_text(
    Document={
            'S3Object': {
            'Bucket': s3BucketName,
            'Name': documentName
    }    })
   # Print detected text
    for item in response["Blocks"]:
    if item["BlockType"] == "LINE":
        print (  item["Text"] )

当 lambda 在 VPC 之外运行时,即在 lambda 的 Network 标题下选择“No VPC”,第二个代码块运行没有问题。

有谁知道可能导致此失败的原因是什么?我在文档中没有发现任何说明这种情况被阻止的内容,但我担心我可能无法从 VPC 内部访问 Textract?

4

2 回答 2

0

我认为它没有通过文本响应?

如果是这样,请仔细检查确保执行角色附加了 AmazonTextractFullAccess。

同样值得尝试首先从 s3 中提取文件并尝试在本地文件上运行 textract,以检查它是否是 textract 和 s3 之间的问题。

然后是这个旧的可靠修复:

提取非 vpc lambda 中的文本并将 json 中的结果转储到 S3,然后让它在可以访问您的 RDS 数据库的 VPC 中触发另一个 lambda。

于 2020-01-14T23:17:02.940 回答
0

如果您的 VPC 位于以下区域之一(截至 2020 年 1 月),则可以在您的 VPC 中使用 Textract:

  • 美国东部(弗吉尼亚北部)
  • 美国东部(俄亥俄州)
  • 美国西部(俄勒冈)
  • 美国西部(加利福尼亚北部)
  • 欧盟(爱尔兰)
  • 欧盟(伦敦)
  • 亚太地区(悉尼)

如果调用 Textract API 的 Lambda 函数超时,可能是由于 Textract API 调用时间长于 Lambda 函数超时。在这种情况下,您可以使用异步 Textract API StartDocumentTextDetection- 您的 Lambda 函数可以启动后台进程,并且您可以在作业完成时通过 SNS 收到通知。

https://docs.aws.amazon.com/textract/latest/dg/API_StartDocumentTextDetection.html

于 2020-01-15T03:11:14.843 回答