AWS Managed Airflow - 如何解决触发长时间运行的 lambda 时出现 350 秒超时的问题

And*_*amm 5 network-programming amazon-web-services aws-lambda airflow

当前使用 AWS lambda hook 调用 lambda 时

https://airflow.apache.org/docs/stable/_api/airflow/contrib/hooks/aws_lambda_hook/index.html

如果 lambda 运行超过 350 秒,则会失败。即使在 350 秒后,任务本身仍显示其正在运行大约一个小时,然后给出默认的 Airflow 超时错误。

我非常怀疑该问题与私有子网发生的 AWS NAT 传出连接空闲超时限制有关

https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-troubleshooting.html#nat-gateway-troubleshooting-timeout

如何从客户端或网络端解决这个问题?

我的想法是

异步 lambda 执行并在执行完成后传递某些事件或触发侦听器以继续下一个任务。当然,这并不理想,因为我无法轻松地从 Airflow 端检查日志 在公共子网中设置自己管理的 Airflow 此设置是最不受欢迎的,因为它不安全且复杂

当前代码:

lambda_hook:AwsLambdaHook = AwsLambdaHook(function_name=function_name,region_name=region,log_type =“Tail”,invoice_type =“RequestResponse”,config = config,aws_conn_id =连接)res = lambda_hook.invoke_lambda(payload = json.dumps(payload))

能够正确触发 lambda 绝对是该服务的一个重要功能!

编辑者:anamm 于 2020 年 12 月 3 日 3:25 AM

小智 1

有一些解决方法可以用来缓解这种情况。我推荐的第一个也是最简单的方法是将 Lambda 函数的调用更改为异步,因为 Lambda 会立即将响应发送回 MWAA。通过异步调用,事件将被传递给 Lambda,而无需等待函数代码的响应。这将避免超时错误。对于异步调用,请将 dag 代码中的“invoice_type”更改为“Event”。

另一种选择是配置您自己的负载均衡器并从 DAG 向其发送请求。您可以在此处配置侦听器规则以将请求转发到 Lambda 函数以调用它。请注意,您需要确保相应地设置负载均衡器连接空闲超时,否则可能会断开与 Lambda ENI 的连接。详细步骤:

  1. 使用您要运行的代码创建 lambda 函数。将函数超时配置更改为 15 分钟。
  2. 通过导航到 EC2--> 目标组 --> 创建目标组 --> 选择目标类型作为 Lambda 函数 --> 提供名称 --> (无需启用运行状况检查) --> 下一步 - 创建目标组-> 从下拉列表中选择上面创建的函数名称--> 点击创建目标组
  3. 通过导航到 EC2 创建负载均衡器 --> 负载均衡器 --> 创建负载均衡器 --> 创建应用程序负载均衡器 --> 方案为面向互联网 --> 选择与 MWAA 相同的 VPC --> 提供 2 个公共子网在“映射”下 --> 在“侦听器和路由”下,选择协议为 HTTP,端口 80,然后选择创建的目标组 --> 点击“创建负载均衡器”
  4. 创建负载均衡器后,选择负载均衡器 --> 操作 --> 编辑负载均衡器属性 --> 将空闲超时设置为 900 秒 --> 点击保存更改
  5. 上传提供 dag 脚本(确保您已将 ALB DNS 更改为 ALB DNS,该 DNS 可以位于负载均衡器的详细信息选项卡下,字段为“DNS 名称”)
  6. 在airflow webui中运行dag脚本并进一步观察。