非AWS服务器使用PHP SDK上传S3 Bucket遇凭证超时错误求助
问题分析与解决
核心问题:代码中Credentials配置项存在格式错误
你的代码里'credentials '键后面多了两个空格,AWS PHP SDK无法识别这个配置项,因此会 fallback 到默认的实例元数据服务去获取凭证——而这个服务(169.254.169.254)仅AWS云内实例可访问,你的非AWS主机自然会超时。
修复步骤
1. 修正Credentials配置的键名
把带多余空格的'credentials '改为正确的'credentials',修正后的客户端初始化代码:
$this->client = new S3Client([ 'region' => $this->params->get('aws')['region'], 'version' => $this->params->get('aws')['version'], 'credentials' => [ // 这里去掉多余空格 'key' => $this->params->get('aws')['credentials']['access_key'], 'secret' => $this->params->get('aws')['credentials']['secret_key'] ] ]);
2. 补充PutObject的Body参数
你的putObject调用缺少要上传的文件内容(Body参数),SDK无法知道要上传什么文件,必须补充:
- 如果上传本地文件:
$result = $this->client->putObject([ 'Bucket' => $this->params->get('aws')['bucket_name'], 'Key' => $path.'/'.$this->generateFileKey(), 'ACL' => 'private', 'Body' => fopen('/path/to/your/local/file', 'rb') // 本地文件路径 ]);
- 如果上传内存中的内容:
$result = $this->client->putObject([ 'Bucket' => $this->params->get('aws')['bucket_name'], 'Key' => $path.'/'.$this->generateFileKey(), 'ACL' => 'private', 'Body' => '你要上传的文本内容' ]);
3. 验证IAM权限与Bucket配置
- 确保你的IAM用户拥有
s3:PutObject权限,可在IAM控制台给用户添加如下策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::你的Bucket名称/*" } ] }
- 无需修改Bucket的公开访问配置(你设置了
ACL: private,保持默认即可),只要IAM权限正确就能上传。
内容的提问来源于stack exchange,提问作者Dula
相关产品推荐
相关产品推荐

