2013-11-04 4 views
10

मैं एसडब्ल्यू कंसोल में एक स्थिर वेबसाइट होने के लिए प्रोग्राम को एक बाल्टी में प्रोग्राम अपलोड करने के लिए PHP के लिए एडब्ल्यूएस एसडीके का उपयोग करने की कोशिश कर रहा हूं।अमेज़ॅन में एस 3 क्लाइंट के लिए उचित एंडपॉइंट सेट करें एडब्ल्यूएस PHP एसडीके

बाल्टी को foo.ourdomain.com नाम दिया गया है और इसे ई-वेस्ट में होस्ट किया गया है। मैं कोशिश करते हैं और परीक्षण करने के लिए अगर मैं एक फ़ाइल अपलोड कर सकते हैं निम्नलिखित कोड का उपयोग कर रहा:

PHP Fatal error: Uncaught Aws\S3\Exception\PermanentRedirectException: AWS Error Code: PermanentRedirect, Status Code: 301, AWS Request ID: -, AWS Error Type: client, AWS Error Message: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint: "foo.ourdomain.com.s3.amazonaws.com"., User-Agent: aws-sdk-php2/2.4.8 Guzzle/3.7.4 curl/7.22.0 PHP/5.3.10-1ubuntu3.8

:

$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla)); 
    $client->upload('foo.ourdomain.com', 'test.txt', 'hello world', 'public-read'); 

यह काफी है कि यह उदाहरण में है तथापि, मैं निम्न अपवाद प्राप्त

इस बिंदु पर मैं आश्चर्यचकित था क्योंकि एस 3 एसडीके के लिए मैनुअल में इसका कोई उल्लेख नहीं है। लेकिन ठीक है, मैं एक विधि setEndpoint पाया जाता है और करने के लिए कोड समायोजित:

$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla)); 
    $client->setEndpoint('foo.ourdomain.com.s3.amazonaws.com'); 
    $client->upload('foo.ourdomain.com', 'test.txt', 'hello world', 'public-read'); 

मैं मान लिया है कि काम है, लेकिन मैं ठीक उसी त्रुटि मिल रही है। मैंने दोबारा जांच की है और अपवाद में उल्लिखित एंडपॉइंट बाइट-फॉर-बाइट उस दूसरे से मेल खाता है जिसे मैं दूसरी पंक्ति में स्थापित कर रहा हूं।

मैंने foo.ourdomain.com.s3-website-eu-west-1.amazonaws.com का उपयोग एंडपॉइंट के रूप में करने का भी प्रयास किया है (यह होस्ट हमारे सीएनएन कंसोल निर्देशों के अनुसार इंगित करता है)। या तो काम नहीं किया।

मुझे कुछ याद आना चाहिए, लेकिन मुझे इसे कहीं भी नहीं मिल रहा है। शायद 'स्थैतिक वेबसाइट' पर सेट बाल्टी अलग-अलग तरीके से व्यवहार करती हैं जो वर्तमान में एसडीके द्वारा समर्थित नहीं है? यदि ऐसा है, तो मुझे दस्तावेज़ों में और प्रबंधन कंसोल में इसका उल्लेख नहीं मिल रहा है।

उत्तर

19

समझ गया। समाधान क्लाइंट के प्रारंभिकरण को बदलने के लिए था:

$client = \Aws\S3\S3Client::factory(array('key' => bla, 'secret' => bla, 'region' => 'eu-west-1')); 

आईई। एक एंडपॉइंट निर्दिष्ट करने के बजाय मुझे विकल्प सरणी में क्षेत्र को स्पष्ट रूप से सेट करने की आवश्यकता है। मुझे लगता है कि उदाहरण कोड कोड का उपयोग करने के लिए होता है जो भी डिफ़ॉल्ट क्षेत्र है।

+0

ठीक है, एसडीके वैश्विक क्षेत्र/एंडपॉइंट पर डिफ़ॉल्ट है। यदि आपने किसी विशिष्ट क्षेत्र में बाल्टी बनाई है, तो आपको उस क्षेत्र का उपयोग करने के लिए S3Client को भेजने की आवश्यकता है। –

+2

अजीब हालांकि त्रुटि में टिप्पणी यह ​​तय करने के लिए बिल्कुल विशिष्ट है कि यह कैसे ठीक करें, लेकिन यह भी गलत है :) – Nanne

5

आप एक विशिष्ट क्षेत्र के लिए ग्राहक प्रारंभ करने में नहीं करना चाहते हैं और/या आप कॉल की getBucketLocation/setRegion सेट का उपयोग में विभिन्न क्षेत्रों के साथ काम करने में, मैं सफल रहे हैं इस प्रकार की आवश्यकता होगी:

// Bucket location is fetched 
$m_bucketLocation = $I_s3->getBucketLocation(array(
     'Bucket' => $s_backupBucket, 
)); 
// Bucket location is specified before operation is made 
$I_s3->setRegion($m_bucketLocation['Location']); 

मेरे पास एक अतिरिक्त कॉल है, लेकिन कारखाने में हस्तक्षेप की आवश्यकता के बिना मेरी समस्या हल हो गई।

संबंधित मुद्दे