【问题标题】:How do I cure a call to the AWS Java SDK DynamoDB resulting in an ExpiredTokenException?如何解决对导致 ExpiredTokenException 的 AWS Java 开发工具包 DynamoDB 的调用?
【发布时间】:2017-03-07 09:32:43
【问题描述】:

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

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

【问题讨论】:

    标签: java amazon-dynamodb aws-sdk


    【解决方案1】:

    总结:
    将AWSCredentialsProvider 的实例(与AWSCredentials 相对)传递给AmazonDynamoDBClient 的构造函数,因为这样可以自动刷新过期的AWSCredentials(如果特定的AWSCredentialsProvider 实现了刷新功能...... AWS 提供的所有标准案例)。

    详情:
    解决以前缀“请求中包含的安全令牌已过期(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ExpiredTokenException;请求 ID:... em>”,您必须更改代码以向AmazonDynamoDBClient 的构造函数提供AWSCredentialsProvider 的实例(并停止使用AWSCredentials 的实例 - 即没有“提供者”后缀)。通过传递@987654330 @ 的构造函数是AWSCredentialsProvider 的一个实例,如果/当AWSCredentials 过期时(我在这个AWS forum thread 中找到它需要一个帐户才能访问),你可以让它“自动刷新凭据”。

    为了在代码中提供一个明确的示例,下面是代码生成ExpiredTokenException 的概括:

    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
    

    这是消除ExpiredTokenException的代码的概括:

    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 开发工具包 Javadocs 及其提供的示例(我自己的大部分代码都基于这些示例)上爬了多少,我一次都没有注意到这个特定的细微差别。因此,我为那些追随我的人(可能包括我自己,LOL)提供了非常详细的答案。

    【讨论】:

    • 感谢您发布此内容。
    猜你喜欢
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多