Una herramienta sencilla para implementar sitios web estáticos en Amazon S3 y CloudFront con Gzip y soporte para encabezados personalizados (por ejemplo, "Cache-Control"). Utiliza hashes ETag para comprobar si un archivo ha cambiado, lo que lo hace óptimo en combinación con generadores de sitios estáticos como Hugo.
Los binarios prediseñados se pueden encontrar aquí.
s3deploy es una aplicación Go, por lo que también puedes instalar la última versión con:
go install github.com/bep/s3deploy/v2@latest
Para instalar en MacOS usando Homebrew:
brew install bep/tap/s3deploy
Nota El grifo de preparación de arriba actualmente se detiene en la versión 2.8.1; consulte este número para obtener más información.
Tenga en cuenta que s3deploy
es una herramienta perfecta para usar con una herramienta de integración continua como CircleCI. Consulte esto para obtener un tutorial que utiliza s3deploy con CircleCI.
La lista de indicadores al ejecutar 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)
Las banderas se pueden configurar en uno de (en orden de prioridad):
s3deploy -path public/
S3DEPLOY_
, por ejemplo, S3DEPLOY_PATH="public/"
..s3deploy.yml
, por ejemplo, path: "public/"
key
y secret
, también se verificarán las variables de entorno del sistema operativo AWS_ACCESS_KEY_ID
y AWS_SECRET_ACCESS_KEY
(y AWS_SESSION_TOKEN
). De esta manera, no necesita hacer nada especial para que funcione con AWS Vault y herramientas similares. Las expresiones de variables de entorno en .s3deploy.yml
en el formulario ${VAR}
se expandirán antes de analizarse:
path : " ${MYVARS_PATH} "
max-delete : " ${MYVARS_MAX_DELETE@U} "
Tenga en cuenta la sintaxis especial @U
( Unquoute ) para el campo int.
Las opciones -skip-local-dirs
y -skip-local-files
coincidirán con una ruta relativa desde el directorio de origen con separadores de ruta estilo Unix. El directorio de origen está representado por .
, el resto comienza con /
.
La opción -strip-index-html
elimina index.html de todos los directorios excepto la entrada raíz. Esto coincide con la opción con (casi) el mismo nombre en hugo implementar. Esto simplifica la configuración de la nube necesaria para algunos casos de uso, como las distribuciones de CloudFront con orígenes de depósitos S3. Consulte este PR para obtener más información.
El archivo de configuración .s3deploy.yml
también puede contener una o más rutas. Una ruta coincide con archivos a los que se les da una expresión regular. Cada ruta puede aplicar:
header
: valores del encabezado, el más notable probablemente sea Cache-Control
. Tenga en cuenta que la lista de metadatos definidos por el sistema que S3 actualmente admite y devuelve como encabezados HTTP cuando aloja un sitio estático es muy corta. Si tiene requisitos más avanzados (por ejemplo, encabezados de seguridad), consulte este comentario.
gzip
: configúrelo en verdadero para comprimir el contenido cuando se almacena en S3. Esto también establecerá la Content-Encoding
correcta al recuperar el objeto de S3.
Ejemplo:
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
Consulte https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#hdr-Sessions_from_Shared_Config
El AWS SDK
recurrirá a las credenciales de ~/.aws/credentials
.
Si configura la variable de entorno AWS_SDK_LOAD_CONFIG
, también cargará la configuración compartida desde ~/.aws/config
donde puede configurar la region
global que se usará si no se proporciona, 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>/* "
}
]
}
Reemplázalo por el tuyo.
Si ha configurado CloudFront CDN frente a su depósito S3, puede proporcionar el distribution-id
como indicador. Esto asegurará que se invalide el caché de los archivos actualizados después de la implementación en S3. Tenga en cuenta que el usuario de AWS debe tener los derechos de acceso necesarios.
Tenga en cuenta que CloudFront permite 1000 rutas por mes sin cargo, por lo que S3deploy intenta ser inteligente con la estrategia de invalidación; Intentamos reducir el número de rutas a 8. Si eso no es posible, recurriremos a una invalidación completa, por ejemplo "/*".
{
"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 está mirando s3deploy
, probablemente ya haya visto el comando aws s3 sync
: este comando tiene una estrategia de sincronización que no está optimizada para sitios estáticos, compara la marca de tiempo y el tamaño de sus archivos para decidir si desea cargarlos. archivo.
Debido a que los generadores de sitios estáticos pueden recrear cada archivo (incluso si son idénticos), la marca de tiempo se actualiza y, por lo tanto, aws s3 sync
cargará innecesariamente cada archivo. s3deploy
, por otro lado, verifica el hash de etag para verificar si hay cambios reales y lo usa en su lugar.