【问题标题】:AWS Lambda hangs on completing lifecycle actionAWS Lambda 在完成生命周期操作时挂起
【发布时间】:2017-05-10 22:18:36
【问题描述】:

我使用 aws lambda 在 Auto Scaling 终止实例时执行自定义操作。看起来是这样的

def scaledown_handler(event, context):
    # customs actions
    client = boto3.client('autoscaling')
    response = client.complete_lifecycle_action(LifecycleHookName=event['detail']['LifecycleHookName'],
                                     LifecycleActionToken=event['detail']['LifecycleActionToken'],
                                     AutoScalingGroupName=event['detail']['AutoScalingGroupName'],
                                     LifecycleActionResult='CONTINUE',
                                     InstanceId=event['detail']['EC2InstanceId'])

问题是该函数只是挂在client.complete_lifecycle_action() 上并在超时之前完成而没有任何响应,并且我的 ec2 实例总是“等待终止生命周期操作”。

aws autoscaling complete-lifecycle-action 在 aws CLI 中工作正常,但我需要从 AWS lambda 完成此操作。我怎样才能知道为什么complete_lifecycle_action() 挂起而没有响应?

【问题讨论】:

  • 您是否将 Lambda 函数放置在 VPC 中?
  • 是的,Lambda 与我的 ec2 实例在同一个 VPC 中。
  • 您真的需要它在 VPC 中吗?如果您的 VPC 中没有 NAT 网关,则 Lambda 函数将无法访问 VPC 之外的任何内容。 AWS API 存在于您的 VPC 之外,因此 Lambda 函数在尝试访问它时遇到网络超时。
  • “但据我所知,如果我没有为我的 Lambda 设置 VPC,它将在默认系统管理的 VPC 中安全运行”这是不正确的。就像我说的那样,如果您需要 VPC 访问权限,那么您必须将 NAT 网关添加到您的 VPC。

标签: python amazon-web-services amazon-ec2 aws-lambda


【解决方案1】:

如果您的 VPC 中没有 NAT 网关,则 Lambda 函数将无法访问 VPC 之外的任何内容。 AWS API 存在于您的 VPC 之外,因此 Lambda 函数在尝试访问它时遇到网络超时。

您必须将 NAT 网关添加到您的 VPC,以便 Lambda 函数(以及您的 VPC 中没有公共 IP 的其他东西)访问 VPC 之外的任何内容。

【讨论】:

    【解决方案2】:

    您需要使用 put_lifecycle_hook() API。 http://www.callumpember.com/auto-scaling-lifecycle-hooks/ 在此链接上,您可以获得完整的 python 脚本,用于在终止实例之前执行自定义操作。

    【讨论】:

    • 我已经通过 CLI 命令aws autoscaling put-lifecycle-hook创建了自动缩放生命周期钩子
    猜你喜欢
    • 2016-04-25
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多