Les dossiers de surveillance (également appelés "drop folders" ou "hot folders") sont un outil rapide et facile pour automatiser par lots tout flux de travail basé sur des fichiers. Si vous transcodez régulièrement vos médias vers le même ensemble de formats, vous pouvez simplement déposer des fichiers bruts dans un dossier et regarder les fichiers transcodés sortir de l'autre côté. Il s'agit d'une étape courante dans les flux de post-production vidéo pour préparer les médias à l'approbation du client ou pour générer plusieurs formats de livraison en vue de la distribution.
Ce billet est un exercice d'utilisation de Lambda pour coller des ressources - déposer un fichier dans un seau S3 lancera un travail de transcodage à l'aide de l'API Zencoder, qui renverra les fichiers résultants vers S3. Cette méthode pourrait être adaptée pour automatiser d'autres étapes de votre flux de travail, par exemple en effectuant des actions supplémentaires sur les fichiers transcodés (comme la génération de notifications push ou le déplacement des fichiers vers un CDN).
Si vous êtes un développeur et que vous êtes déjà à l'aise avec AWS, vous pouvez passer directement à la fonction Lambda à l'étape 3, ou simplement récupérer le code d'exemple sur GitHub et vous lancer vous-même.
Pourquoi transcoder dans le nuage ?
Les dossiers de surveillance sont pris en charge par des encodeurs courants tels que Adobe Media Encoder, Telestream et Sorenson Squeeze. Pour l'encodage à petite échelle, l'acquisition de licences pour les produits Sorenson ou Adobe peut ne pas être rentable, et pour un volume important de contenu, la configuration et la maintenance d'une flotte de serveurs d'encodage peuvent être coûteuses et prendre beaucoup de temps.
Les outils que nous utiliserons (Zencoder, S3 et Lambda) sont peu coûteux et facturés à l'utilisation, sans coûts initiaux ni minimums, de sorte que notre dossier de veille sera rentable pour les charges à petite et grande échelle. À 0,03 $/GB pour le stockage S3 et 0,05 $/min de sortie transcodée de Zencoder (jusqu'à 0,02 $ à des volumes élevés), vous pouvez facilement estimer votre utilisation. Les fichiers de sortie étant écrits sur S3, ils sont immédiatement disponibles pour une distribution sur le web.
Comment cela fonctionne-t-il ?
Notre dossier de surveillance se trouve dans un seau Amazon S3. Le téléchargement d'un fichier dans le seau déclenchera notre fonction Lambda, qui compose et soumet une demande à l'API Zencoder pour créer une tâche d'encodage. Zencoder récupère le fichier dans S3, le transcode dans les formats de sortie que nous définirons, puis renvoie les fichiers transcodés dans S3. De là, ils peuvent être distribués à vos clients, ou même livrés directement aux utilisateurs finaux via CloudFront ou un autre CDN.
Conditions préalables
Pour ce tutoriel, vous aurez besoin d'un compte Amazon Web Services (AWS) et d'un compte Zencoder. Les niveaux gratuits des deux services suffiront pour la démonstration, bien que vous ne disposiez que de 5 Go de stockage S3 et que Zencoder tronque les sorties à 5 secondes.
Étape 1 : Configurer un panier S3
Tout d'abord, nous devons configurer le dossier de surveillance sur S3. Si vous n'avez pas encore configuré de bucket S3, connectez-vous à la console AWS et accédez au service S3. Cliquez sur "Create Bucket" et donnez-lui un nom. Les noms de seaux sont uniques pour l'ensemble du service, il est donc utile d'utiliser un préfixe unique, comme votre nom ou celui de votre entreprise.
Laissez la région sur US Standard, qui est la même que la région par défaut de Zencoder. Cela permet d'éviter les frais de transfert S3 lorsque Zencoder récupère vos fichiers. Si vous avez besoin d'utiliser un bac dans une région différente, vous pouvez ajouter le paramètre "region" à la tâche de Zencoder pour vous assurer que le transcodage est exécuté dans la même région.
Créez deux dossiers dans votre panier S3, l'un pour les fichiers que vous téléchargerez et l'autre dans lequel Zencoder téléchargera les fichiers transcodés. J'ai simplement utilisé inputs/ et outputs/.
Étape 2 : Donner à Zencoder l'accès à la base de données S3
Il y a deux façons d'accorder à Zencoder l'accès à la lecture et à l'écriture de fichiers dans votre panier S3. La manière la plus simple est d'ajouter une politique à votre panier S3 en accordant à l'utilisateur IAM de Zencoder l'accès au panier.
Dans le panneau des propriétés du seau S3, cliquez sur Permissions, puis sur Ajouter une politique de seau. Collez la politique de seau de Zencoder (disponible dans cette section Repo Github), en remplaçant les deux instances de YOUR-BUCKETavec le nom du seau spécifié à l'étape 1.
L'autre option pour permettre à Zencoder d'accéder à votre panier est de créer un fichier Utilisateur IAM avec un AmazonS3FullAccess (ou la restreindre à ce seau), puis ajouter l'ID de la clé d'accès et la clé d'accès secrète de cet utilisateur à l'onglet Section "Références" (Credentials) de votre compte Zencoder.
Étape 3 : Créer la fonction Lambda
Dans la console AWS, cliquez sur le service Lambda. Cliquez sur Create a Lambda Function (ou Get Started, si vous utilisez Lambda pour la première fois). Sautez l'étape du plan, et vous verrez l'écran Configure Function (Configurer la fonction). Donnez un nom à votre fonction (par exemple "transcode Video") et sélectionnez Python 2.7 comme runtime.
Coller le exemple de code dans la section du code de la fonction Lambda. Vous devrez modifier certaines des variables globales en haut de la page, en réglant le paramètre API\_KEY à votre Clé API Zencoder Full Access, modifier le INPUT\_FOLDER\_NAME pour qu'il corresponde au nom du dossier watch que vous avez créé dans S3, modifiez le fichier S3\_OUTPUT\_BASE\_URL au seau et au nom du dossier dans lequel vous souhaitez que les fichiers de sortie soient stockés, et définissez le paramètre NOTIFICATION\_EMAIL à une adresse email où vous souhaitez recevoir des notifications de Zencoder (si vous ne voulez pas de notifications, omettez simplement la ligne 39 de la fonction Lambda).
A propos du code dans lambda\_function.py-En fait, nous récupérons le nom du fichier qui a été téléchargé sur S3 et nous l'utilisons comme base du nom du fichier de sortie. Le fichier api\_data est le travail qui sera envoyé à Zencoder, avec toutes les sorties et les paramètres d'encodage définis. Vous pouvez modifier cet objet en fonction de vos besoins, et Zencoder fournit plusieurs modèles dans sa section Demande de constructeur. Ensuite, nous soumettons le travail au point d'extrémité de l'API Zencoder et enregistrons la réponse.
Ensuite, sélectionnez Rôle d'exécution S3 sous l'intitulé Créer un nouveau rôle. Il se peut que vous deviez activer les fenêtres contextuelles dans votre navigateur pour voir l'écran de création, qui vous invite à nommer le nouveau rôle et à cliquer sur Autoriser. Ce rôle définit le schéma de permissions sous lequel la fonction Lambda s'exécutera - dans ce cas, nous accordons à Lambda l'accès au seau S3. De retour sur l'écran Lambda, le nouveau rôle que vous avez créé devrait maintenant être sélectionné dans le champ Role.
Augmentez le délai d'attente à 10 secondes. En pratique, l'exécution de la fonction prendra rarement plus de 1500ms secondes, mais notre fonction sera plus résiliente si elle peut attendre quelques secondes supplémentaires en cas de réponse lente de l'API. Lambda facture chaque 100 ms de temps d'exécution de la fonction, nous ne le fixerons donc pas trop haut. Cliquez sur Next, puis sur Create Function. Dans l'onglet Event Sources, ajoutez une source d'événement. Sélectionnez S3 comme type, choisissez le seau S3 de l'étape 1 et définissez le type d'événement sur Object Created (All).
Dans le champ Préfixe, entrez le nom du dossier de surveillance que vous avez créé dans le seau S3 (par ex. inputs/). Cela permettra de s'assurer que la fonction Lambda n'est déclenchée que lorsque des fichiers sont ajoutés à ce dossier, et pas ailleurs dans le seau - et surtout, cela empêchera également nos fichiers de sortie de déclencher d'autres tâches d'encodage dans une boucle sans fin. Cochez Enable event source et soumettez.
C'est tout
Nous avons un bucket S3 avec un dossier de surveillance et nous avons une fonction Lambda qui reçoit des événements de création de fichiers à partir de ce dossier de surveillance, qui forme une tâche Zencoder pour transcoder ces fichiers et les déposer dans notre dossier de sortie. Téléchargez des médias dans votre dossier de surveillance pour le voir à l'œuvre.
Si vous avez besoin de dépanner, vérifiez les journaux AWS CloudWatch pour obtenir des détails sur chaque appel à votre fonction Lambda. La vue Jobs de Zencoder fournit également des détails sur chaque job et sur les erreurs qui ont pu être lancées.