2017-02-08 37 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

相關問題