S3 - Анонимная загрузка - префикс ключа
Я пытаюсь понять, как настроить ведро, которое обычно является приватным, но позволяет анонимные загрузки с ограничениями. Конкретными критериями являются:
- Ведро в основном закрыто и требует моего ключа/секрета для добавления/удаления/обновления/списка файлов.
- Существует "каталог" (т.е. префикс ключа), называемый "входящий", который позволит анонимным пользователям загружать контент, но не список.
- Ведро имеет однодневное истечение всего содержимого. В качестве бонуса я бы хотел, чтобы "входящий" каталог имел истечение 30 минут, хотя, если это невозможно, будет выполняться однодневное истечение для всего ведра.
- Файлы с "входящим" префиксом будут ограничены по размеру для каждого объекта.
- Я могу также ограничить объекты с помощью "входящего" префикса только определенными типами контента.
Вопросы, которые у меня есть:
- Было бы лучше просто создать два ведра. Один для моих входящих файлов и один для моей личной обработки и хранения?
- Что бы код выглядел так, чтобы файл был загружен во входящий каталог. В идеале я хотел бы избежать зависимости от библиотеки S3 и просто использовать HTTP-вызовы. Бонусные баллы, если вы можете показать мне правильное направление на этом в Ruby.:)
Истечение срока действия может быть установлено с помощью консоли управления S3, но ограничено только одним днем как наименьшим сроком действия. Могу ли я поместить десятичное число в это поле? Разрешения, похоже, применяются ко всему ведру, а не только к префиксу. Это заставляет меня думать, что мне просто нужны два ведра. Если я держусь с одним ведром, я думаю, что мне нужно создать политику IAM и применить ее к ведро, но это выходит за рамки моих ограниченных знаний о S3, и я хочу, чтобы я не оставил дыры в разрешениях, которые позволяют людям делать больше, чем я хочу.
Я нашел много документации по выполнению анонимных загрузок на S3 через сообщение формы HTTP. Я мог бы адаптировать это к коду, но мне интересно, так как я нахожусь в коде приложения (а не в сообщении HTTP-формы), есть ли более простой способ?
Ответы
Ответ 1
То, что вы описываете, может быть реализовано в одном ведре. Вы можете разрешить анонимный доступ к определенной папке с помощью политики ведра, проверьте примеры или используйте Генератор политики AWS. В вашем случае это может выглядеть примерно так:
{
"Version": "2008-10-17",
"Id": "Policy1346097257207",
"Statement": [
{
"Sid": "Allow anonymous upload to /incoming",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::[your_bucket]/incoming/*"
}
]
}
Также можно загружать файлы в свой веток анонимно, используя простую форму html:
<form action="http://[your_bucket].s3.amazonaws.com/" method="post" enctype="multipart/form-data">
<input type="hidden" name="acl" value="public-read" />
Name: <input type="text" name="key" value="incoming/[filename]" /><br/>
File: <input type="file" name="file" /> <br />
<input type="submit" name="submit" value="Upload" />
</form>
Загрузка на основе браузера S3 здесь подробно.
Ответ 2
Недавно я потратил немного времени на то, чтобы разобраться с выводами анонимных загрузок на S3 и наткнулся на этот вопрос. Я написал о решении, которое некоторое время работало на ME:
https://gist.github.com/jareware/d7a817a08e9eae51a7ea
В основном вы можете достичь того, чего хотите, за исключением того, что аутентифицированные запросы для управления не будут работать (или, по крайней мере, я не знаю о решении).
Я знаю, что это старый вопрос, но просто документируйте его здесь, если он помогает кому-то другому.