2015-12-24 40 views
5

我已經建立了AWS ACCT。並且正在嘗試將我的第一個編程PUT寫入S3。我已經使用控制檯創建一個存儲桶並將其放置在那裏。我還創建了一個子目錄(myFolder)並將其公開。我創造了我.aws /憑證文件,然後使用示例代碼都試過,但我得到了以下錯誤:錯誤執行「PutObject」在AWS上,上傳失敗

Error executing "PutObject" on "https://s3.amazonaws.com/gps-photo.org/mykey.txt"; AWS HTTP error: Client error: `PUT https://s3.amazonaws.com/gps-photo.org/mykey.txt` resulted in a `403 Forbidden` response: 
<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>FC49CD (truncated...) 
AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>AccessDenied</Code><Message>Access Denied</Message <RequestId>FC49CD15567FB9CD</RequestId><HostId>1GTYxjzzzhcL+YyYsuYRx4UgV9wzTCQJX6N4jMWwA39PFaDkK2B9R+FZf8GVM6VvMXfLyI/4abo=</HostId></Error> 

我的代碼是

<?php 

// Include the AWS SDK using the Composer autoloader. 
require '/home/berman/vendor/autoload.php'; 
use Aws\S3\S3Client; 
use Aws\S3\Exception\S3Exception; 
$bucket = 'gps-photo.org'; 
$keyname = 'my-object-key'; 
// Instantiate the client. 
$s3 = S3Client::factory(array(
    'profile' => 'default', 
    'region' => 'us-east-1', 
    'version' => '2006-03-01' 
)); 
try { 
    // Upload data. 
    $result = $s3->putObject(array(
     'Bucket' => $bucket, 
     'Key' => "myFolder/$keyname", 
     'Body' => 'Hello, world!', 
     'ACL' => 'public-read' 
    )); 
    // Print the URL to the object. 
    echo $result['ObjectURL'] . "\n"; 
} catch (S3Exception $e) { 
    echo $e->getMessage() . "\n"; 
} 

如果有人能幫助我,那將是巨大的。謝謝。 --Len

回答

2

403提示您密鑰不正確,或路徑的關鍵是不正確的。您是否已驗證包裝正在加載正確的密鑰/myFolder/$keyname

可能是有益的嘗試(而不是擔心上傳的文件類型,路徑,權限等)調試簡單的東西。

$result = $client->listBuckets(); 
foreach ($result['Buckets'] as $bucket) { 
    // Each Bucket value will contain a Name and CreationDate 
    echo "{$bucket['Name']} - {$bucket['CreationDate']}\n"; 
} 

摘自http://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-s3.html也檢查了那裏的服務建設者。

+0

我檢查了aws_access_key_id,它是正確的。我嘗試了上面給出的簡化請求,並得到了同樣的錯誤。我不知道如何檢查密鑰是否正確,但是由於它是通過剪切和粘貼完成的,所以我沒有理由懷疑它是不正確的。看起來像一個配置問題給我。 – LenB

+0

您是否嘗試過'file_get_contents'和'echo'鍵?你正在從'myFolder/my-object-key'加載它。那是正確的道路嗎?你應該能夠'print_r(file_get_contents('myFolder/my-object-key'))'這個問題不一定是關鍵是不正確的(但是如果你複製和粘貼經常會產生不正確的字符'不安全),這是鑰匙的路徑可能不正確。 – Denault

2

的問題是缺乏對自己斗的權限,一旦我說這些,一切運行良好。

+0

同樣的錯誤,這不能澄清。桶是可讀的,S3FullAccess是不夠的? – Kzqai

6

它看起來像我遇到了同樣的問題。將AmazonS3FullAccess策略添加到您的AWS賬戶。

  • 登錄到AWS。
  • 在Services下選擇IAM。
  • 選擇用戶> [您的用戶]
  • 打開Permissoins標籤
  • 附上AmazonS3FullAccess政策帳戶
+0

感謝您的解決方案,它完美的爲我工作 – nitin

0

布拉登的方法將工作,但它是危險的。用戶將可以完全訪問所有S3存儲桶並能夠登錄到控制檯。如果在該網站上使用的證書被泄露,以及...

一個更安全的做法是:

  1. AWS控制檯 - > IAM - >策略 - >創建策略
  2. 服務= S3
  3. 行動=(只有最低要求,例如列表和讀取)
  4. 資源 - >具體 - >鬥 - >添加ARN(只放所需的桶)的ARN
  5. 資源 - >具體 - >對象 - >檢查任何或把特定對象
  6. 的ARN的
  7. 審查和保存創建策略
  8. AWS控制檯 - > IAM - >用戶 - >添加用戶
  9. 訪問類型 - >選擇 「編程訪問」 只
  10. 下一頁:權限 - >附加現有的直接政策
  11. 搜索並選擇您新創建的政策
  12. 審查和保存創建用戶

這樣你將有隻有需要訪問的用戶。

相關問題