You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

EC2实例内访问AWS CodeArtifact遇阻:令牌获取超时且依赖拉取失败的问题求助

EC2实例内访问AWS CodeArtifact遇阻:令牌获取超时且依赖拉取失败的问题求助

看起来你在AWS上搭建全栈项目的过程中碰到了挺头疼的问题——EC2里跑aws codeartifact get-authorization-token超时,本地却完全正常,而且就算settings.xml配置对了,Maven也拉不到CodeArtifact里的依赖。结合你给出的信息,我来帮你梳理几个优先级高的排查方向:

一、先从VPC网络层面挖根因(超时问题大概率出在这)

虽然你的EC2安全组已经开了全量出站权限,但VPC层面还有几个容易踩的坑:

  • 子网类型与NAT网关/公网IP:先确认你的EC2是在公网子网还是私有子网?如果是私有子网,得检查NAT网关是不是正常运行(有没有绑定公网IP、状态是不是available);如果是公网子网,要确认EC2有没有分配到公网IP或者弹性IP,没公网IP的话就算安全组开了也走不了公网。
  • VPC DNS配置:VPC的enableDnsSupportenableDnsHostnames这两个参数必须设为true,不然EC2没法正常解析AWS服务的域名(比如CodeArtifact的区域端点)。你可以在AWS控制台的VPC详情里查这两个配置。
  • 网络ACL限制:网络ACL是VPC的无状态防火墙,和安全组的状态化规则不一样。就算安全组开了全出站,要是网络ACL的出站规则没允许443端口(CodeArtifact用HTTPS),请求照样发不出去。检查下EC2所在子网的网络ACL,出站规则要允许0.0.0.0/0::/0的443端口。
  • CodeArtifact区域一致性:确认EC2所在的AWS区域,和你的CodeArtifact仓库所在区域完全一致!AWS服务都是区域级的,跨区域访问不仅慢,还可能因为网络路由问题超时。

二、再排查AWS权限与CLI配置

本地能拿到令牌不代表EC2的权限没问题,毕竟本地用的是你的个人账号凭证,EC2可能用的是实例角色:

  • EC2实例角色权限:如果EC2是通过IAM实例角色获取AWS权限,得给这个角色附加包含以下权限的政策:
    • codeartifact:GetAuthorizationToken
    • codeartifact:ReadFromRepository
    • 必要的话加上codeartifact:ListRepositories这类只读权限
      别漏了,就算网络通了,权限不够也会出问题(不过权限不足一般是报错而非超时,但还是得确认)。
  • AWS CLI版本兼容性:老版本的AWS CLI可能和新的CodeArtifact API有兼容性问题。在EC2上跑个aws --version看看版本,要是低于2.x,赶紧更到最新版:
    • Amazon Linux系统:sudo yum update aws-cli -y
    • 其他系统可以用pip install --upgrade awscli
  • CLI默认区域配置:EC2上的AWS CLI默认区域是不是和CodeArtifact一致?可以跑aws configure get region看看,不一致的话要么在命令里加--region <你的区域>参数,要么用aws configure改默认区域。

三、Maven settings.xml的细节校验

你说settings.xml配置正确,但还是要抠几个关键细节:

  • Repository ID匹配:settings.xml里<server>标签的id,必须和pom.xml里引用CodeArtifact仓库的id完全一致,不然Maven没法关联到正确的凭证。
  • 令牌注入是否正确:你是把令牌硬编码到settings.xml,还是用脚本动态注入?如果是动态注入,要确保获取令牌的命令在EC2上能正确输出令牌内容(先单独跑命令测试,别直接套进Maven)。
  • CodeArtifact仓库端点正确性:检查settings.xml里的仓库URL是不是正确的格式:https://<域名>-<账号ID>.d.codeartifact.<区域>.amazonaws.com/maven/<仓库名>/,别打错字符或者漏了区域。

四、终极排查:抓包验证网络交互

如果上面的都排查完还是超时,就用tcpdump抓包看真实的网络情况:
在EC2上跑:

tcpdump host codeartifact.<你的区域>.amazonaws.com -v

然后在另一个终端跑获取令牌的命令,看有没有数据包发送和接收的记录:

  • 如果完全没数据包,说明请求根本没发出去,大概率是VPC网络ACL或者路由表的问题;
  • 要是发了包但没收到响应,可能是公网出口的问题(比如NAT网关故障);
  • 要是有响应但Maven还是拉不到依赖,再回头查权限和settings.xml。

你可以先从VPC DNS和子网类型这两个点开始查,这是EC2访问AWS服务最常见的超时诱因。如果有更多细节(比如EC2所在子网类型、实例角色的政策内容),补充出来能更快定位问题!

备注:内容来源于stack exchange,提问作者Alfredo Marin

火山引擎 最新活动