forked from aws/aws-sdk-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInstanceProfileCredentialsProvider.java
More file actions
129 lines (110 loc) · 3.65 KB
/
InstanceProfileCredentialsProvider.java
File metadata and controls
129 lines (110 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
* Copyright 2012-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.amazonaws.auth;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import com.amazonaws.AmazonClientException;
import com.amazonaws.internal.EC2MetadataClient;
import com.amazonaws.util.DateUtils;
import com.amazonaws.util.json.JSONException;
import com.amazonaws.util.json.JSONObject;
/**
* Credentials provider implementation that loads credentials from the Amazon
* EC2 Instance Metadata Service.
*/
public class InstanceProfileCredentialsProvider implements
AWSCredentialsProvider {
protected volatile AWSCredentials credentials;
protected volatile Date credentialsExpiration;
public AWSCredentials getCredentials() {
if (needsToLoadCredentials())
loadCredentials();
if (expired()) {
throw new AmazonClientException(
"The credentials received from the Amazon EC2 metadata service have expired");
}
return credentials;
}
public void refresh() {
credentials = null;
}
protected boolean needsToLoadCredentials() {
if (credentials == null)
return true;
if (credentialsExpiration != null) {
int thresholdInMilliseconds = 1000 * 60 * 5;
boolean withinExpirationThreshold = credentialsExpiration.getTime()
- System.currentTimeMillis() < thresholdInMilliseconds;
if (withinExpirationThreshold)
return true;
}
return false;
}
private boolean expired() {
if (credentialsExpiration != null) {
if (credentialsExpiration.getTime() < System.currentTimeMillis()) {
return true;
}
}
return false;
}
private synchronized void loadCredentials() {
if (needsToLoadCredentials()) {
try {
String credentialsResponse = new EC2MetadataClient()
.getDefaultCredentials();
JSONObject jsonObject = new JSONObject(credentialsResponse);
if (jsonObject.has("Token")) {
credentials = new BasicSessionCredentials(
jsonObject.getString("AccessKeyId"),
jsonObject.getString("SecretAccessKey"),
jsonObject.getString("Token"));
} else {
credentials = new BasicAWSCredentials(
jsonObject.getString("AccessKeyId"),
jsonObject.getString("SecretAccessKey"));
}
if (jsonObject.has("Expiration")) {
/*
* TODO: The expiration string comes in a different format
* than what we deal with in other parts of the SDK, so we
* have to convert it to the ISO8601 syntax we expect.
*/
String expiration = jsonObject.getString("Expiration");
expiration = expiration.replaceAll("\\+0000$", "Z");
credentialsExpiration = new DateUtils()
.parseIso8601Date(expiration);
}
} catch (IOException e) {
throw new AmazonClientException(
"Unable to load credentials from Amazon EC2 metadata service",
e);
} catch (JSONException e) {
throw new AmazonClientException(
"Unable to parse credentials from Amazon EC2 metadata service",
e);
} catch (ParseException e) {
throw new AmazonClientException(
"Unable to parse credentials expiration date from Amazon EC2 metadata service",
e);
}
}
}
@Override
public String toString() {
return getClass().getSimpleName();
}
}