如何在AWS Fargate上自动传递Selenium Grid Hub私有IP至节点
AWS Fargate部署Selenium Grid自动传递Hub私有IP方案(无负载均衡)
给你几个实用的方案,不用负载均衡也能自动搞定Hub私有IP的传递:
方案1:ECS服务发现+容器启动脚本(最优推荐)
这个是ECS原生支持的方案,可靠性高,还能自动适配Hub任务重启后的IP变化:
- 把Hub部署成ECS服务,开启服务发现:先在Cloud Map创建一个私有命名空间(比如
selenium.local),然后配置Hub服务注册到这个命名空间,服务名设为hub(最终域名就是hub.selenium.local) - 修改Node的任务定义:
- 替换Node容器的启动命令,用脚本先解析Hub的IP再启动节点。比如原来的启动命令是
java -jar selenium-server.jar node,改成:#!/bin/bash # 解析服务发现域名对应的Hub私有IP HUB_IP=$(nslookup hub.selenium.local | grep 'Address:' | grep -v '127.0.0.1' | awk '{print $2}') # 注入环境变量启动节点 SE_EVENT_BUS_HOST=$HUB_IP java -jar selenium-server.jar node - 确保Node容器的镜像包含
nslookup工具(如果用selenium官方镜像,可能需要先装dnsutils包,比如在Dockerfile里加RUN apt-get update && apt-get install -y dnsutils)
- 替换Node容器的启动命令,用脚本先解析Hub的IP再启动节点。比如原来的启动命令是
方案2:SSM参数存储中转IP
适合Hub是单实例的场景,通过SSM参数共享IP:
- 在AWS Systems Manager参数商店里创建一个字符串类型的参数,比如
/selenium/hub/private-ip - 修改Hub的任务定义,添加启动脚本:启动Hub前先获取自身私有IP,写入SSM参数:
#!/bin/bash # 通过ECS元数据API获取自身私有IP HUB_IP=$(curl -s http://169.254.170.2/v2/metadata | jq -r '.Containers[0].Networks[0].IPv4Addresses[0]') # 写入SSM参数(覆盖旧值) aws ssm put-parameter --name "/selenium/hub/private-ip" --value "$HUB_IP" --type String --overwrite # 启动Hub服务 java -jar selenium-server.jar hub - 给Hub的任务执行角色添加
ssm:PutParameter权限 - 修改Node的任务定义,启动脚本从SSM读取IP再启动:
#!/bin/bash # 读取SSM里的Hub私有IP HUB_IP=$(aws ssm get-parameter --name "/selenium/hub/private-ip" --query 'Parameter.Value' --output text) # 启动节点 SE_EVENT_BUS_HOST=$HUB_IP java -jar selenium-server.jar node - 给Node的任务执行角色添加
ssm:GetParameter权限
方案3:ECS API查询Hub任务IP
适合Hub是单任务的场景,直接通过AWS CLI查询任务IP:
- 修改Node的任务定义,启动脚本用AWS CLI查询Hub任务的私有IP:
#!/bin/bash # 获取Hub任务的ARN(替换成你的集群名和Hub任务家族名) HUB_TASK_ARN=$(aws ecs list-tasks --cluster your-ecs-cluster --family selenium-hub --query 'taskArns[0]' --output text) # 查询Hub任务的私有IP HUB_IP=$(aws ecs describe-tasks --cluster your-ecs-cluster --tasks $HUB_TASK_ARN --query 'tasks[0].containers[0].networkInterfaces[0].privateIpv4Address' --output text) # 启动节点 SE_EVENT_BUS_HOST=$HUB_IP java -jar selenium-server.jar node - 给Node的任务执行角色添加
ecs:ListTasks和ecs:DescribeTasks权限
方案对比
- 优先选方案1:服务发现是ECS原生能力,不用额外权限配置,能自动处理Hub的扩容、重启,稳定性最高
- 如果Hub是固定单实例,方案2或3也能凑合用,但需要额外的IAM权限配置,且Hub重启后需要等待参数更新
内容的提问来源于stack exchange,提问作者isuranger
相关产品推荐
相关产品推荐

