从PHP SDK获取AWS IAM凭证

3
我经常使用AWS服务,并且当我连接到Amazon时,我的PHP SDK会自动从我的ec2实例中检索凭据。
现在我有一个想要使用的库,它需要我在实例化类时包含我的AWS秘密键和访问键。
如何通过AWS PHP SDK检索当前访问令牌和秘钥,以便不将密钥硬编码到我的应用程序中?

1
秘密密钥仅在 AWS 上发布一次,一旦您离开凭据完成页面,该密钥将不再可用。您无法这样做。 - Jay Blanchard
那么我该如何避免在这个库 https://github.com/eddturtle/direct-upload 中硬编码我的密钥呢? - bertmaclin
1个回答

5
你把AWS凭证存储在哪里?在凭证文件或IAM角色中吗?
[在提供特定用例细节后进行编辑]
从你提供的链接中修改示例,使其看起来像这样。注意:我尚未测试代码,但这将接近于正确:
// 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"
);

如果您使用凭证文件,最简单的方法是在文本编辑器中打开~/.aws/credentials并提取它们。否则,请按照下面的详细信息操作。
一旦加载了访问密钥,可以按如下示例从名为“project1”的配置文件中创建一个DynamoDB客户端:在~/.aws/credentials(通常由AWS CLI创建)中存储凭证。请参见底部有关如何提取访问密钥的实际答案。
$client = new DynamoDbClient([
    'profile' => 'project1',
    'region'  => 'us-west-2',
    'version' => 'latest'
]);

然而,通常情况下,您希望SDK自动定位您的凭据。AWS SDK将按照以下顺序搜索您的凭据(不包括所有情况):

  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
]);

SDK有多个凭证提供者,这样您就可以精确控制凭证的来源。 PHP Class CredentialProvider是其中之一。
如果您提到Access Token,这意味着您正在使用STS Assume Role类型的访问。 PHP SDK也支持此功能。 只需查看STS文档即可: PHP STS Client 一旦您将凭据加载到提供程序中,就可以使用Credentials类提取三个组件(AccessKeyId,AcessKeySecret,SecurityToken): PHP Class Credentials

更具体地说,我正在尝试使用这个库 https://github.com/eddturtle/direct-upload它要求我输入我的s3_key和s3_secret。在实例化类时,我可以从哪里以编程方式获取它们? - bertmaclin
这个库看起来非常有趣和有用。我需要试着使用一下。 - John Hanley
很高兴能向您展示它。但是,我仍然遇到问题,$provider->getAccessKeyId() 返回错误:Call to undefined method Closure::getAccessKeyId()哦,回答您的问题,我已经将 IAM 角色附加到我的实例上了。有什么想法吗? - bertmaclin
是的,第三方库仍然给我带来了问题,但至少任何遇到上述获取凭据问题的人都应该有答案。如果您最终使用此库使临时凭据工作,请告诉我。 - bertmaclin
让我们在聊天中继续这个讨论 - bertmaclin
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接