2014-06-16 11 views
7

के लिए क्रेडेंशियल्स फ़ाइल रखने के लिए स्थान मैंने एक ईसी 2 उबंटू इंस्टेंस बनाया है।एडब्ल्यूएस PHP एसडीके

निम्नलिखित PHP के लिए एडब्ल्यूएस 2.6 SDK का उपयोग कर रहा है:

$client = DynamoDbClient::factory(array(
    'key' => 'xxx', 
    'secret' => 'xxx', 
    'region' => 'eu-west-1' 
)); 

मैं एक साख ~/.aws/credentials में फ़ाइल बनाया।
मैं /home/ubuntu/.aws/credentials

[default] 
aws_access_key_id=xxx 
aws_secret_access_key=xxx 

में रखते निम्नलिखित काम नहीं करता है की कोशिश कर रहा है और देता है एक InstanceProfileCredentialsException:

$client = DynamoDbClient::factory(array(
    'profile' => 'default', 
    'region' => 'eu-west-1' 
)); 

वहाँ एक उपयोगकर्ता www-data और एक उपयोगकर्ता ubuntu है।
मुझे किस फ़ोल्डर में क्रेडेंशियल्स फ़ाइल रखना चाहिए? साख स्थापित करने के लिए

+0

मेरी तरफ यह पूरी तरह से काम कर रहा है। $ ग्राहक = डायनेमो डीबी क्लाइंट :: फैक्टरी (सरणी ('कुंजी' => 'कीस्ट्रिंग', 'गुप्त' => 'sercretkeysting', 'क्षेत्र' => क्षेत्र :: यूएस_ईएएसT_1 # अपने वांछित क्षेत्र के साथ बदलें)); इस प्रारूप को एक्सेस के लिए आजमाएं। – user2706194

उत्तर

2

मेरे पास एक गैर-ईसी 2 सर्वर है जो एसक्यूएस तक पहुंचता है और उसे प्रमाण-पत्र की आवश्यकता होती है। मैं envvars का उपयोग नहीं कर सकता क्योंकि इस सर्वर पर चलने वाले अलग-अलग अधिकार वाले विभिन्न लोग हैं और envvars वैश्विक हैं। इसी कारण से मुझे नहीं लगता कि मैं उपयोगकर्ता के घर के तहत संग्रहीत AWS credential file का उपयोग कर सकता हूं (हालांकि मैं यह भी नहीं समझ सकता कि उपयोगकर्ता www-data के लिए यह काम कैसे किया जाए।)

मैंने जो किया है वह सेट है एक छोटी सी फाइल AWS_Creds.php

<?php 
define ("AWS_KEY", "MY KEY HERE"); 
define ("AWS_SECRET", "MY SECRET"); 
?> 

फ़ाइल webroot के बाहर संग्रहीत और include ('ABSOLUTEPATH/AWS_Creds.php') के साथ शामिल है और मैं ग्राहक कारखाने के लिए कठिन वायर्ड संदर्भ शामिल है।

सुरुचिपूर्ण? नहीं हो गया? हाँ।इतना है कि यह हमारे रेपो में जाने नहीं करता मैं gitignore AWS_Creds.php:

संपादित

मैं उल्लेख करना भूल गया।

+0

यह ऐसा करता है, और मैं केवल एक समाधान का पक्ष लेगा जो कि गिट रेपो से चाबियाँ रखता है (इससे कोई फर्क नहीं पड़ता कि आईएएम नीति-प्रतिबंधित कैसे है)। –

8

एक समाधान है:

sudo nano /etc/apache2/envvars

जोड़ने वातावरण चर:

export AWS_ACCESS_KEY_ID="xxx" 
export AWS_SECRET_ACCESS_KEY="xxx" 

sudo service apache2 restart

उसके बाद निम्न काम करता है:

$client = DynamoDbClient::factory(array(
    'region' => 'eu-west-1' 
)); 
5

यदि आप एपी 2 उदाहरण से एपीआई को कॉल कर रहे हैं, तो आपको IAM roles का उपयोग करना चाहिए।

आईएएम भूमिकाओं का उपयोग करना अमेज़ॅन ईसी 2 पर चल रहे अनुप्रयोगों के लिए प्रमाण-पत्र प्रदान करने के लिए पसंदीदा तकनीक है। आईएएम भूमिकाएं को आपके आवेदन से क्रेडेंशियल प्रबंधन की आवश्यकता को हटा दें। वे उदाहरण को ईसी 2 इंस्टेंस के मेटाडेटा सर्वर से अस्थायी प्रमाण-पत्र पुनर्प्राप्त करके एक भूमिका "मानने" की अनुमति देते हैं। ये अस्थायी प्रमाण-पत्र, अक्सर को इंस्टेंस प्रोफाइल क्रेडेंशियल्स के रूप में संदर्भित किया जाता है, जो भूमिका की नीति की अनुमति देता है क्रियाओं और संसाधनों तक पहुंच की अनुमति देता है।

1

aws/aws-sdk-php/src में स्रोत कोड Credential.php देखने के बाद, php डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से रूट/रूट फ़ोल्डर नहीं कर सकता है। आप अपने php में $ _SERVER ['HOME'] = [अपना नया होम पथ] लिख सकते हैं, और क्रेडेंशियल फ़ाइल को NewHomePath/.aws/credentials में डाल सकते हैं।

+0

$ _SERVER ['HOME'] मेरी स्थापना में बिल्कुल सेट नहीं किया गया था –

2

मूल रूप से आप इस तरह उपयोग कर सकते हैं:

$client = DynamoDbClient::factory(array(
    'key' => 'aws_key', 
    'secret' => 'aws_secret', 
    'region' => 'us-east-1' 
)); 

लेकिन दस्तावेज में:

PHP संस्करण 2.6.2 के लिए एडब्ल्यूएस एसडीके के साथ शुरू, आप उपयोग कर सकते हैं एक AWS क्रेडेंशियल आपके क्रेडेंशियल्स निर्दिष्ट करने के लिए फ़ाइल । यह आपकी होम निर्देशिका के तहत संग्रहीत एक विशेष, आईएनआई-स्वरूपित फ़ाइल है, और यह आपके विकास पर्यावरण के लिए प्रमाण-पत्र प्रबंधित करने का एक अच्छा तरीका है। फ़ाइल को ~/.aws/credentials पर रखा जाना चाहिए, जहां ~ आपकी होम निर्देशिका का प्रतिनिधित्व करता है।

और उपयोग:

$dynamoDbClient = DynamoDbClient::factory(array(
    'profile' => 'project1', 
    'region' => 'us-west-2', 
)); 

अधिक जानकारी: http://docs.aws.amazon.com/aws-sdk-php/guide/latest/credentials.html

1

यह बहुत देर हो चुकी तरीका है, लेकिन समाधान मैं साझा सर्वर जहां वास्तव में पर्यावरण उपयोग नहीं कर सकते वार्स के लिए मिला एक परिभाषित करने के लिए है कस्टम आईएनआई फ़ाइल स्थान, इस तरह:

require (__DIR__.'/AWSSDK/aws-autoloader.php'); 

use Aws\Credentials\CredentialProvider; 
use Aws\S3\S3Client; 

$profile = 'default'; 
$path = '/path/to/credentials'; 

$provider = CredentialProvider::ini($profile, $path); 
$provider = CredentialProvider::memoize($provider); 

$client = new \Aws\S3\S3Client([ 
    'version' => 'latest', 
    'region' => 'us-west-2', 
    'credentials' => $provider 
]); 

ध्यान दें कि आप इस विधि के साथ विभिन्न प्रोफाइल भी परिभाषित कर सकते हैं। प्रलेखन HERE

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