从 PHP SDK 获取 AWS IAM 凭证

ber*_*lin 3 php amazon-web-services amazon-iam aws-php-sdk

我经常使用 AWS 服务,并且当我连接 Amazon 时,我的 PHP SDK 自动从我的 ec2 实例检索凭证。

我现在有一个想要使用的库,在实例化该类时还需要包含我的 AWS 密钥和访问密钥。

如何通过 AWS PHP SDK 检索当前的访问令牌和密钥,这样我就不会将密钥硬编码到我的应用程序中?

Joh*_*ley 6

您将 AWS 凭证存储在哪里?在凭证文件或 IAM 角色中?

[在OP提供具体用例详细信息后进行编辑]

从您提供的链接中将示例修改为如下所示。注意:我还没有测试代码,但这将很接近:

// Require Composer's autoloader
require_once __DIR__ . "/vendor/autoload.php";

use Aws\Credentials\Credentials
use Aws\Credentials\CredentialProvider;
use Aws\Exception\CredentialsException;
use EddTurtle\DirectUpload\Signature;

// Use the default credential provider
$provider = CredentialProvider::defaultProvider();

$credentials = $provider()->wait();

$upload = new Signature(
    $credentials->getAccessKeyId(),
    $credentials->getSecretKey(),
    "YOUR_S3_BUCKET",
    "eu-west-1"
);
Run Code Online (Sandbox Code Playgroud)

[编辑结束]

如果您使用凭证文件,最简单的答案是在文本编辑器中打开 ~/.aws/credentials 并提取它们。否则请遵循以下详细信息。

有关加载访问密钥后如何提取访问密钥的实际答案,请参阅底部。

以下示例将使用存储在 ~/.aws/credentials 中的凭证(通常由 AWS CLI 创建)从名为“project1”的配置文件创建 DynamoDB 客户端:

$client = new DynamoDbClient([
    'profile' => 'project1',
    'region'  => 'us-west-2',
    'version' => 'latest'
]);
Run Code Online (Sandbox Code Playgroud)

但是,通常您会希望 SDK 自动找到您的凭据。AWS 开发工具包将按以下顺序搜索您的凭证(并非包括所有情况):

  1. 环境变量(AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY等)
  2. 在 ~/.aws/credentials 的默认配置文件部分
  3. EC2 IAM 角色

通常只需使用此示例并让 SDK 为您找到凭据:

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

// Use the default credential provider
$provider = CredentialProvider::defaultProvider();

// Pass the provider to the client
$client = new S3Client([
    'region'      => 'us-west-2',
    'version'     => '2006-03-01',
    'credentials' => $provider
]);
Run Code Online (Sandbox Code Playgroud)

SDK 有许多凭据提供程序,以便您可以准确控制凭据的来源。

PHP 类 CredentialProvider

其中一项是您提到访问令牌。这意味着您正在使用 STS Assume Role 类型的访问。PHP SDK 也支持这一点。只需深入研究 STS 的文档即可:

PHP STS 客户端

将凭据加载到提供程序后,您可以使用 Credentials 类来提取三个组件(AccessKeyId、AcessKeySecret、SecurityToken):

PHP 课程证书