使用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端口的出站访问,也会导致调用无限阻塞。
修复方案
- 首先统一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()}")
- 验证网络连通性:
- VPC内部运行的场景:检查是否已创建IAM服务的VPC端点,安全组是否放行了到IAM服务的443端口出站请求
- 公网运行的场景:确认运行环境有公网访问能力,没有代理限制阻断IAM服务的访问
- 验证执行权限:确保代码运行时使用的身份(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
相关产品推荐
相关产品推荐

