Ответ 1
Вы получаете это исключение, потому что ваш AWS SDK не может загрузить ваши учетные данные. То, что вы должны сделать, это goto Preferences then goto AWS и добавить секретный ключ и ключ доступа. Чтобы ваш проект мог получить оба ключа.
Используя этот код для установки пути класса
AWSCredentialsProvider credentialsProvider = new ClasspathPropertiesFileCredentialsProvider();
ec2 = new AmazonEC2Client(credentialsProvider);
Ниже представлен формат файла AwsCredentials.properties
# Fill in your AWS Access Key ID and Secret Access Key
# http://aws.amazon.com/security-credentials
accessKey = keyHere
secretKey = secretKeyHere
Ниже приведено исключение, которое я получаю
Exception in thread "main" com.amazonaws.AmazonClientException: Unable to load AWS credentials from the /AwsCredentials.properties file on the classpath
at com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider.getCredentials(ClasspathPropertiesFileCredentialsProvider.java:81)
at com.amazonaws.services.ec2.AmazonEC2Client.invoke(AmazonEC2Client.java:8359)
Вы получаете это исключение, потому что ваш AWS SDK не может загрузить ваши учетные данные. То, что вы должны сделать, это goto Preferences then goto AWS и добавить секретный ключ и ключ доступа. Чтобы ваш проект мог получить оба ключа.
Я сделал соединение, используя другой подход:
BasicAWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials).withRegion(Regions.US_EAST_1);
DynamoDB dynamoDB = new DynamoDB(client);
Ключ доступа и секретный ключ можно создать в консоли Identity and Access Management. Надеюсь, это поможет...
Вы можете использовать DefaultAwsCredentialsProviderChain()
, который согласно документации ищет учетные данные в следующем порядке:
AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
(рекомендуется, поскольку они распознаются всеми AWS SDK и CLI, за исключением .NET) или AWS_ACCESS_KEY
и AWS_SECRET_KEY
(распознается только Java SDK)aws.accessKeyId
и aws.secretKey
~/.aws/credentials
), который используется всеми AWS SDK и AWS CLIAWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();
new AmazonEC2Client(credentialsProvider)
.aws/учетные данные
[default]
aws_access_key_id =
aws_secret_access_key =
Попробуйте это для формата файла:
[default]
aws_access_key_id=<your access key>
aws_secret_access_key=<your secret access key>
Я сохранил этот файл как ~/.aws/credentials с помощью ProfileCredentialsProvider().
Поскольку AmazonDynamoDBClient (учетные данные) устарел, я использую это.
init {
val cp= AWSStaticCredentialsProvider(BasicAWSCredentials(ACCESS_KEY, SECRET_KEY))
val client = AmazonDynamoDBClientBuilder.standard().withCredentials(cp).withRegion(Regions.US_EAST_1).build()
dynamoDB = DynamoDB(client)
}
Если вы используете файл учетных данных в ~/.aws/credentials и используете профиль по умолчанию, как показано ниже:
[default]
aws_access_key_id=<your access key>
aws_secret_access_key=<your secret access key>
Вам не нужно использовать BasicAWSCredential
или AWSCredentialsProvider
. SDK может получить учетные данные из профиля по умолчанию, просто инициализируя объект клиента конструктором по умолчанию. Пример ниже:
AmazonEC2Client ec2Client = new AmazonEC2Client();
Кроме того, иногда вам нужно будет инициализировать клиента с помощью ClientConfiguration, чтобы предоставить настройки прокси-сервера и т.д. Пример ниже.
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("proxyhost");
clientConfiguration.setProxyPort(proxyport);
AmazonEC2Client ec2Client = new AmazonEC2Client(clientConfiguration);
На сервере Linux при использовании ses
по умолчанию .aws/credentials
файлы в .aws/credentials
. Вы можете поместить следующий контент в файл учетных данных в расположении ниже, и он будет работать. /home/local/<your service account>/.aws/credentials
.
[default]
aws_access_key_id=<your access key>
aws_secret_access_key=<your secret access key>
Если вы хотите использовать переменные окружения с помощью apache/tomcat, я обнаружил, что единственный способ найти их - это установить их в tomcat/bin/setenv.sh (где установлены catalina_opts - в ваших настройках может быть catalina.sh)
export AWS_ACCESS_KEY_ID = *********;
export AWS_SECRET_ACCESS_KEY = **************;
Если вы используете Ubuntu, попробуйте войти как ubuntu $ printenv, затем войдите как root $ printenv, переменные среды не обязательно будут такими же...
Если вы хотите использовать только переменные среды, вы можете использовать: com.amazonaws.auth.EnvironmentVariableCredentialsProvider
вместо:
com.amazonaws.auth.DefaultAWSCredentialsProviderChain
(который по умолчанию проверяет все 4 возможных местоположения)
в любом случае, после нескольких часов попыток выяснить, почему мои переменные среды не были найдены... это сработало для меня.
Есть много правильных ответов выше. В частности, в Windows, когда у вас нет папки ~/.aws/, и вам нужно создать новую, это оказалось другой проблемой, то есть если вы просто введете " .aws " в качестве имени, она выдаст ошибку и не позволит вам создать папку с именем ".aws".
Вот трюк, чтобы преодолеть это, то есть введите ".aws". означает точку в начале и точку в конце. Тогда только окна примут имя. Это случилось со мной, поэтому я отвечу здесь. ТАК, что это может быть полезно для других.
В моем случае я развертывал свое веб-приложение в докере: я настраивал
ENV AWS_ACCESS_KEY_ID=blahblah%&/(
ENV AWS_SECRET_ACCESS_KEY=supersecret%&/(
но я все еще получил ошибки, я исправил это, добавив
cloud.aws.credentials.useDefaultAwsCredentialsChain=true
внутри application.properties
Java-программа для настройки среды AWS.
Map<String, String> environment = new HashMap<String, String>();
environment.put("AWS_ACCESS_KEY_ID", "*****************");
environment.put("AWS_SECRET_KEY", "*************************");
private static void setEnv(Map<String, String> newenv) throws Exception {
try {
Class<?> processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment");
Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment");
theEnvironmentField.setAccessible(true);
Map<String, String> env = (Map<String, String>) theEnvironmentField.get(null);
env.putAll(newenv);
Field theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
theCaseInsensitiveEnvironmentField.setAccessible(true);
Map<String, String> cienv = (Map<String, String>) theCaseInsensitiveEnvironmentField.get(null);
cienv.putAll(newenv);
} catch (NoSuchFieldException e) {
Class[] classes = Collections.class.getDeclaredClasses();
Map<String, String> env = System.getenv();
for (Class cl : classes) {
if ("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
Field field = cl.getDeclaredField("m");
field.setAccessible(true);
Object obj = field.get(env);
Map<String, String> map = (Map<String, String>) obj;
map.clear();
map.putAll(newenv);
}
}
}
}