AWS:Lambda 通过 Python boto3 客户端提交批处理作业,但在收到响应之前超时

Jam*_*ams 3 python amazon-web-services aws-lambda aws-batch

我有一个 Lambda 函数,它有一个 Python 处理程序,可通过客户端向 AWS Batch 提交作业boto3

client = boto3.client('batch', 'us-east-1')

def handle_load(event, context):

    hasher = hashlib.sha1()
    hasher.update(str(time.time()).encode())
    job_name = f"job-{hasher.hexdigest()[:10]}"
    job_queue = os.environ.get("job_queue")
    job_definition = os.environ.get("job_definition")

    logger.info(f"Submitting job named '{job_name}' to queue '{job_queue}' "
                f"with definition '{job_definition}'")

    response = client.submit_job(
        jobName=job_name,
        jobQueue=job_queue,
        jobDefinition=job_definition,
    )

    logger.info(f"Submission successful, job ID: {response['jobId']}")
Run Code Online (Sandbox Code Playgroud)

我可以看到此 Lambda 函数在 CloudWatch 日志中提交批处理作业,但在响应返回之前它总是超时。我从来没有看到这些作业出现在队列中,所以我不确定它们提交后会去哪里,似乎 Lambda 总是在响应返回之前超时,我没有什么可继续的。

我已使用 Lambda 的 Python 代码中使用的相同队列和定义 ARN,通过 AWS CLI 成功将作业添加到队列中。该作业可以在可运行选项卡下的队列中看到(大概该作业将在不久的将来的某个时刻启动)。

使用 AWS CLI 提交的作业会立即返回,因此 Lambda 配置中一定存在问题,导致作业无法提交。也许我没有为提交作业的 Lambda 使用正确的角色,或者有一些其他权限错误导致超时?Lambda 有权对batch:SubmitJob所有资源执行允许的操作。

Joh*_*ein 6

如果 AWS Lambda 函数连接到 VPC,则默认情况下它会连接到 Internet。这意味着它可以调用驻留在互联网上的AWS API函数。

如果您的 Lambda 函数配置为使用 VPC,则默认情况下它将无法访问 Internet。这对于连接到 VPC 中的其他资源很有用,但如果您希望与 AWS 服务通信,您可以:

  • 公有子网中的NAT 网关,其中 Lambda 函数连接到具有指向 NAT 网关的路由表规则的私有子网,或者
  • 连接到所需服务的VPC 终端节点。不幸的是,AWS Batch 没有 VPC 终端节点。

因此,如果您的 Lambda 函数不需要连接到 VPC 中的其他资源,您可以断开连接,它应该可以工作。否则,请使用NAT 网关