AWS PHP SDK Credenziali errore S

Ottengo il seguente errore quando SNSClient a creare un object SNSClient .

 InstanceProfileCredentialsException in InstanceMetadataClient.php line 85: Error retrieving credentials from the instance profile metadata server. When you are not running inside of Amazon EC2, you must provide your AWS access key ID and secret access key in the "key" and "secret" options when creating a client or provide an instantiated Aws\Common\Credentials\CredentialsInterface object. (Client error response [status code] 404 [reason phrase] Not Found [url] http://169.254.169.254/latest/meta-data/iam/security-credentials/) 

Non capisco perché ho questo errore quando ho il mio aws.php nella cartella config del mio setup di laravel. Qui sono memorizzati la chiave di accesso e la chiave segreta.

Non mi piace molto perché questo fa sì che le mie credenziali vengano salvate nella configuration della cartella in cui altri possono essere salvati in SFTP.

Quello che ho anche sono le credenziali aws e i file di configuration nella mia cartella principale del server, in un path come questo: ~/.aws/ ma per qualche motivo l'applicazione non è felice.

Ecco come appare il mio codice:

 public function about(){ // Instantiate a client with the credentials from the project1 profile $snsClient = SnsClient::factory(arrays( 'profile' => 'default', 'region' => 'us-west-2', )); // Get the application's endpoints $iOS_AppArn = "arn:aws:sns:us-west-2:235418406768:app/APNS_SANDBOX/ClashTarget"; $iOS_model = $snsClient->listEndpointsByPlatformApplication(arrays('PlatformApplicationArn' => $iOS_AppArn)); } 

Si noti che sto usando il profilo default che dovrebbe prendere le credenziali dalla directory root aws in cui sono memorizzati i file di configuration e credenziali.

Per ora, come soluzione temporanea l'ho fatto: http://blog.ianholden.com/aws-s3-with-php-on-apache/ che rende tutto funzionante ma non sono felice di avere le mie chiavi credenziali che vivono nel codice dell'applicazione. Non sembra giusto.

Qualcuno può guidarmi nel risolvere questo errore, per favore?

Aggiornamento 1: Commento: qual è il contenuto di config in ~ / .aws / Questo è il contenuto del file di configuration nella cartella ~/.aws/

 [default] output = json region = us-west-2 

Il tuo file ~/.aws/credentials dovrebbe avere questo aspetto:

 [default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY [project1] aws_access_key_id = ANOTHER_AWS_ACCESS_KEY_ID aws_secret_access_key = ANOTHER_AWS_SECRET_ACCESS_KEY 

La seguente function è utilizzata dalla libreria per determinare la directory in cui cercare il file .aws/credentials :

 private static function getHomeDir() { // On Linux/Unix-like systems, use the HOME environment variable if ($homeDir = getenv('HOME')) { return $homeDir; } // Get the HOMEDRIVE and HOMEPATH values for Windows hosts $homeDrive = getenv('HOMEDRIVE'); $homePath = getenv('HOMEPATH'); return ($homeDrive && $homePath) ? $homeDrive . $homePath : null; } 

Come puoi vedere, se le variables di ambiente HOME o HOMEDRIVE e HOMEPATH non sono impostate, la libreria non sarà in grado di trovare il tuo file di credenziali.

Oltre a poter trovare il file, deve anche essere leggibile da PHP e in un formato INI (come descritto sopra).

modificare

Dai commenti, sembra che la variabile d'ambiente HOME non sia impostata. Per questo motivo, la libreria non riesce a trovare il tuo file di credenziali. Ci sono alcune opzioni per where andare da qui.

Opzione 1:

Correggi il tuo server in modo che la variabile di ambiente HOME sia impostata correttamente. Avrai bisogno di fare qualche ricerca sul modo migliore per farlo, in quanto la soluzione potrebbe essere altamente dipendente dalle configurazioni server / apache / php …

Opzione 2:

Poiché stai utilizzando Laravel 5, puoi aggiungere le tue credenziali al tuo file .env e poi accedervi nel codice. Ad esempio, aggiungi le seguenti due righe alla fine del tuo file .env :

 AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY 

Ora, nel tuo codice, puoi fare:

 public function about() { // add "use Aws\Credentials\Credentials;" at the top of your file // the env() method reads the values from the .env file $credentials = new Credentials(env('AWS_ACCESS_KEY_ID'), env('AWS_SECRET_ACCESS_KEY')); // if using the 'credentials' key, do not use the 'profile' key $snsClient = SnsClient::factory(arrays( 'region' => 'us-west-2', 'credentials' => $credentials )); } 

Opzione 3:

Chiama tu stesso il metodo CredentialProvider::ini() e passa il profilo e il path completo al tuo file ini. Ciò eviterà la necessità che la libreria provi a determinare la directory home.

 public function about() { // add "use Aws\Credentials\CredentialProvider;" at the top of your file // first parameter is the profile, second parameter is the full path to your credentials file $credentials = CredentialProvider::ini('default', '/root/.aws/credentials'); // if using the 'credentials' key, do not use the 'profile' key $snsClient = SnsClient::factory(arrays( 'region' => 'us-west-2', 'credentials' => $credentials )); } 

Non riesco a vedere esattamente la ragione per cui stai ricevendo l'errore, ma

Non mi piace molto perché questo fa sì che le mie credenziali vengano salvate nella configuration della cartella in cui altri possono essere salvati in SFTP.

Suppongo che tu abbia certamente bisogno di impostare il ruolo IAM nella console AWS per consentire la connessione a SNS dalle tue istanze EC2. In questo modo non avrai bisogno di fornire alcuna credenziale

Dal commento di @ Pavan sulla sua domanda in cui mostra il contenuto del file delle credenziali in ~/.aws , sembra che ci siano 2 file lì. Ho solo un file

 $ cat ~/.aws/credentials [default] aws_access_key_id = blablabla aws_secret_access_key = blablabla region = us-west-2