You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Scala编程获取IAM Role信息,代码无响应无报错如何解决?

根因排查
  • 版本冲突:代码同时引入了AWS SDK for Java 1.x(com.amazonaws开头依赖)和2.x(software.amazon.awssdk开头依赖)的IAM相关包,两个版本的客户端类加载、资源调度逻辑不兼容,会导致调用时无响应阻塞。你其他AWS服务调用正常,大概率是这些服务的依赖没有出现跨版本混用的情况。
  • 无超时配置:AWS SDK v1的IAM客户端默认未配置请求超时、套接字超时参数,当网络链路存在问题时,客户端会无限等待连接,不会抛出异常,因此CloudWatch没有报错日志。
  • 网络连通异常:如果运行环境在VPC内部,没有配置IAM服务的VPC端点、也没有公网出口,或者安全组/网络ACL限制了到IAM服务443端口的出站访问,也会导致调用无限阻塞。
修复方案
  1. 首先统一SDK版本,推荐直接迁移到2.x版本,移除所有1.x的IAM相关依赖,调整后的代码如下,新增了显式超时配置,避免出现无限阻塞的情况:
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.iam.IamClient
import software.amazon.awssdk.services.iam.model.GetRoleRequest
import java.time.Duration

// 构建带超时配置的IAM客户端
val iamClient = IamClient.builder()
  .region(Region.of("eu-central-1"))
  .overrideConfiguration(conf => {
    // 单请求总超时10秒
    conf.apiCallTimeout(Duration.ofSeconds(10))
    // 单次重试请求超时5秒
    conf.apiCallAttemptTimeout(Duration.ofSeconds(5))
  })
  .build()

// 使用Builder模式构造查询请求
val getRoleReq = GetRoleRequest.builder()
  .roleName("InfrastructureStack-StandardRoleD-HBLE12VPTWQ")
  .build()

val roleResp = iamClient.getRole(getRoleReq)
println(s"查询到的角色ARN为:${roleResp.role().arn()}")
  1. 验证网络连通性:
    • VPC内部运行的场景:检查是否已创建IAM服务的VPC端点,安全组是否放行了到IAM服务的443端口出站请求
    • 公网运行的场景:确认运行环境有公网访问能力,没有代理限制阻断IAM服务的访问
  2. 验证执行权限:确保代码运行时使用的身份(Lambda执行角色、EC2实例角色等)拥有iam:GetRole的操作权限,参考权限策略如下:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:GetRole",
      "Resource": "arn:aws:iam::*:role/InfrastructureStack-StandardRoleD-HBLE12VPTWQ"
    }
  ]
}

做完上述调整后如果调用出错会直接抛出明确的异常信息,可根据异常内容进一步定位问题。

内容的提问来源于stack exchange,提问作者Kevin Olomu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:06:03