2017-02-08 39 views
1

我已经使用AWS在PHP中编写了一个使用AWS与库进行通信的库。现在我正在将我的代码迁移到java。在Java中,我使用了我在PHP中使用的相同密钥和秘密。您提供的AWS访问密钥ID在我们的记录中不存在

在PHP我用下面的方法:

$s3 = Aws\S3\S3Client::factory(array('base_url' => $this->base_url, 'command.params' => array('PathStyle' => true), 'key' => $this->key, 'secret' => $this->secret)); 

在java中,我使用下面的方法

BasicAWSCredentials(String accessKey, String secretKey); 

我得到以下异常:

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: The AWS Access Key Id you provided does not exist in our records. (Service: Amazon S3; Status Code: 403; Error Code: InvalidAccessKeyId; Request ID: 3A3000708C8D7883), S3 Extended Request ID: U2rG9KLBBQrAqa6M2rZj65uhaHhOpZpY2VK1rXzqoGrKVd4R/JdR8aeih/skG4fIrecokE4FY3w= 
at  com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1401) 
    at   com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:945) 
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:723) 
    at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:475) 
    at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:437) 
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:386) 
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3996) 
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3933) 
    at com.amazonaws.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:851) 
    at com.amazonaws.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:857) 
    at com.justdial.DocUpload.DocUpload.main(DocUpload.java:22) 

我需要可以使用Java或以前版本的新密钥和秘密。

我的问题是: 1 - 那么在使用AWS的BasicAwsCredentials()方法之前,我们需要遵循的任何先决条件。 2 - 我们是否需要创建IAM角色。 3 - 如果我们这样做,那么它将如何知道在Aws \ S3 \ S3Client :: factory方法中遇到哪种IP,我指定了基础URL。

回答

1

以下代码适用于我。

String accesskey = "objuser1"; 
String secret = "xxxxxxxxxxxxxxxx"; 
ClientConfiguration config = new ClientConfiguration(); 
config.setProtocol(Protocol.HTTP); 
AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials(accesskey, secret), config); 
S3ClientOptions options = new S3ClientOptions(); 
options.setPathStyleAccess(true); 
s3.setS3ClientOptions(options); 
s3.setEndpoint("1.2.3.4:9020"); //ECS IP Address 
System.out.println("Listing buckets"); 
for (Bucket bucket : s3.listBuckets()) { 
    System.out.println(" - " + bucket.getName()); 
} 
System.out.println(); 
1

AWS访问密钥和秘密访问密钥独立于您使用的SDK(与使用PHP,Java或Ruby等无关),更重要的是授予和访问您在AWS上运行/使用的服务。

错误的根本原因是我认为你没有设置AWS区域,尽管你已经给出了访问密钥和秘密访问密钥。请check this为Java设置AWS凭证。

要回答你的问题。

  1. 据我所知BasicAwsCredentials()你想要做的与亚马逊服务任何事情之前本身作为必要的一步。只有BasicAwsCredentials()的先决条件是具有认证密钥。

  2. 不,这不是强制性的步骤。这是一个替代方案。请从this链接查看IAM角色的定义。

  3. 您可以使用'端点'在Java中执行相同的工作。检查链接中的“端点”详细信息。

请看here的例子。 使用相同的方法,我能够成功地执行'BasicAwsCredentials()'。并且根据需要交叉检查'访问密钥'和'秘密访问密钥'是否具有访问亚马逊服务的必要权限。检查IAM用户,组并确保他们拥有必要的AWS许可。

+0

这个我试过了。这个问题存在。我的问题是1 - 是使用AWS的BasicAwsCredentials()方法之前需要遵循的先决条件。 2 - 我们是否需要创建IAM角色。 3 - 如果我们这样做,那么它将如何知道在Aws \ S3 \ S3Client :: factory方法中遇到哪种IP,我指定了基础URL。 –

+0

我编辑了相同的答案来回答你的问题,也看看我提供的链接中的例子。我希望有所帮助。 – Venkatesh

相关问题