Загрузка больших HD - видео файлов в Amazon Web Services S3

конечная цель: загрузка больших видеофайлов (
  • производитель контента будет профессиональным пользователем, поэтому небольшая дополнительная работа с их стороны не является огромной нагрузкой. Тем не менее, держать его как можно проще для них (и меня) идеально. Будет лучше, если веб-форма может быть использована для инициирования.
  • не было бы многих сотен производителей контента, так что дополнительное время или усилия могут быть направлены на создание какой-то учетной записи или процесса для каждого отдельного производителя контента. Хотя автоматизация-это король.
  • некоторые сказали, что вы можете использовать какой-то Java-апплет или, возможно, Silverlight.
  • одна вещь, о которой я думал, это использование SFTP для загрузки сначала в EC2, а затем он будет перемещен в S3. Но это звучит как боль, которая делает его безопасным.
  • после некоторых исследований я обнаружил, что S3 позволяет обмениваться ресурсами между источниками. Так это позволяющая загружать напрямую на S3. Однако, насколько это будет стабильно с огромными файлами?
  • похоже, что S3 также допускает многопартийную загрузку.

какие идеи?

3 ответов


вы можете реализовать интерфейс практически во всем, что вы можете кодировать, чтобы говорить на родном S3 multipart upload... какой подход я бы рекомендовал для этого, из-за стабильности.

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

размер "части" по существу становится вашим перезапускаемым / повторным размером блока (win!)... таким образом, ваша интерфейсная реализация может бесконечно повторно отправлять неудачную часть, пока она не пройдет правильно. Части не должны быть загружены в порядке, они могут быть загружены параллельно, и если вы загружаете ту же часть несколько раз, более новый заменяет более старый, и с каждым блоком S3 возвращает контрольную сумму, которую вы сравниваете с локально вычисленной. Объект не становится видимым в S3, пока вы не завершите загрузку. Когда вы завершите загрузку, Если у S3 нет всех частей (что должно быть, потому что все они были признаны при загрузке), вызов finalize завершится ошибкой.

единственное, что вам нужно иметь в виду, это то, что многостраничные загрузки, по-видимому никогда время out, и если они" никогда " либо завершены/завершены, либо активно прерваны клиентской утилитой, вы заплатите за хранение загруженных блоков неполных загрузок. Таким образом, вы хотите реализовать автоматический фоновый процесс, который периодически вызывает ListMultipartUploads чтобы идентифицировать и прервать те загрузки, которые по какой-либо причине никогда не были закончены или отменены, и прервать их.

Я не знаю, насколько полезным это как ответ на ваш общий вопрос, но разработка пользовательского интерфейсного инструмента не должна быть сложным делом - API S3 очень прост. Я могу сказать это, потому что я разработал утилиту для этого (для моего внутреннего пользования ... это не вилка продукта). Я могу однажды выпустить его как открытый исходный код, но он, вероятно, не будет соответствовать вашим потребностям в любом случае-его по существу утилита командной строки, которая может использоваться автоматизированными / запланированными процессами для потоковой передачи ("труба") вывода программы непосредственно в S3 в виде серии составных частей (the файлы большие, поэтому мой размер по умолчанию составляет 64 МБ), и когда входной поток закрывается программой, генерирующей выход, она обнаруживает это и завершает загрузку. :) Я использую его для потоковой передачи резервных копий базы данных, переданных через программу сжатия, непосредственно в S3 по мере их создания, без необходимости этих массивных файлов существовать где-либо на любом жестком диске.

ваше желание иметь ровный опыт для ваших клиентов, на мой взгляд, сильно хвалит S3 multipart для роль, и если вы знаете, как код что-нибудь который может генерировать рабочий стол или браузер на основе пользовательского интерфейса, может читать локальные настольные файловые системы и имеет библиотеки для HTTP и SHA/HMAC, то вы можете написать клиент, чтобы сделать это, что выглядит и чувствует себя именно так, как вам нужно.

вам не нужно будет настраивать что-либо вручную в AWS для каждого клиента, если у вас есть серверная система, которая аутентифицирует клиентскую утилиту для вас, возможно, с помощью имени пользователя и пароля, отправленных SSL-соединение с приложением на веб-сервере, а затем предоставляет утилите клиента автоматически сгенерированные временные учетные данные AWS, которые утилита клиента может использовать для загрузки.


что-то вроде S3Browser будет работать. Он имеет GUI, командную строку и работает с большими файлами. Вы можете использовать ям чтобы создать группу, предоставьте этой группе доступ к определенному ведру S3 с помощью политики, затем добавьте пользователей IAM в эту группу.

ваша групповая политика IAM будет выглядеть примерно так:

{
    "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:GetObject",
        "s3:GetObjectAcl",
        "s3:GetObjectVersion",
        "s3:GetObjectVersionAcl",
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:PutObjectAclVersion"
      ],
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "*",
      "Condition": {}
    }
  ]
}

добавление пользователя IAM в эту группу позволит им использовать S3Browser и иметь доступ только для чтения и записи к YOUR_BUCKET_NAME. Однако, они увидят список ваших других ведер, просто не смогут читать / писать им. Вам также необходимо создать ключ доступа AWS и секрет для каждого пользователя IAM и предоставить эти 2 элемента тому, кто использует S3Browser.


можно использовать клиент Minio "mc".

вы можете отразить локальную папку в ведро S3 с помощью простой команды. Добавление этого на cron может автоматизировать эту синхронизацию с локального на удаленный S3 buck.

$ mc mirror localdir/ s3/remotedir

в качестве альтернативы вы можете проверить минио-java библиотека.

PS: Я вношу свой вклад в проект и хотел бы получить ваши ценные отзывы и вклад.