如何通过Lambda函数注销NLB旧IP并更新为EMR新主节点IP
实现方案
前置准备
提前确认你已经拿到以下资源的标识:
- 待更新的NLB目标组ARN
- 目标EMR集群的ID(如果有多个同类型集群,可提前加标签用于筛选)
步骤1:配置Lambda执行角色的IAM权限
创建Lambda执行角色,附加以下两类权限:
- AWS托管策略
AWSLambdaBasicExecutionRole:用于Lambda输出运行日志到CloudWatch - 自定义权限策略,示例如下:
{ "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定时触发规则
- 打开EventBridge控制台,进入「规则」页面,选择对应区域后点击「创建规则」
- 规则类型选择「定时规则」,调度模式选择「cron表达式」,填入
*/5 * * * ? *,代表每5分钟触发一次 - 目标类型选择「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
相关产品推荐
相关产品推荐

