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) : ./myDirectory
target
(compartiment S3 ou répertoire local) : s3://my-bucket
config
Fichier de configuration explicite (JSON ou JavaScript) : --config ./myConfig.json
include
le modèle Glob pour filtrer les fichiers (depuis la source) pour inclure : --include **/*.ext
exclude
le modèle Glob pour filtrer les fichiers (depuis la source) à exclure : --exclude **/*.ext
diffBy
Remplacer la propriété par laquelle les éléments sont comparés ( modtime
ou size
avec la valeur par défaut : modtime
) : --diffBy size
wildcardPolicy
Remplacer la politique de caractère générique ( majority
, unanimous
ou minority
avec la valeur par défaut : majority
) : --wildcardPolicy unanimous
wildcardAll
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 : --wildcardAll
invalidateDeletes
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 : --invalidateDeletes
distribution
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) : --yes
REMARQUE : 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 :
/
/css
main.css
vendor.css
/js
main.js
index.html
Éléments invalidés :
/
index.html
Chemins d'invalidation :
/*
Un chemin donné est générique lorsqu'une majorité de ses enfants sont invalidés.
Tous les éléments cibles :
/
/css
main.css
vendor.css
/js
main.js
index.html
Éléments invalidés :
/
/css
main.css
vendor.css
index.html
Chemins d'invalidation :
/css/*
/index.html
Un chemin donné est générique lorsque tous ses enfants sont invalidés.
Tous les éléments cibles :
/
/css
main.css
vendor.css
/js
main.js
index.html
Éléments invalidés :
/
/css
main.css
/js
/main.js
index.html
Chemins d'invalidation :
/css/main.css
/js/*
/index.html