Meu entendimento da sua solução me leva a pensar que você deseja usar o mesmo servidor ubuntu que você já tem para realizar também a transcodificação de seus arquivos de mídia carregados.
O problema é que objetos armazenados no S3 não são acessíveis como arquivos em um sistema de arquivos normal, você pode baixar o arquivo do S3 e processá-lo na instância do servidor web, mas seria uma configuração complicada e potencialmente ineficiente.
Seria melhor desacoplar o processo de transcodificação do seu servidor Ubuntu e deixar que isso acontecesse no verdadeiro estilo da nuvem. A melhor solução para isso é eventos S3 e Lambda.
Portanto, com base no meu entendimento do seu caso de uso, aqui está o que eu recomendaria para sua solução:
- Crie um bloco com as permissões apropriadas para receber arquivos (melhor não torná-lo público ou suas contas ficarem caras)
- Crie um evento do S3 para acionar o Lambda quando um objeto for criado / colocado / atualizado (dependendo do que você deseja desencadear e de como os arquivos são colocados no S3)
- Use o lambda para processar seu arquivo ou peça ao Lambda que inicie uma instância que tenha um script UserData que fará o trabalho.
Com relação ao UserData da instância, veja as etapas que você pode realizar:
- faça o download do ffmpeg
- instale o ffmpeg
- baixe do s3 o arquivo (você pode passar este argumento do lambda)
- processa o arquivo usando o ffmpeg
- faça o upload do arquivo para s3
- use o serviço de metadados ec2 para procurar o ID da instância da instância
- execute o comando aws cli para encerrar uma instância fornecendo o ID da instância resolvida.
Poderia ser melhor criar uma AMI que já tenha o ffmpeg instalado, mas você precisaria decidir se é mais barato gastar 5 minutos sysprep cada instância ou pagar por uma AMI para sempre estar disponível. Eu diria que, a menos que o processamento demore mais de uma hora ou o caso de uso precise que o arquivo seja retornado o mais rápido possível, seria melhor instalar o ffmpeg toda vez como contas da AWS por horas inteiras, mesmo que você use apenas 15 minutos. >
Recomendações para esta abordagem:
É provável que você deseje realizar outras atividades quando o arquivo recém-processado for criado, então por que não usar os eventos s3 para disparar outro processo do Lambda? :)
Além disso, para ajudar a manter as coisas limpas, se sua solução permitir, tente enviar seus arquivos criados para s3 em um caminho de chave diferente para onde você colocou os arquivos enviados.
Opção alternativa: usar transcodificador elástico
Uma opção alternativa é fazer uso do serviço AWS Elastic Transcoder. Você deve enviar trabalhos para o transcodificador da mesma maneira, acionando o lambda quando um bucket do S3 é atualizado e fazendo com que ele processe os arquivos nesse bucket. O Elastic Transcoder pode, então, notificar uma fila do SNS que, então, pode acionar um email ou outra consulta do Lambda para lidar com o arquivo criado.
Elastic Transcoder seria uma abordagem mais legal e provavelmente melhor, mas exigirá um pouco mais de trabalho.
O Elastic Transcoder exige que você crie um pipeline e crie um trabalho usando esse pipeline. Eu te ligarei o JavaScript SDK para cada um.
CreatePipline link
CreateJob link
Uma solução alternativa alternativa: use o Amazon SQS
Se você quiser que o processamento ocorra na instância do ubuntu em vez de girar outra instância a partir do Lambda, você poderá usar os eventos S3 para acionar o lambda para publicar uma tarefa no Amazon SQS.
O Amazon SQS permitirá que um agente de sua própria criação faça uma pesquisa no Amazon SQS para trabalhos que permitirão que você faça referência a um arquivo em s3 que precise de transcodificação. Isso é bastante complicado e eu só o incluo por completo e a menos que você realmente precise executar este trabalho na instância do ubuntu que você já tem.