Пытаюсь сделать загрузку файлов в облако, минуя свой сервер.
Вот код на php:
<?php
require '../vend/vendor/autoload.php';
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
$bucket = '***';
$IAM_KEY = '***';
$IAM_SECRET = '***';
try {
$s3 = S3Client::factory(
array(
'credentials' => array(
'key' => $IAM_KEY,
'secret' => $IAM_SECRET
),
'version' => 'latest',
'region' => 'us-east-1'
)
);
} catch (Exception $e) {
die("Error: " . $e->getMessage());
}
$formInputs = ['acl' => 'public-read'];
$options = [
['acl' => 'public-read'],
['bucket' => $bucket],
['starts-with', '$key', ''],
];
$expires = '+2 hours';
$postObject = new \Aws\S3\PostObjectV4(
$s3,
$bucket,
$formInputs,
$options,
$expires
);
$formAttributes = $postObject->getFormAttributes();
$formInputs = $postObject->getFormInputs();
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Aws S3 Direct File Uploader</title>
</head>
<body>
<form action="<?= $formAttributes['action'] ?>" method="post" enctype="multipart/form-data">
<?php
foreach ($formInputs as $key => $value) {
echo "<input type='hidden' name='$key' value='$value' />";
}
?>
<input type="file" name="file" />
<input type="submit" value="Upload File" />
</form>
CORS config:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
IAM user policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::*"
]
}
]
}
После того как форма засабмичена выдается ошибка в XML:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>1A71B86B340FAB93</RequestId>
<HostId>
4ve5duEAF5ph+o7Y57JapqU3kzqZzDEWEF6Lrb64lGY2jCZobGB19z06fXRXxI+GzmQRA83o/FU=
</HostId>
</Error>
Хочу уточнить важный момент: я пробовал сделать обычную загрузку с теми же credentials через putObject() и все проходило нормально, объект создавался в бакете. Так же через getObject() получалось скачивать объекты. Подскажите куда копать, испробовал уже все, гугл не помогает.