【问题标题】:Unable to load AWS credentials from the /AwsCredentials.properties file on the classpath无法从类路径上的 /AwsCredentials.properties 文件加载 AWS 凭证
【发布时间】: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 文件在哪里?

标签: java amazon-web-services amazon-ec2


【解决方案1】:

您可以使用DefaultAwsCredentialsProviderChain(),它根据documentation,按此顺序查找凭据:

  1. 环境变量 - AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY推荐,因为它们被除 .NET 之外的所有 AWS 开发工具包和 CLI 识别),或 AWS_ACCESS_KEYAWS_SECRET_KEY(仅被Java SDK)
  2. Java 系统属性 - aws.accessKeyIdaws.secretAccessKey
  3. 所有 AWS 开发工具包和 AWS CLI 共享的默认位置 (~/.aws/credentials) 的凭证配置文件
  4. 通过 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”来添加密钥。你能帮帮我吗?
                          • 这只有在您有权访问 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 库,但不适用于客户端监控。请注意。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-04-21
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多