У меня есть такой сценарий: я создал сервлет Java, который будет выполняться на сервере Lotus Domino (на всякий случай сервлет является OUTSIDE из любой базы данных, он находится в папке <domino data>/domino/servlet/my_servlet.class
). Сервлет получает доступ к серверу S3, используя файл учетных данных.
Когда я разработал сервлет, я выполнил свои тесты на сервере Windows, и все работало как шарм. Но, когда я делал те же тесты на сервере Linux, используя те же учетные данные и тот же сервлет, это не сработало.
Исключение произошло здесь:
AWSCredentials credentials = null;
try {
credentials = new ProfileCredentialsProvider().getCredentials();
} catch (Exception e) {
throw new AmazonClientException(
"Cannot load the credentials from the credential profiles file. " +
"Please make sure that your credentials file is at the correct " +
"location (~/.aws/credentials), and is in valid format.",
e);
}
Учитывая, что сервер domino выполняется с notes
пользователя, я notes/.aws/credentials
данные в notes/.aws/credentials
. Ничего. Я положил его в ec2-user/.aws/credentials
(это сервер EC2). Больше ничего. Такое же исключение.
О сервере Domino он выполняется с использованием пользовательских notes
. Папка .aws
и владелец файла credentials
- это notes
. Разрешения в файле credentials
- 600. Владелец сервлета также notes
.
У вас есть представление о том, как я могу это решить?
ТИА,
EDIT: Я добавил эти строки в сервлет:
res.setContentType("text/html");
PrintWriter toBrowser = res.getWriter();
//etc.
toBrowser.println("HOME: " + System.getProperty("user.home"));
Я получил это:
HOME: /home/notes
Я снова проверил эту папку, и учетные данные все еще там.
[root@ip-xxx-xxx-xxx-xxx notes]# ls -l /home/notes/.aws
total 4
-rw------- 1 notes notes 117 Nov 28 03:50 credentials
[root@ip-xxx-xxx-xxx-xxx notes]#
EDIT 2: Я добавил эти строки тоже:
File f = new File(System.getProperty("user.home") + "/.aws/credentials");
if(f.exists()){
toBrowser.println("Credentials exists" + "<BR/>");
}else{
toBrowser.println("Credentials DOES NOT exist" + "<BR/>");
}
И я получил это:
Credentials exists
Таким образом, сервлет имеет правильные разрешения для поиска файла credentials
.
Я застрял в этом...
Проблема в том, что сервлет не имел доступа к переменным среды
Это связано с ошибкой на сервере Lotus Domino с версии 8.5. Решение изменило файл java.policy в $ JAVA_HOME/lib/security, добавив эту строку:
grant {
[...]
permission java.security.AllPermission;
[...]
}
Все работает снова.
На самом деле, если вы разместите свои учетные данные в ~/.aws/credentials, как вы это сделали, вы можете позвонить своему конструктору клиента Amazon AWS SDK без каких-либо параметров. Например:
AmazonSNSAsyncClient snsClient = new AmazonSNSAsyncClient();
Но если сервлет не имеет доступа к переменным окружения, то AWS SDK, вероятно, тоже не имеет доступа. Однако код загрузки файла не требуется.
Дополнительную информацию см. В http://docs.aws.amazon.com/AWSSdkDocsJava/latest/DeveloperGuide/credentials.html.