Websync est comme aws s3 sync avec l'invalidation automatique de CloudFront et plus encore.
La synchronisation Websync est destinée à remplacer aws s3 sync . Websync, comme l'AWS cli, synchronise les répertoires locaux avec les préfixes s3, et vice-versa. Websync étend ces fonctionnalités en créant automatiquement des invalidations optimisées sur toutes les distributions CloudFront associées et en exposant un système de configuration expressif (au-dessus de l'interface CLI) avec JSON ou JavaScript et une API de programmation.
# Install global cli, the `websync` command
npm i -g websync
# Install local
npm i websync # Parse configuration from `websync.json` or `websync.js`
websync
# Parse configuration explicitly
websync --config ./myConfig.js
# With command line options
websync ./www s3://mybucket.io
# General
websync [source] [target] [...options]source Conteneur source (répertoire local ou bucket S3) : ./myDirectorytarget (compartiment S3 ou répertoire local) : s3://my-bucketconfig Fichier de configuration explicite (JSON ou JavaScript) : --config ./myConfig.jsoninclude le modèle Glob pour filtrer les fichiers (depuis la source) pour inclure : --include **/*.extexclude le modèle Glob pour filtrer les fichiers (depuis la source) à exclure : --exclude **/*.extdiffBy Remplacer la propriété par laquelle les éléments sont comparés ( modtime ou size avec la valeur par défaut : modtime ) : --diffBy sizewildcardPolicy Remplacer la politique de caractère générique ( majority , unanimous ou minority avec la valeur par défaut : majority ) : --wildcardPolicy unanimouswildcardAll Ajoute un caractère générique à tous les chemins d'invalidation (REMARQUE : cela ne modifie pas la résolution du chemin d'invalidation), utile pour invalider les chemins de chaîne de requête : --wildcardAllinvalidateDeletes Invalide les chemins des éléments en cours de suppression de la cible. Utile dans les situations où vous ne souhaitez plus que les utilisateurs puissent accéder aux éléments : --invalidateDeletesdistribution Un ou plusieurs ID de distribution CloudFront (REMARQUE : cela remplace la découverte des distributions) : --distribution <DIST ID> --distribution <ANOTHER DIST ID>yes Ignorez toutes les invites avec une réponse « oui » (REMARQUE : websync vous avertira si plus de 500 invalidations sont effectuées, car cela nécessitera un paiement) : --yesREMARQUE : Plus d'options sont disponibles dans les fichiers de configuration
REMARQUE : tous les arguments de ligne de commande OVERRIDE les options du fichier de configuration. De plus, source et target sont obligatoires , mais peuvent être fournies par CLI ou par fichier de configuration.
Les fichiers de configuration peuvent fournir toutes les options disponibles à partir de la CLI avec l'ajout de modifiers , un système flexible pour fournir des arguments explicites aux opérations de vente S3.
L'objet modificateur du fichier de configuration est un objet dans lequel les keys sont des modèles Glob et les values sont S3.putObject Params , ou une fonction qui renvoie soit un S3.putObject Params , soit une Promise qui résout S3.putObject Params . Notez que si une fonction est fournie (asynchrone ou non), elle sera appelée avec un seul argument Item qui représentera le fichier ou l'objet du conteneur SOURCE . REMARQUE : les fichiers sources peuvent correspondre à plusieurs modificateurs, ce qui permet de garder les choses au SEC.
Paramétrage Javascript. Voir l'exemple pour le contexte.
const Path = require ( 'path' )
const DOWNLOAD_CONTENT_TYPE = 'application/octet-stream'
const DOWNLOAD_TAG = 'Downloadable'
const REDIRECT_TAG = 'Redirectable'
const makeDispositionName = fileName =>
` ${ Path . basename ( fileName ) . split ( '.' ) [ 0 ] } - ${ Date . now ( ) } ${ Path . extname ( fileName ) } `
module . exports = {
source : './public' ,
target : 's3://websync-complex-example-bucket' ,
modifiers : {
// This matches all files, provides Plain Object
'**/*' : {
Metadata : {
'source-user' : process . env . USER ,
} ,
} ,
// Matches all files in downloads, provides a synchronous function
'downloads/**/*' : item => ( {
ContentType : DOWNLOAD_CONTENT_TYPE ,
ContentDisposition : `attachment; filename=" ${ makeDispositionName ( item . key ) } "` ,
Tagging : DOWNLOAD_TAG ,
} ) ,
// Matches any file with the `.redirect` extension, provides an asynchronous funcion
'*.redirect' : async item => ( {
WebsiteRedirectLocation : ( await item . read ( ) ) . toString ( ) . trim ( ) ,
ContentType : 'text/html' ,
Tagging : REDIRECT_TAG ,
} ) ,
} ,
} Configuration JSON. Voir l'exemple pour le contexte. Dans l'exemple ci-dessous, le modèle !*.* correspond à n'importe quel élément sans extension , c'est-à-dire "une autre page", et remplace le Content-Type implicite par text/html pour avoir des chemins propres pour un simple site Web statique.
{
"source" : " ./public " ,
"target" : " s3://websync-basic-example-bucket " ,
"exclude" : " *.exclude " ,
"modifiers" : {
"!*.*" : {
"ContentType" : " text/html "
}
}
} L'objet Item de Websync est une interface qui représente de manière abstraite soit un fichier local, soit un objet S3 . En ce qui concerne le Configuration File , l'objet Item passé à une fonction modifier provient toujours du conteneur source (répertoire local ou compartiment S3 ). Tous Item adhèrent à l’interface suivante :
interface Item {
// The "key" (path or S3 Object key)
key : string
// Last modification time
modtime : Date
// Size in bytes of the Item
size : number
// Whether item is a symbolic link (always false for S3)
isSymbolicLink : boolean
// Read the *entire* body of the item
read ( ) : Promise < Buffer >
} Le système d'invalidation de Websync crée automatiquement le nombre minimal de chemins d'invalidation requis pour s'adapter à la stratégie wildcard fournie. Pour ce faire, il crée un diff du target et du source , ainsi que deux arborescences : un des éléments du diff et tous les éléments du target . Il parcourt ensuite l'arborescence diff (en commençant à la racine) et compare le nombre d'enfants qui sont invalidés avec ceux qui ne le sont pas - c'est là que la politique wildcard fait toute la différence. De plus, websync détectera quand un chemin donné qui est générique doit invalider tous ses enfants, ou uniquement ses enfants directs, produisant ainsi les chemins d'invalidation les plus optimaux.
REMARQUE : l'option wildcardAll NE modifie PAS la génération du chemin d'invalidation, mais des caractères génériques sont ajoutés à chaque chemin généré. Ceci est utile pour invalider les chemins de chaîne de requête pour un objet donné, etc.
Pour plus d'informations sur le fonctionnement des invalidations sur CloudFront, veuillez consulter la documentation AWS.
Les politiques de caractères génériques déterminent quand un chemin donné sera générique , invalidant ainsi tous ou seulement ses enfants directs afin de réduire le nombre de chemins d'invalidation générés. Les trois politiques disponibles, de la moins stricte à la plus stricte, incluent minority , majority et unanimous .
Un chemin donné est générique lorsqu'une minorité de ses enfants sont invalidés. REMARQUE : cela entraîne toujours un chemin d'invalidation /* , lorsque des invalidations sont requises.
Tous les éléments cibles :
//cssmain.cssvendor.css/jsmain.jsindex.htmlÉléments invalidés :
/index.htmlChemins d'invalidation :
/*Un chemin donné est générique lorsqu'une majorité de ses enfants sont invalidés.
Tous les éléments cibles :
//cssmain.cssvendor.css/jsmain.jsindex.htmlÉléments invalidés :
//cssmain.cssvendor.cssindex.htmlChemins d'invalidation :
/css/*/index.htmlUn chemin donné est générique lorsque tous ses enfants sont invalidés.
Tous les éléments cibles :
//cssmain.cssvendor.css/jsmain.jsindex.htmlÉléments invalidés :
//cssmain.css/js/main.jsindex.htmlChemins d'invalidation :
/css/main.css/js/*/index.html