You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将NAT-Instance纳入自动扩缩容组?解决其故障恢复后的源/目标检查问题

解决NAT实例自动扩缩容后源/目标检查未自动禁用的问题

这个问题我之前帮团队处理过,核心就是Auto Scaling Group(ASG)启动新NAT实例时,没有自动执行禁用源/目标检查的操作,导致实例无法正常转发流量,私有子网出现"Black-hole"状态。下面给你几个实用的解决方案:

方案1:用Launch Template用户数据自动配置(最快实现)

这是最直接的方法,利用实例启动时的用户数据脚本,自动关闭源/目标检查:

  1. 给NAT实例的IAM角色添加权限:确保实例拥有修改自身属性的权限,在IAM角色中添加以下策略(建议限定资源范围,提升安全性):

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "ec2:ModifyInstanceAttribute",
                "Resource": "arn:aws:ec2:你的区域:你的账号ID:instance/*"
            }
        ]
    }
    
  2. 修改Launch Template的用户数据:在Launch Template的"高级详情"里,添加以下脚本:

    #!/bin/bash
    # 获取当前实例ID
    INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
    # 禁用源/目标检查
    aws ec2 modify-instance-attribute --instance-id $INSTANCE_ID --no-source-dest-check
    

    注意:Amazon Linux 2/2023默认预装AWS CLI,如果你用的是其他操作系统,需要在脚本里先安装AWS CLI(比如yum install -y aws-cli或者apt install -y awscli)。

方案2:用Auto Scaling生命周期钩子+Lambda实现(更灵活)

如果需要在实例启动时执行更多初始化操作(比如绑定弹性IP、更新路由表等),可以用生命周期钩子结合Lambda:

  • 添加生命周期钩子:给你的NAT实例ASG添加一个EC2_INSTANCE_LAUNCHING阶段的钩子,设置合理的超时时间(比如300秒),让ASG在实例启动后暂停,等待Lambda处理。
  • 编写Lambda函数:函数逻辑大概是:
    1. 解析ASG发送的生命周期事件,提取新实例的ID。
    2. 调用ec2:ModifyInstanceAttribute API禁用源/目标检查。
    3. (可选)给实例绑定预留的弹性IP。
    4. 向ASG发送"继续"信号,让实例加入ASG正常运行。
  • 配置Lambda权限:给Lambda函数添加足够的IAM权限,允许它读取ASG事件、修改EC2实例属性、管理弹性IP,以及发送生命周期钩子信号。

额外注意点

  • 源/目标检查是实例级属性,无法通过自定义镜像预先配置,必须在实例启动后修改。
  • 私有子网显示"Black-hole"是因为NAT实例无法转发流量,解决源/目标检查后,路由表会自动识别新实例,子网状态也会恢复正常。
  • 确保你的NAT实例ASG配置了正确的子网和安全组,实例能正常访问AWS API(用户数据脚本需要调用AWS CLI)。

内容的提问来源于stack exchange,提问作者amazon tam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:41:24