2015-08-27 15 views
5

Tôi có một ứng dụng DynamoDB AWS Java SDK chạy dài hoạt động bình thường khi tôi khởi động nó. Tuy nhiên, sau một số giờ (khoảng 12), tôi bắt đầu nhận được cùng một lần Exception một lần nữa với bất kỳ lệnh gọi nào tới API DynamoDB. Nếu tôi khởi động lại máy chủ, Exception sẽ biến mất ... chỉ xuất hiện trở lại sau.Làm cách nào để chữa một cuộc gọi đến SDK Java AWA DynamoDB dẫn đến ExpiredTokenException?

Văn bản ExpiredTokenException lỗi chính xác là:
Các thẻ bảo mật có trong yêu cầu hết hạn (dịch vụ: AmazonDynamoDBv2; Trạng thái Mã số: 400; Error Code: ExpiredTokenException; Yêu cầu ID: DEMTN0Q5BMPH5IQD9TUQMNO5SFVV4KQNSO5AEMVJF66Q9ASUAAJG)

Trả lời

10

Tóm tắt:
Vượt qua một phiên bản AWSCredentialsProvider (trái ngược với AWSCredentials) thành hàm xây dựng AmazonDynamoDBClient vì điều này cho phép làm mới tự động hết hạn AWSCredentials (nếu cụ thể AWSCredentialsProvider đã triển khai chức năng làm mới ... đó là trường hợp với tất cả các AWS được cung cấp tiêu chuẩn).

chi tiết:
Để giải quyết ExpiredTokenException liên quan AWS Java SDK DynamoDB mà bắt đầu với tiền tố "Các thẻ bảo mật có trong yêu cầu hết hạn (dịch vụ: AmazonDynamoDBv2; Trạng thái Mã số: 400; Error Code: ExpiredTokenException; ID yêu cầu: ... ", bạn phải thay đổi mã của mình để cung cấp một phiên bản AWSCredentialsProvider (và ngừng sử dụng một phiên bản AWSCredentials - tức là sans hậu tố" Nhà cung cấp ") vào phương thức khởi tạo của AmazonDynamoDBClient. constructor một thể hiện của AWSCredentialsProvider, bạn cung cấp cho nó khả năng "tự động làm mới các thông tin" nếu/khi hết hạn AWSCredentials (mà tôi được tìm thấy trong số này AWS forum thread yêu cầu tài khoản để truy cập).

Để cung cấp một ví dụ rõ ràng trong mã, đây là một sự tổng quát về những gì đang sản xuất các 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 

Và đây là một sự tổng quát của mã loại bỏ sự 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 

Với số tiền tôi đã tăng lên trên tất cả các JAVadocs SDK Java AWS và các ví dụ được cung cấp của họ (dựa trên đó tôi dựa trên hầu hết mã của riêng tôi), tôi đã không từng nhận thấy sắc thái cụ thể này được gọi ra. Do đó, câu trả lời rất chi tiết tôi đang cung cấp cho những người đến sau tôi (có khả năng sẽ bao gồm bản thân mình, LOL).

+2

Cảm ơn bạn đã đăng bài này. – NielW

Các vấn đề liên quan