我正在整理一个拖累和放大器drop file for file uploads直接转到S3。我的工作流程是这样的:
使用密钥签署策略,如in this article所述。但是,我面临以下问题:
我显然可以做Aws::getConfig()
并从那里取出密钥,但这似乎不是一个非常干净的方法。
在EC2上部署时,我根本无法访问密钥,因为我正在使用instance roles,因此我不必将我的凭据存储在服务器本身上。
在这两种情况下,我都可以绕过SDK并手动完成,所以问题实际上是:这可以通过SDK完成,如果是这样,怎么做?
答案 0 :(得分:5)
事实证明,这只需要在API中进行一些挖掘。可以通过Aws\Common\Aws::get()
实例化的任何客户端提取凭据。
// create builder; not passing credentials here
$aws = Aws\Common\Aws::factory(array(
'region' => 'us-east-1',
));
$s3 = $aws->get('s3');
// get credentials interface
$credentials = $s3->getCredentials();
要对策略字符串进行签名,您需要一个S3Signature
的实例。根据{{3}}的文档,您似乎无法从S3Client
获取此信息,但从代码的AbstractClient::getSignature()
判断,您似乎可以。
最后一步是调用this part方法生成签名:
$policy = base64_encode(json_encode($policy_data));
$signer = $s3->getSignature();
$signature = $signer->signString($policy, $credentials);
调用内部::signString()
,在必要时从元数据服务加载必要的凭据;否则它使用传递给Aws::factory()
的凭据。
<强>更新强>
没有任何客户也可以这样做:
$credentials = Aws\Common\Credentials\Credentials::factory();
$signer = new S3Signature();
$signature = $signer->signString($policy, $credentials);