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

CloudFormation更新EC2实例时保留EIP失败问题求助

解决方案:保留EIP重建CloudFormation栈中的EC2实例

问题根源

更新AMI触发EC2实例重建时,CloudFormation默认的「先创建后删除」流程会导致旧实例仍占用关联的ENI,新实例无法绑定同一个ENI,从而抛出InvalidNetworkInterface.InUse错误。

可行方案

1. 双网卡分离方案(匹配你的需求)

  • 配置两个独立ENI:
    • 私有ENI:绑定内网,随EC2实例生命周期销毁(不设置DeletionPolicy),用于内网通信
    • 公网ENI:绑定EIP,设置DeletionPolicy: Retain,独立于实例生命周期,用于公网访问
  • 实例更新流程:
    1. CloudFormation启动新EC2实例(仅关联私有ENI)
    2. 通过自定义Lambda资源或CloudFormation钩子,先解绑旧实例上的公网ENI
    3. 将公网ENI绑定到新实例
    4. 销毁旧实例和私有ENI
  • 注意事项:确保公网ENI与EC2实例处于同一可用区,否则无法绑定

2. EIP直接关联实例主网卡

  • 移除独立ENI资源,将EIP直接关联到EC2实例的主网卡
  • 给EIP资源设置DeletionPolicy: Retain,确保实例销毁后EIP不被释放
  • 更新时CloudFormation会自动处理:先释放旧实例的EIP,再关联到新实例,避免ENI冲突
  • 缺点:无法单独管理公网网卡,适合不需要拆分网络流量的场景

3. 强制先删后建更新策略

  • 在EC2实例资源中添加UpdatePolicy,强制CloudFormation先销毁旧实例再创建新实例:
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    UpdatePolicy:
      Replacement: true
    Properties:
      # 实例配置
  • 给ENI设置DependsOn: EC2Instance,确保旧实例销毁后ENI才会被重新绑定
  • 缺点:会有短暂服务中断,适合可接受停机的场景

4. 自定义Lambda资源处理ENI解绑

  • 编写Lambda函数,实现「解绑指定ENI」的逻辑
  • 在CloudFormation栈中定义自定义资源,关联该Lambda,设置在EC2实例更新前触发
  • 确保更新流程中先执行ENI解绑,再创建新实例,避免资源占用冲突
  • 优点:灵活性最高,缺点:需要维护Lambda代码,增加复杂度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:52:48