0

Ich habe AWS PHP SDK installiert und versuche, SES zu verwenden. Mein Problem ist, dass es (anscheinend) versucht, ~/.aws/credentials zu lesen, egal was ich mache. Im Moment habe ich diesen Code:Ich kann meine Anmeldeinformationen nicht an AWS PHP SDK übergeben

$S3_AK = getenv('S3_AK'); 
$S3_PK = getenv('S3_PK'); 
$profile = 'default'; 
$path = '/home/franco/public/site/default.ini'; 
$provider = CredentialProvider::ini($profile, $path); 
$provider = CredentialProvider::memoize($provider); 
$client = SesClient::factory(array(
     'profile' => 'default', 
     'region' => 'us-east-1', 
     'version' => "2010-12-01", 
     'credentials' => [ 
     'key' => $S3_AK, 
     'secret' => $S3_PK, 
     ] 
)); 

Und noch bin immer Fehler „Kann nicht Anmeldeinformationen aus ~/.aws/Anmeldeinformationen lesen“ (nach einer Weile).

Ich versuchte 'Credentials' => $ Provider natürlich, das war die Idee, aber da es nicht funktionierte, kehrte ich zu fest codierten Anmeldeinformationen. Ich habe $ S3_AK und $ S3_PK verloren und es geht ihnen gut, ich benutze sie eigentlich korrekt für S3, aber da ist Zends Wrapper. Ich habe ~/.aws/credentials (keine ".ini") zum selben Ergebnis versucht. Beide Dateien haben 777 Berechtigungen.

Neugierige Informationen: Ich musste Speicherlimit auf -1 setzen, so dass es in der Lage wäre, die Ausnahme var_dump. Die HTML zur Ausnahme ist ungefähr 200mb.

Ich würde lieber die Umgebungsvariablen verwenden, obwohl die Credentials-Datei in Ordnung ist. Ich verstehe einfach nicht, warum es so aussieht, als ob ich versuche, die Datei zu lesen, obwohl ich die Zugangsdaten fest programmiert habe.

EDIT: So ein Freund zeigte mir this, entfernte ich das Profil und auch die Versuch/Fang und bemerkte, dass der Client ordnungsgemäß erstellt wird, und der Fehler kommt aus dem Versuch, tatsächlich eine E-Mail zu senden.

+0

sollte nicht Variable 'AWS_ACCESS_KEY_ID' und' AWS_SECRET_ACCESS_KEY' sein? –

+0

Wenn meine Antwort nicht funktioniert, überprüfen Sie die Berechtigungen nicht nur der Datei, sondern der übergeordneten Verzeichnisse der Datei; Der Benutzer, auf dem der Server ausgeführt wird, kann ihn möglicherweise nicht lesen, da er eines der übergeordneten Verzeichnisse nicht öffnen kann. Sie können dies mit etwas wie "sudo -u www-data stat/home/franco/public/site/default.ini" testen, wobei "www-data" der Serverbenutzer ist. – millinon

+0

Frédéric, eine ist die Schlüssel-ID, die andere ist der Zugriffsschlüssel, ich bekomme sie von Umgebungsvariablen. Dennoch ist das Problem, dass es versucht, diese Datei zu lesen, obwohl ich ihm die Anmeldeinformationen explizit erzähle. – shinax

Antwort

-1

OK, ich habe es behoben. Ich konnte die Credentials-Datei nicht lesen, aber es war nicht genau meine Idee. Was passierte, war, dass der eigentliche Client erfolgreich erstellt wurde, aber der Versuch/Fang hatte auch die sendEmail enthalten. Das war was fehlgeschlagen ist. Informationen zum Erstellen des Clients mit expliziten Anmeldeinformationen: Wenn Sie eine Region angeben, geben Sie it will try and read a credentials file ein.

Über die SendEmail, this is the syntax that worked for me, ich hatte eine andere auch in der AWS Docs-Website gefunden, und diese fehlgeschlagen. Es muss für ein älteres SDK gewesen sein.

1

Diese Lösung wird wahrscheinlich nur funktionieren, wenn Sie Version 3 des SDK verwenden. Ich verwende etwas Ähnliches wie folgt aus:

$provider = CredentialsProvider::memoize(CredentialsProvider::ini($profile, $path)); 
$client = new SesClient([ 
    'version' => 'latest', 
    'region' => 'us-east-1', 
    'credentials' => $provider]); 

Ich benutze dies für S3Client, DynamoDbClient, und ein paar andere Kunden, so gehe ich davon aus, dass der SesClient Konstruktor die gleichen Argumente unterstützt.

+0

Wie ich sagte, "Ich versuchte 'Anmeldeinformationen' => $ Provider natürlich", und es immer noch versucht, die Datei zu lesen. – shinax

0

Der Trick ist nur entfernen 'profile' => 'default' von den Werkseinstellungen, wenn dies definiert ist, können wir nicht eine benutzerdefinierte Anmeldeinformationen Datei oder Umgebungsvariablen verwenden. Ist nicht dokumentiert, funktioniert aber einfach.

Ich verwende Sns und Sdk v3.

<?php 
use Aws\Credentials\CredentialProvider; 

$profile = 'sns-reminders'; 
$path = '../private/credentials'; 

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

$sdk = new Aws\Sdk(['credentials' => $provider]); 

$sns = $sdk->createSns([ 
//  'profile' => $profile, 
     'region' => 'us-east-1', 
     'version' => 'latest', 
]); 
Verwandte Themen