如何获取Jenkins构建创建的ECS Fargate容器公网IP并输出到控制台
ECS Fargate公网IP查询+Jenkins控制台输出方案
前置要求
- Jenkins运行节点(或构建Agent)已提前安装AWS CLI
- Jenkins使用的AWS访问身份(IAM角色/访问密钥)具备以下权限:
ecs:ListTasksecs:DescribeTasksec2:DescribeNetworkInterfaces
- Fargate任务已开启公网IP分配,且部署在公有子网下
公网IP查询命令
无jq依赖版本(直接使用AWS CLI内置query参数)
将命令中的你的ECS集群名、你的AWS区域、你的ECS服务名替换为实际值即可直接运行:
export AWS_DEFAULT_REGION=你的AWS区域 ECS_CLUSTER_NAME="你的ECS集群名" ECS_SERVICE_NAME="你的ECS服务名" aws ecs describe-tasks --cluster $ECS_CLUSTER_NAME \ --tasks $(aws ecs list-tasks --cluster $ECS_CLUSTER_NAME --service-name $ECS_SERVICE_NAME --desired-status RUNNING --query 'taskArns[*]' --output text) \ --query 'tasks[*].attachments[*].details[?name==`networkInterfaceId`].value' --output text \ | xargs aws ec2 describe-network-interfaces --network-interface-ids \ --query 'NetworkInterfaces[*].Association.PublicIp' --output text
依赖jq的简化版本
如果运行环境已安装jq工具,可以使用以下更易维护的命令:
export AWS_DEFAULT_REGION=你的AWS区域 ECS_CLUSTER_NAME="你的ECS集群名" ECS_SERVICE_NAME="你的ECS服务名" aws ecs list-tasks --cluster $ECS_CLUSTER_NAME --service-name $ECS_SERVICE_NAME --desired-status RUNNING \ | jq -r '.taskArns[]' \ | xargs aws ecs describe-tasks --cluster $ECS_CLUSTER_NAME --tasks \ | jq -r '.tasks[].attachments[].details[] | select(.name=="networkInterfaceId") | .value' \ | xargs aws ec2 describe-network-interfaces --network-interface-ids \ | jq -r '.NetworkInterfaces[].Association.PublicIp'
集成到Jenkins流水线输出
Declarative Pipeline 示例
直接在你的现有部署ECS的阶段后,新增以下阶段即可:
pipeline { agent any environment { ECS_CLUSTER_NAME = "替换为你的集群名" ECS_SERVICE_NAME = "替换为你的服务名" AWS_DEFAULT_REGION = "替换为你的AWS区域" // AWS凭证建议存储在Jenkins凭证管理器,此处引用对应凭证ID即可 AWS_ACCESS_KEY_ID = credentials('aws-access-key-id') AWS_SECRET_ACCESS_KEY = credentials('aws-secret-access-key') } stages { // 你原有构建、推送镜像、部署ECS的阶段此处省略 stage('部署后等待初始化') { steps { // 等待30秒确保Fargate任务完成启动、分配公网IP sleep 30 } } stage('输出Fargate公网IP') { steps { sh ''' echo "==================== 本次部署服务公网IP ====================" aws ecs describe-tasks --cluster $ECS_CLUSTER_NAME \ --tasks $(aws ecs list-tasks --cluster $ECS_CLUSTER_NAME --service-name $ECS_SERVICE_NAME --desired-status RUNNING --query 'taskArns[*]' --output text) \ --query 'tasks[*].attachments[*].details[?name==`networkInterfaceId`].value' --output text \ | xargs aws ec2 describe-network-interfaces --network-interface-ids \ --query 'NetworkInterfaces[*].Association.PublicIp' --output text echo "===========================================================" ''' } } } }
自由风格项目配置
直接在构建步骤的「执行shell」模块,追加上述查询命令即可,执行后的IP会直接打印在Jenkins构建控制台中。
注意事项
- 若服务配置了多副本,上述命令会输出所有运行中任务的公网IP
- 若查询结果为空,优先检查任务是否开启公网IP分配、所在子网是否为公有子网、任务是否已完全启动
- 等待时间可根据你的服务启动速度自行调整,避免任务未初始化完成导致查询无结果
内容的提问来源于stack exchange,提问作者Siri
相关产品推荐
相关产品推荐

