如何实现Azure DevOps微软托管代理池与封禁公网IP的AWS NSG连通?
解决Azure Pipeline(Microsoft-hosted Agent)连接AWS EC2的网络连通问题
核心问题分析
你之前的方案无效的原因:
- Azure DevOps与AWS的服务连接:仅用于授权Pipeline调用AWS API,无法直接打通SSH的网络路径,对NSG的公网封禁规则无影响。
- Azure公网IP范围:你下载的是全Azure云的IP段,但Microsoft-hosted Agent属于Azure Compute服务的实例,且会根据你指定的Agent区域动态分配IP。如果未筛选对应区域的Compute服务IP段,或者规则优先级低于
0.0.0.0/0的封禁规则,就无法生效。
有效解决方案
方案1:精准添加对应区域的Azure Compute IP段到NSG
- 确定你的Pipeline使用的Microsoft-hosted Agent区域(在YAML中由
pool的vmImage隐含,比如ubuntu-latest默认对应美国东部,可通过指定location或选择带区域后缀的镜像明确,如ubuntu-22.04-westus)。 - 从Azure IP范围文件中筛选对应区域的
Compute服务IP段:- 打开IP范围JSON文件,找到对应区域的条目,提取
addressPrefixes中属于Compute服务的IP段。
- 打开IP范围JSON文件,找到对应区域的条目,提取
- 在AWS NSG中添加入站规则:
- 优先级设为高于封禁
0.0.0.0/0的规则(比如默认封禁规则优先级是100,你设为90)。 - 允许端口22(SSH),源地址为筛选出的Azure Compute IP段。
- 优先级设为高于封禁
方案2:动态获取Agent IP并临时更新NSG(推荐)
这种方法适配Microsoft-hosted Agent IP不固定的特性,步骤如下:
- 在Pipeline YAML中添加前置脚本,获取当前Agent的公网IP:
或PowerShell(Windows Agent):# Linux Agent AGENT_IP=$(curl -s ifconfig.me) echo "##vso[task.setvariable variable=AGENT_IP]$AGENT_IP"$AGENT_IP = Invoke-RestMethod ifconfig.me Write-Host "##vso[task.setvariable variable=AGENT_IP]$AGENT_IP" - 使用AWS CLI(需提前配置AWS服务连接)添加临时NSG规则:
aws ec2 authorize-security-group-ingress \ --group-id <你的NSG ID> \ --protocol tcp \ --port 22 \ --cidr $AGENT_IP/32 \ --description "Temporary Azure DevOps Agent SSH Access" - 执行你的
SSH@0任务。 - 添加后置脚本,删除临时NSG规则:
aws ec2 revoke-security-group-ingress \ --group-id <你的NSG ID> \ --protocol tcp \ --port 22 \ --cidr $AGENT_IP/32
方案3:改用AWS SSM Session Manager替代SSH
完全避开公网SSH端口,更安全:
- 确保EC2实例已安装SSM Agent,且实例角色拥有
AmazonSSMManagedInstanceCore权限。 - 在Pipeline中使用AWS CLI执行SSM命令,替代SSH任务:
如需交互式操作,也可使用aws ssm send-command \ --instance-ids <你的EC2实例ID> \ --document-name "AWS-RunShellScript" \ --parameters commands="<你要执行的Shell命令>"aws ssm start-session(需Pipeline Agent安装SSM Session Manager插件)。
内容的提问来源于stack exchange,提问作者Pandurang Vadane
相关产品推荐
相关产品推荐

