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

如何通过Lambda函数注销NLB旧IP并更新为EMR新主节点IP

实现方案

前置准备

提前确认你已经拿到以下资源的标识:

  • 待更新的NLB目标组ARN
  • 目标EMR集群的ID(如果有多个同类型集群,可提前加标签用于筛选)

步骤1:配置Lambda执行角色的IAM权限

创建Lambda执行角色,附加以下两类权限:

  1. AWS托管策略AWSLambdaBasicExecutionRole:用于Lambda输出运行日志到CloudWatch
  2. 自定义权限策略,示例如下:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "emr:ListInstances",
                "elasticloadbalancing:RegisterTargets",
                "elasticloadbalancing:DeregisterTargets",
                "elasticloadbalancing:DescribeTargetHealth"
            ],
            "Resource": "*"
        }
    ]
}

你也可以按照最小权限原则,把Resource限制为你的具体EMR集群和NLB目标组的ARN。

步骤2:编写Lambda函数代码

选择Python 3.9+运行环境,使用以下示例代码,替换代码开头的两个变量为你自己的资源值:

import boto3

# 替换为你的实际资源值
TARGET_GROUP_ARN = "arn:aws:elasticloadbalancing:region:account-id:targetgroup/your-target-group/xxx"
EMR_CLUSTER_ID = "j-xxxxxx"

emr_client = boto3.client('emr')
elbv2_client = boto3.client('elbv2')

def lambda_handler(event, context):
    # 1. 获取当前EMR集群主节点的私有IP
    master_instances = emr_client.list_instances(
        ClusterId=EMR_CLUSTER_ID,
        InstanceGroupTypes=['MASTER'],
        InstanceStates=['RUNNING']
    )['Instances']
    if not master_instances:
        print("无运行中的主节点,跳过更新")
        return
    new_master_ip = master_instances[0]['PrivateIpAddress']
    
    # 2. 获取NLB目标组当前注册的IP
    current_targets = elbv2_client.describe_target_health(TargetGroupArn=TARGET_GROUP_ARN)['TargetHealthDescriptions']
    current_ips = [t['Target']['Id'] for t in current_targets]
    
    # 3. IP一致则跳过更新
    if new_master_ip in current_ips and len(current_ips) == 1:
        print(f"目标组IP与主节点IP一致:{new_master_ip},无需更新")
        return
    
    # 4. 注销旧IP,注册新IP
    if current_ips:
        elbv2_client.deregister_targets(
            TargetGroupArn=TARGET_GROUP_ARN,
            Targets=[{'Id': ip} for ip in current_ips]
        )
        print(f"已注销旧IP:{current_ips}")
    
    elbv2_client.register_targets(
        TargetGroupArn=TARGET_GROUP_ARN,
        Targets=[{'Id': new_master_ip, 'Port': 80}] # 替换为你实际的服务端口
    )
    print(f"已注册新主节点IP:{new_master_ip}")

注意替换代码里的Port为你EMR主节点上对外提供服务的实际端口。

步骤3:配置EventBridge定时触发规则

  1. 打开EventBridge控制台,进入「规则」页面,选择对应区域后点击「创建规则」
  2. 规则类型选择「定时规则」,调度模式选择「cron表达式」,填入*/5 * * * ? *,代表每5分钟触发一次
  3. 目标类型选择「Lambda函数」,选中你刚才创建的Lambda函数,保存规则即可

步骤4:验证功能

  • 可先手动触发Lambda运行,查看CloudWatch日志确认没有报错,NLB目标组IP已更新为当前主节点IP
  • 重建EMR集群后等待最多5分钟,确认目标组IP会自动更新为新的主节点IP

可选优化:如果不需要严格5分钟轮询,建议改为监听EMR集群状态变更事件触发Lambda:在EventBridge中创建规则,匹配事件源为aws.emr,事件类型为EMR Cluster State Change,当集群状态变为RUNNING时再触发Lambda,更新延迟更低,也减少不必要的Lambda调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 06:45:09