Подтвердить что ты не робот

Не удалось загрузить учетные данные AWS из файла /AwsCredentials.properties в пути к классам

Используя этот код для установки пути класса

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)
4b9b3361

Ответ 1

Вы получаете это исключение, потому что ваш AWS SDK не может загрузить ваши учетные данные. То, что вы должны сделать, это goto Preferences then goto AWS и добавить секретный ключ и ключ доступа. Чтобы ваш проект мог получить оба ключа.

Ответ 2

Я сделал соединение, используя другой подход:

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. Надеюсь, это поможет...

Ответ 3

Вы можете использовать DefaultAwsCredentialsProviderChain(), который согласно документации ищет учетные данные в следующем порядке:

  1. Переменные среды - AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY (рекомендуется, поскольку они распознаются всеми AWS SDK и CLI, за исключением .NET) или AWS_ACCESS_KEY и AWS_SECRET_KEY (распознается только Java SDK)
  2. Свойства системы Java - aws.accessKeyId и aws.secretKey
  3. Файл профилей учетных данных в расположении по умолчанию (~/.aws/credentials), который используется всеми AWS SDK и AWS CLI
  4. Учетные данные профиля экземпляра, предоставляемые через сервис метаданных Amazon EC2

Ответ 4

AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();
new AmazonEC2Client(credentialsProvider)

.aws/учетные данные

[default]
aws_access_key_id =
aws_secret_access_key = 

Ответ 5

Попробуйте это для формата файла:

[default]
aws_access_key_id=<your access key>
aws_secret_access_key=<your secret access key>

Я сохранил этот файл как ~/.aws/credentials с помощью ProfileCredentialsProvider().

Ответ 6

Поскольку 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)
    }

Ответ 7

Если вы используете файл учетных данных в ~/.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);

Ответ 8

На сервере 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>

Ответ 9

Если вы хотите использовать переменные окружения с помощью 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 возможных местоположения)

в любом случае, после нескольких часов попыток выяснить, почему мои переменные среды не были найдены... это сработало для меня.

Ответ 10

Есть много правильных ответов выше. В частности, в Windows, когда у вас нет папки ~/.aws/, и вам нужно создать новую, это оказалось другой проблемой, то есть если вы просто введете " .aws " в качестве имени, она выдаст ошибку и не позволит вам создать папку с именем ".aws".

Вот трюк, чтобы преодолеть это, то есть введите ".aws". означает точку в начале и точку в конце. Тогда только окна примут имя. Это случилось со мной, поэтому я отвечу здесь. ТАК, что это может быть полезно для других.

Ответ 11

В моем случае я развертывал свое веб-приложение в докере: я настраивал

ENV AWS_ACCESS_KEY_ID=blahblah%&/(
ENV AWS_SECRET_ACCESS_KEY=supersecret%&/(

но я все еще получил ошибки, я исправил это, добавив

cloud.aws.credentials.useDefaultAwsCredentialsChain=true

внутри application.properties

Ответ 12

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);
                }
            }
        }
    }