我安装了 AWS PHP SDK 并尝试使用 SES。我的问题是,无论我做什么,它(显然)都在尝试阅读~/.aws/credentials
。我目前有这个代码:
$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,
]
));
并且仍然收到"无法从~/.aws/凭据读取凭据"错误(一段时间后)。
我尝试了"凭据"=> $provider当然,这就是想法,但由于它不起作用,我恢复了硬编码凭据。我已经转储了 $S 3_AK 和 $S 3_PK,它们很好,我实际上将它们正确地用于 S3,但我有 Zend 的包装器。我已经尝试了~/.aws/凭据(没有".ini")以获得相同的结果。两个文件都具有 777 个权限。
奇怪的信息:我必须将内存限制设置为 -1,以便它能够var_dump异常。例外的html大约是200mb。
我更喜欢使用环境变量,尽管凭据文件很好。我只是不明白为什么它似乎试图读取文件,即使我已经硬编码了凭据。
编辑:所以一个朋友向我展示了这个,我删除了配置文件并修改了try/catch,并注意到客户端似乎已正确创建,并且错误来自尝试实际发送电子邮件。
诀窍只是从工厂参数中删除'profile' => 'default'
,如果定义了它,我们就不能使用自定义凭据文件或环境变量。没有记录,但只是作品。
我正在使用 Sns 和 Sdk v3。
<?php
use AwsCredentialsCredentialProvider;
$profile = 'sns-reminders';
$path = '../private/credentials';
$provider = CredentialProvider::ini($profile, $path);
$provider = CredentialProvider::memoize($provider);
$sdk = new AwsSdk(['credentials' => $provider]);
$sns = $sdk->createSns([
// 'profile' => $profile,
'region' => 'us-east-1',
'version' => 'latest',
]);
此解决方案可能仅在使用版本 3 的 SDK 时才有效。我使用类似的东西:
$provider = CredentialsProvider::memoize(CredentialsProvider::ini($profile, $path));
$client = new SesClient([
'version' => 'latest',
'region' => 'us-east-1',
'credentials' => $provider]);
我将其用于S3Client
、DynamoDbClient
和其他一些客户端,因此我假设SesClient
构造函数支持相同的参数。
好的,我设法修复了它。 我无法读取凭据文件,但这不完全是我的主意。 正在发生的事情是实际客户端正在成功创建,但尝试/捕获也包含 sendEmail。这就是失败的地方。 关于使用显式凭据创建客户端:如果指定区域,它将尝试读取凭据文件。
关于 SendEmail,这是对我有用的语法,我在 AWS 文档站点中也找到了另一个语法,但那个语法失败了。它一定是针对较旧的 SDK。