【问题标题】:Can't pass my credentials to AWS PHP SDK无法将我的凭证传递给 AWS PHP SDK
【发布时间】:2016-09-17 04:02:44
【问题描述】:

我安装了 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/credentials 读取凭据”错误(过了一段时间)。

我尝试了 'credentials' => $provider 当然,这是我的想法,但由于它不起作用,我恢复为硬编码的凭据。我已经抛弃了 $S3_AK 和 $S3_PK 并且它们很好,我实际上将它们正确地用于 S3,但是我有 Zend 的包装器。我已经尝试了 ~/.aws/credentials (no ".ini") 以获得相同的结果。两个文件都有 777 权限。

好奇的信息:我必须将内存限制设置为 -1,这样它才能 var_dump 异常。异常的 html 约为 200mb。

我更喜欢使用环境变量,尽管凭证文件很好。我只是不明白为什么它似乎在尝试读取文件,即使我已经硬编码了凭据。

编辑:一位朋友向我展示了this,我删除了配置文件并修改了 try/catch 并注意到客户端似乎已正确创建,错误来自尝试实际发送电子邮件。

【问题讨论】:

  • 变量不应该是 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 吗?
  • 如果我的回答不起作用,不仅要检查文件的权限,还要检查文件的父目录;运行服务器的用户可能无法读取它,因为它无法打开父目录之一。您可以使用 sudo -u www-data stat /home/franco/public/site/default.ini 之类的东西进行测试,其中 www-data 是服务器用户。
  • Frédéric,一个是key id,另一个是access key,我是从环境变量中获取的。尽管如此,问题是它试图读取该文件,即使我明确告诉它凭据。
  • Frédéric,对不起,我想我理解错了。 github.com/aws/aws-sdk-php/blob/master/src/AwsClient.php#L62 说变量是秘密和密钥。

标签: php amazon-web-services zend-framework amazon-ses aws-php-sdk


【解决方案1】:

诀窍只是从工厂参数中删除'profile' => 'default',如果已定义,我们不能使用自定义凭据文件或环境变量。没有记录,但可以正常工作。

我正在使用 Sns 和 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',
]);

【讨论】:

  • 这对我来说适用于硬编码凭据方式,尚未检查其他方式
  • 好极了。根本没有记录,并迫使我们同时使用两者。奇怪的。赞一个!
  • AWS 文档很垃圾,长篇大论什么都没有,不注重实用方法。感谢分享!
  • 我花了 4 多个小时进行故障排除,尝试了自定义凭据提供程序、环境变量和硬编码。他们都没有工作,直到我遵循这个指示。谢谢!
【解决方案2】:

此解决方案可能仅适用于您使用 SDK 版本 3 的情况。我使用类似的东西:

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

我将它用于S3ClientDynamoDbClient 和其他一些客户端,所以我假设SesClient 构造函数支持相同的参数。

【讨论】:

  • 正如我所说,“我当然尝试过 'credentials' => $provider”,但它仍然尝试读取文件。
【解决方案3】:

好的,我设法修复它。 我无法读取凭证文件,但这不完全是我的想法。 发生的事情是实际客户端已成功创建,但 try/catch 也包含 sendEmail。这就是失败的原因。 关于使用显式凭据创建客户端:如果您指定区域,it will try and read a credentials file

关于 SendEmail,this is the syntax that worked for me,我还在 AWS 文档站点中找到了另一个,但那个失败了。一定是针对旧版 SDK 的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2023-04-07
    相关资源
    最近更新 更多