无法从类路径上的 /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_IDAWS_SECRET_ACCESS_KEY推荐,因为它们被除 .NET 之外的所有 AWS 开发工具包和 CLI 识别),或 AWS_ACCESS_KEYAWS_SECRET_KEY(仅被Java SDK) Java 系统属性 - aws.accessKeyIdaws.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/&lt;your service account&gt;/.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>

您不需要使用BasicAWSCredentialAWSCredentialsProvider。 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,将此文件放在&lt;local_drive&gt;/.aws/ 文件夹中。就像我的文件位于C:\Users\Abhishek\.aws 位置一样。完整路径C:\Users\Abhishek\.aws\credentials。此外,当我在 eclipse 中安装 AWS 插件时,它给了我一个弹出窗口来填写 Access KeySecret Access Key 并自动创建 credentials 文件在C:\Users\Abhishek\.aws\credentials 位置 我在 aws_secret_access_key 行之后没有新行。这适用于其他 AWS API 库,但不适用于客户端监控。请注意。

以上是关于无法从类路径上的 /AwsCredentials.properties 文件加载 AWS 凭证的主要内容,如果未能解决你的问题,请参考以下文章

SparkApp 无法加载 Aws Java Sdk 定义

如何从类路径中读取log4j属性文件

从类路径目录中获取资源列表

从类路径设置 freemarker 模板

从类路径加载文件

从类路径加载资源