无法从类路径上的 /AwsCredentials.properties 文件加载 AWS 凭证
Posted
技术标签:
【中文标题】无法从类路径上的 /AwsCredentials.properties 文件加载 AWS 凭证【英文标题】:Unable to load AWS credentials from the /AwsCredentials.properties file on the classpath 【发布时间】:2014-04-30 14:09:06 【问题描述】:使用此代码设置类路径
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)
【问题讨论】:
您能描述一下您的目录结构吗?你的 .properties 文件在哪里? 【参考方案1】:您可以使用DefaultAwsCredentialsProviderChain()
,它根据documentation,按此顺序查找凭据:
-
环境变量 -
AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
(推荐,因为它们被除 .NET 之外的所有 AWS 开发工具包和 CLI 识别),或 AWS_ACCESS_KEY
和 AWS_SECRET_KEY
(仅被Java SDK)
Java 系统属性 - aws.accessKeyId
和 aws.secretAccessKey
所有 AWS 开发工具包和 AWS CLI 共享的默认位置 (~/.aws/credentials
) 的凭证配置文件
通过 Amazon EC2 元数据服务交付的实例配置文件凭证
【讨论】:
【参考方案2】:如果您已登录 AWS CLI,则可以使用此代码访问您的凭据。
DefaultAWSCredentialsProviderChain props = new DefaultAWSCredentialsProviderChain();
AWSCredentials credentials = props.getCredentials();
final String AWS_ACCESS_KEY_ID = credentials.getAWSAccessKeyId();
final String AWS_SECRET_ACCESS_KEY = credentials.getAWSSecretKey();
【讨论】:
【参考方案3】:在我的情况下,这更加愚蠢 - 我更改了系统时间以测试运行并触发 cron 作业。系统时间与 AWS 的其他组件不匹配导致了此问题。
【讨论】:
【参考方案4】:示例java代码:
//DATA//
//get from: https://console.aws.amazon.com/iam/home?#/security_credentials -> Access keys (access key ID and secret access key) -> Generate key if not exists
String accessKey;
String secretKey;
Regions region = Regions.AP_SOUTH_1; //get from "https://ap-south-1.console.aws.amazon.com/lambda/" > your function > ARN at top right
//CODE//
AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.withRegion(region)
.build();
List<FunctionConfiguration> functionList= awsLambda.listFunctions().getFunctions();
for (FunctionConfiguration functConfig : functionList)
System.out.println("FunctionName="+functConfig.getFunctionName());
【讨论】:
【参考方案5】:如果你使用 Java 和 Springboot 并且想在代码中做,下面的配置就可以了。
在构建 EC2 客户端时,添加凭据提供程序
Region region = Region.US_EAST_1;
Ec2Client ec2 = Ec2Client.builder()
.httpClientBuilder(new DefaultSdkHttpClientBuilder())
.credentialsProvider(SystemPropertyCredentialsProvider.create())
.region(region)
.build();
在应用程序启动中,
@Value("$aws.accessKeyId")
private String accessKey;
@Value("$aws.secretKey")
private String secretKey;
@PostConstruct
public void setSystemProperty()
SystemPropertiesCredentialsProvider systemPropertiesCredentialsProvider=new SystemPropertiesCredentialsProvider();
System.setProperty("aws.accessKeyId",accessKey);
System.setProperty("aws.secretAccessKey",secretKey);
在 application.properties 文件中,
aws.accessKeyId=
aws.secretKey=
【讨论】:
【参考方案6】:一个用于设置 AWS 环境变量的 java 程序。
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);
【讨论】:
【参考方案7】:在 Linux 服务器中,使用 ses
的默认实现将需要 .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>
【讨论】:
【参考方案8】:在我的例子中,我在 docker 中部署我的 webapp:我正在设置
ENV AWS_ACCESS_KEY_ID=blahblah%&/(
ENV AWS_SECRET_ACCESS_KEY=supersecret%&/(
但我仍然有错误,我通过添加解决了这个问题
cloud.aws.credentials.useDefaultAwsCredentialsChain=true
在application.properties
内
【讨论】:
【参考方案9】:上面有很多正确答案。 特别是在 Windows 中,当您没有 ~/.aws/ 文件夹并且您需要创建新文件夹时,结果证明是另一个问题,这意味着如果您只需键入“.aws”作为名称,它将出错并且不允许您创建名称为“.aws”的文件夹。
这是克服这个问题的技巧,即输入 ".aws.",意思是 开头的点和结尾的点。然后只有 windows 会接受这个名字。这发生在我身上,所以在这里提供一个答案。以便对其他人有所帮助。
【讨论】:
【参考方案10】:如果您想通过 apache/tomcat 使用环境变量,我发现 找到它们的唯一方法是将它们设置在 tomcat/bin/setenv.sh (在哪里设置了 catalina_opts - 可能是您的设置中的 catalina.sh)
导出 AWS_ACCESS_KEY_ID=*********;
导出 AWS_SECRET_ACCESS_KEY=**************;
如果您使用的是 ubuntu,请尝试以 ubuntu $printenv 身份登录,然后以 root $printenv 身份登录, 环境变量不一定相同....
如果您只想使用环境变量,您可以使用: com.amazonaws.auth.EnvironmentVariableCredentialsProvider
代替:
com.amazonaws.auth.DefaultAWSCredentialsProviderChain
(默认检查所有 4 个可能的位置)
无论如何,经过数小时试图弄清楚为什么我的环境变量没有被发现......这对我有用。
【讨论】:
【参考方案11】:由于不推荐使用 AmazonDynamoDBClient(credentials),因此我使用它。
init
val cp= AWSStaticCredentialsProvider(BasicAWSCredentials(ACCESS_KEY, SECRET_KEY))
val client = AmazonDynamoDBClientBuilder.standard().withCredentials(cp).withRegion(Regions.US_EAST_1).build()
dynamoDB = DynamoDB(client)
【讨论】:
【参考方案12】:AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider();
new AmazonEC2Client(credentialsProvider)
.aws/凭据
[default]
aws_access_key_id =
aws_secret_access_key =
【讨论】:
看你的回答,我认为 aws_access_key_id 和 aws_secret_access_key -> 必须全部小写,这解决了我的问题【参考方案13】:如果您使用 ~/.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);
【讨论】:
谢谢。在我的客户上评论.withCredentials(new InstanceProfileCredentialsProvider(false))
就可以了。【参考方案14】:
我使用不同的方法建立了联系:
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 控制台中创建访问密钥和秘密密钥。希望对你有帮助...
【讨论】:
【参考方案15】:您收到此异常是因为您的 AWS 开发工具包无法加载您的凭证。 您应该做的是转到 Preferences 然后转到 AWS 并添加您的密钥和访问密钥。这样您的项目就可以检索这两个密钥。
【讨论】:
我找不到“首选项”和“AWS”来添加密钥。你能帮帮我吗? @iForests console.aws.amazon.com/iam/home?region=us-east-2#/… 这只有在您有权访问 IAM 时才有效。问题是大多数在 AWS 上工作的人都没有访问权限,因为公司出于安全原因锁定了 IAM。【参考方案16】:试试这个文件格式:
[default]
aws_access_key_id=<your access key>
aws_secret_access_key=<your secret access key>
我使用 ProfileCredentialsProvider() 将此文件保存为 ~/.aws/credentials。
【讨论】:
把这个文件放在哪里? @Arslan,将此文件放在<local_drive>/.aws/
文件夹中。就像我的文件位于C:\Users\Abhishek\.aws
位置一样。完整路径C:\Users\Abhishek\.aws\credentials
。此外,当我在 eclipse 中安装 AWS 插件时,它给了我一个弹出窗口来填写 Access Key 和 Secret Access Key 并自动创建 credentials 文件在C:\Users\Abhishek\.aws\credentials
位置
我在 aws_secret_access_key 行之后没有新行。这适用于其他 AWS API 库,但不适用于客户端监控。请注意。以上是关于无法从类路径上的 /AwsCredentials.properties 文件加载 AWS 凭证的主要内容,如果未能解决你的问题,请参考以下文章