当前位置: 首页 > 知识库问答 >
问题:

如何修复对AWS Java SDK DynamoDB的调用,从而导致ExpiredTokenException?

司寇高洁
2023-03-14

我有一个长期运行的AWSJavaSDKDynamoDB应用程序,当我启动它时,它的行为正常。但是,在几个小时后(大约12小时),我开始一遍又一遍地接收相同的Exception,并对DynamoDB API进行任何调用。如果我重新启动服务器,Exception会消失...只是稍后再次出现。

确切的ExpiredTokenException错误文本是:
请求中包含的安全令牌已过期(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ExpiredTokenException;请求ID:DEMTN0Q5BPH5IQD9TUQMNO5SFVV4KQNSO5AEMVJF66Q9ASUAAJG)

共有1个答案

魏臻
2023-03-14

摘要:
将AWSCredentialsProvider(与AWSCredentials相反)的实例传递给AmazondynamodClient的构造函数,因为这样可以自动刷新过期的AWSCredentials(如果特定的AWSCredentialsProvider实现了刷新功能…所有标准AWS提供的都是这样)。

详细信息:
要解决AWSJavaSDKDynamoDB相关的ExpiredTokenException,该ExpiredTokenException以前缀“请求中包含的安全令牌已过期(服务:Amazon DynamoDBv2;状态代码:400;错误代码:ExpiredTokenException;请求ID:...”开头,您必须更改代码以向Amazon DynamoDBClient的构造函数提供AWSCreentialsProvider的实例(并停止使用AWSCreentials的实例-即没有“Provider”后缀)。通过将Amazon DynamoDBClient的构造函数交给AWSCreentialsProvider的实例,您使其能够在AWSCreentials过期时“自动刷新凭据”(我在这个需要帐户才能访问的AWS论坛线程中找到了这一点)。

为了在代码中提供一个明确的示例,下面是代码产生过期TokenException的泛化:

AWSCredentialsProvider aWSCredentialsProvider =
  new SystemPropertiesCredentialsProvider();
    //the above line may be substituted for any valid
    //*Provider implementation
AWSCredentials aWSCredentials =
  aWSCredentialsProvider.getCredentials();
AmazonDynamoDBClient amazonDynamoDBClient =
  new AmazonDynamoDBClient(aWSCredentials);
...
amazonDynamoDBClient.listTables();
  //the above line is where the ExpiredTokenException is eventually thrown

下面是消除过期TokenException的代码概括:

AWSCredentialsProvider aWSCredentialsProvider =
  new SystemPropertiesCredentialsProvider();
    //substitute the above line for any valid *Provider implementation
AmazonDynamoDBClient amazonDynamoDBClient =
  new AmazonDynamoDBClient(aWSCredentialsProvider);
    //the above line is now passing an instance of AWSCredentialsProvider
    //as opposed to AWSCredentials
...
amazonDynamoDBClient.listTables();
  //the above line is now enabled, via the AWSCredentialsProvider, to 
  //automatically refresh the AWSCredentials if/when they have expired

考虑到我对AWS Java SDK Javadocs及其提供的示例(我自己的大部分代码都基于这些示例)的了解程度,我一次也没有注意到这种细微差别。因此,我为那些在我之后的人提供了非常详细的答案(很可能包括我自己,哈哈)。

 类似资料:
  • 目前在欧洲,时区已更改,现在又多了一个小时。出于某种原因,这破坏了我的脚本,我无法连接到我的mysql数据库。 我尝试重启,停止和启动mysql服务器,甚至重启eclipse。这些都没用。 这在时间改变之前有效,现在我得到了这个错误 java.sql.SQLException:服务器时区值“CEST”无法识别或代表多个时区。如果要使用时区支持,您必须配置服务器或JDBC驱动程序(通过serverT

  • 环境: Python 3.7 Windows 10 64位 问题: 下面这段代码过去工作没有问题。我不得不移动我的Py魅力项目的文件夹,现在我得到了这个错误消息:“TypeError:'str'对象不可调用”。 守则: 错误输出: 我尝试的是: 我在一个空白的python文档中隔离了这段代码。我想确保这个问题没有连接到其他地方的代码。当我执行这段独立的代码时,我得到了同样的问题。 我在这里看到了关

  • 我有一个带有ProgressBar的活动。这个栏用于显示游戏关卡上经过的时间。 我正在更新这个栏和一个带有倒数计时器的文本视图,每100ms调用一次。问题是,每次我调用 setProgress 时,它似乎都会导致一个无效的 (),使我的整个 UI 被重绘。如果我删除进度条更新的行,一切正常,甚至为文本视图设置文本显示剩余时间。 这对我来说是一个问题,因为我还有一个自定义视图,它只需要在我需要的时候

  • 无法使字段private final java.lang.String java.io.file.path可访问:module java.base不会“打开java.io”到未命名的module@6109445c 尝试: 使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。使用--scan运行以获得完整的见解。 null 有人能帮我吗!!

  • 我写了一个小的实用程序: 但是,当我从shell调用它时,PATH最终不会改变。 如果我理解正确,那么在父进程中没有设置变量。 如何做到这一点?