无法从类路径上的/AwsCredentials.properties文件加载AWS凭据

时间:2014-03-23 08:46:12

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

使用此代码设置类路径

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)

15 个答案:

答案 0 :(得分:25)

我使用不同的方法建立连接:

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控制台中创建访问密钥和密钥。我希望它有所帮助...

答案 1 :(得分:13)

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

  1. 环境变量 - AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY推荐,因为除了.NET之外,所有AWS开发工具包和CLI都能识别它们),或AWS_ACCESS_KEY和{ {1}}(仅由Java SDK识别)
  2. Java系统属性 - AWS_SECRET_KEYaws.accessKeyId
  3. 所有AWS开发工具包和AWS CLI共享的默认位置(aws.secretKey)的凭据配置文件
  4. 通过Amazon EC2元数据服务提供的实例配置文件凭据

答案 2 :(得分:9)

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

.aws /凭证

[default]
aws_access_key_id =
aws_secret_access_key = 

答案 3 :(得分:5)

您收到此异常是因为您的AWS开发工具包无法加载您的凭据。 您应该做的是转到首选项然后转到AWS并添加您的密钥和访问密钥。这样您的项目就可以检索两个密钥。

答案 4 :(得分:3)

尝试使用以下文件格式:

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

我使用ProfileCredentialsProvider()将此文件保存为〜/ .aws / credentials。

答案 5 :(得分:1)

如果您使用〜/ .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);

答案 6 :(得分:1)

由于不推荐使用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 :(得分:0)

在Linux服务器中,使用ses的默认实现将需要.aws/credential文件中的文件。您可以将以下内容放在以下位置的凭证文件中,它将起作用。 /home/local/<your service account>/.aws/credential

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

答案 8 :(得分:0)

如果您想通过apache / tomcat使用Environment变量,我发现 可以找到它们的唯一方法是将它们设置在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个可能的位置)

经过数小时试图找出为什么找不到我的环境变量的反正……这对我有用。

答案 9 :(得分:0)

上面有许多正确答案。 特别是在Windows中,当您不存在〜/ .aws /文件夹并且需要创建新文件夹时,事实证明这是另一个问题,这意味着如果您键入“ .aws ”作为名称,它将出错,并且不允许您创建名称为“ .aws”的文件夹。

这是克服这一难题的技巧,即键入“。aws。” 。意思是在开始处加点,在结束处加点。然后只有Windows会接受该名称。我发生了这种情况,因此请在此处提供答案。这样对其他人可能会有帮助。

答案 10 :(得分:0)

在我的情况下,我正在将我的web应用程序部署在docker中:我正在设置

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

但是我仍然有错误,我通过添加来解决了这个问题

cloud.aws.credentials.useDefaultAwsCredentialsChain=true

application.properties

答案 11 :(得分:0)

用于设置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);
                }
            }
        }
    }

答案 12 :(得分:0)

如果您正在使用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=

答案 13 :(得分:0)

示例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());
        }

答案 14 :(得分:0)

就我而言,它更愚蠢 - 我更改了系统时间以测试运行并触发 cron 作业。系统时间与 AWS 的其他组件不匹配导致了该问题。