Un outil simple pour déployer des sites Web statiques sur Amazon S3 et CloudFront avec prise en charge de Gzip et des en-têtes personnalisés (par exemple "Cache-Control"). Il utilise les hachages ETag pour vérifier si un fichier a changé, ce qui le rend optimal en combinaison avec des générateurs de sites statiques comme Hugo.
Les binaires prédéfinis peuvent être trouvés ici.
s3deploy est une application Go, vous pouvez donc également installer la dernière version avec :
go install github.com/bep/s3deploy/v2@latest
Pour installer sur MacOS à l'aide de Homebrew :
brew install bep/tap/s3deploy
Remarque Le robinet d'infusion ci-dessus s'arrête actuellement à la version 2.8.1 ; voir ce numéro pour plus d'informations.
Notez que s3deploy
est un outil parfait à utiliser avec un outil d'intégration continue tel que CircleCI. Consultez ceci pour un didacticiel qui utilise s3deploy avec CircleCI.
La liste des indicateurs issus de l'exécution de s3deploy -h
:
-V print version and exit
-acl string
provide an ACL for uploaded objects. to make objects public, set to 'public-read'. all possible values are listed here: https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl (default "private")
-bucket string
destination bucket name on AWS
-config string
optional config file (default ".s3deploy.yml")
-distribution-id value
optional CDN distribution ID for cache invalidation, repeat flag for multiple distributions
-endpoint-url string
optional endpoint URL
-force
upload even if the etags match
-h help
-ignore value
regexp pattern for ignoring files, repeat flag for multiple patterns,
-key string
access key ID for AWS
-max-delete int
maximum number of files to delete per deploy (default 256)
-path string
optional bucket sub path
-public-access
DEPRECATED: please set -acl='public-read'
-quiet
enable silent mode
-region string
name of AWS region
-secret string
secret access key for AWS
-skip-local-dirs value
regexp pattern of files of directories to ignore when walking the local directory, repeat flag for multiple patterns, default "^\/?(?:\w+\/)*(\.\w+)"
-skip-local-files value
regexp pattern of files to ignore when walking the local directory, repeat flag for multiple patterns, default "^(.*/)?/?.DS_Store$"
-source string
path of files to upload (default ".")
-strip-index-html
strip index.html from all directories expect for the root entry
-try
trial run, no remote updates
-v enable verbose logging
-workers int
number of workers to upload files (default -1)
Les indicateurs peuvent être définis dans l'un des (par ordre de priorité) :
s3deploy -path public/
S3DEPLOY_
, par exemple S3DEPLOY_PATH="public/"
..s3deploy.yml
, par exemple path: "public/"
key
et secret
, les variables d'environnement du système d'exploitation AWS_ACCESS_KEY_ID
et AWS_SECRET_ACCESS_KEY
(et AWS_SESSION_TOKEN
) seront également vérifiées. De cette façon, vous n'avez rien à faire de spécial pour le faire fonctionner avec AWS Vault et des outils similaires. Les expressions de variables d'environnement dans .s3deploy.yml
sous la forme ${VAR}
seront développées avant d'être analysées :
path : " ${MYVARS_PATH} "
max-delete : " ${MYVARS_MAX_DELETE@U} "
Notez la syntaxe spéciale @U
( Unquoute ) pour le champ int.
Les options -skip-local-dirs
et -skip-local-files
correspondront à un chemin relatif du répertoire source avec des séparateurs de chemin de style Unix. Le répertoire source est représenté par .
, le reste commence par un /
.
L'option -strip-index-html
supprime index.html de tous les répertoires attendus pour l'entrée racine. Cela correspond à l'option avec (presque) le même nom dans Hugo Deploy. Cela simplifie la configuration cloud nécessaire pour certains cas d'utilisation, tels que les distributions CloudFront avec des origines de compartiment S3. Voir ce PR pour plus d'informations.
Le fichier de configuration .s3deploy.yml
peut également contenir une ou plusieurs routes. Une route correspond aux fichiers dotés d'une expression rationnelle. Chaque itinéraire peut s'appliquer :
header
: valeurs d'en-tête, la plus notable est probablement Cache-Control
. Notez que la liste des métadonnées définies par le système que S3 prend actuellement en charge et renvoie sous forme d'en-têtes HTTP lors de l'hébergement d'un site statique est très courte. Si vous avez des exigences plus avancées (par exemple, les en-têtes de sécurité), consultez ce commentaire.
gzip
: défini sur true pour compresser le contenu lorsqu'il est stocké dans S3. Cela définira également le Content-Encoding
correct lors de la récupération de l'objet à partir de S3.
Exemple:
routes :
- route : " ^.+ \ .(js|css|svg|ttf)$ "
# cache static assets for 1 year.
headers :
Cache-Control : " max-age=31536000, no-transform, public "
gzip : true
- route : " ^.+ \ .(png|jpg)$ "
headers :
Cache-Control : " max-age=31536000, no-transform, public "
gzip : false
- route : " ^.+ \ .(html|xml|json)$ "
gzip : true
Voir https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#hdr-Sessions_from_Shared_Config
Le AWS SDK
reviendra aux informations d'identification de ~/.aws/credentials
.
Si vous définissez la variable d'environnement AWS_SDK_LOAD_CONFIG
, elle chargera également la configuration partagée à partir de ~/.aws/config
où vous pourrez définir la region
globale à utiliser si elle n'est pas fournie, etc.
{
"Version" : " 2012-10-17 " ,
"Statement" :[
{
"Effect" : " Allow " ,
"Action" :[
" s3:ListBucket " ,
" s3:GetBucketLocation "
],
"Resource" : " arn:aws:s3:::<bucketname> "
},
{
"Effect" : " Allow " ,
"Action" :[
" s3:PutObject " ,
" s3:PutObjectAcl " ,
" s3:DeleteObject "
],
"Resource" : " arn:aws:s3:::<bucketname>/* "
}
]
}
Remplacez par le vôtre.
Si vous avez configuré CloudFront CDN devant votre compartiment S3, vous pouvez fournir l' distribution-id
comme indicateur. Cela garantira l'invalidation du cache pour les fichiers mis à jour après le déploiement sur S3. Notez que l'utilisateur AWS doit disposer des droits d'accès nécessaires.
Notez que CloudFront autorise 1 000 chemins par mois sans frais, donc S3deploy essaie d'être intelligent en matière de stratégie d'invalidation ; nous essayons de réduire le nombre de chemins à 8. Si cela n'est pas possible, nous retomberons sur une invalidation complète, par exemple "/*".
{
"Version" : " 2012-10-17 " ,
"Statement" : [
{
"Effect" : " Allow " ,
"Action" : [
" s3:ListBucket " ,
" s3:GetBucketLocation "
],
"Resource" : " arn:aws:s3:::<bucketname> "
},
{
"Effect" : " Allow " ,
"Action" : [
" s3:PutObject " ,
" s3:DeleteObject " ,
" s3:PutObjectAcl "
],
"Resource" : " arn:aws:s3:::<bucketname>/* "
},
{
"Effect" : " Allow " ,
"Action" : [
" cloudfront:GetDistribution " ,
" cloudfront:CreateInvalidation "
],
"Resource" : " * "
}
]
}
Si vous regardez s3deploy
, vous avez probablement déjà vu la commande aws s3 sync
- cette commande a une stratégie de synchronisation qui n'est pas optimisée pour les sites statiques, elle compare l' horodatage et la taille de vos fichiers pour décider de télécharger ou non le fichier. déposer.
Étant donné que les générateurs de sites statiques peuvent recréer chaque fichier (même s'il est identique), l'horodatage est mis à jour et donc aws s3 sync
téléchargera inutilement chaque fichier. s3deploy
d'autre part, vérifie le hachage etag pour vérifier les modifications réelles et l'utilise à la place.