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

В основном вы можете достичь того, чего хотите, за исключением того, что аутентифицированные запросы для управления не будут работать (или, по крайней мере, я не знаю о решении).

Я знаю, что это старый вопрос, но просто документируйте его здесь, если он помогает кому-то другому.