Uma ferramenta simples para implantar sites estáticos no Amazon S3 e CloudFront com Gzip e suporte a cabeçalhos personalizados (por exemplo, "Cache-Control"). Ele usa hashes ETag para verificar se um arquivo foi alterado, o que o torna ideal em combinação com geradores de sites estáticos como o Hugo.
Binários pré-construídos podem ser encontrados aqui.
s3deploy é um aplicativo Go, então você também pode instalar a versão mais recente com:
go install github.com/bep/s3deploy/v2@latest
Para instalar no MacOS usando Homebrew:
brew install bep/tap/s3deploy
Nota A torneira de preparação acima atualmente para na v2.8.1; consulte este problema para obter mais informações.
Observe que s3deploy
é uma ferramenta perfeita para usar com uma ferramenta de integração contínua como o CircleCI. Veja isto para um tutorial que usa s3deploy com CircleCI.
A lista de sinalizadores da execução 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)
Os sinalizadores podem ser definidos em um dos seguintes (em ordem de prioridade):
s3deploy -path public/
S3DEPLOY_
, por exemplo, S3DEPLOY_PATH="public/"
..s3deploy.yml
, por exemplo, path: "public/"
key
e secret
, as variáveis de ambiente do sistema operacional AWS_ACCESS_KEY_ID
e AWS_SECRET_ACCESS_KEY
(e AWS_SESSION_TOKEN
) também serão verificadas. Dessa forma, você não precisa fazer nada especial para que funcione com o AWS Vault e ferramentas semelhantes. As expressões de variáveis de ambiente em .s3deploy.yml
no formato ${VAR}
serão expandidas antes de serem analisadas:
path : " ${MYVARS_PATH} "
max-delete : " ${MYVARS_MAX_DELETE@U} "
Observe a sintaxe especial @U
( Unquoute ) para o campo int.
As opções -skip-local-dirs
e -skip-local-files
corresponderão a um caminho relativo do diretório de origem com separadores de caminho no estilo Unix. O diretório de origem é representado por .
, o resto começa com um /
.
A opção -strip-index-html
remove index.html de todos os diretórios esperados para a entrada raiz. Isso corresponde à opção com (quase) mesmo nome no hugo deploy. Isso simplifica a configuração da nuvem necessária para alguns casos de uso, como distribuições do CloudFront com origens de bucket S3. Veja este PR para mais informações.
O arquivo de configuração .s3deploy.yml
também pode conter uma ou mais rotas. Uma rota corresponde a arquivos com um regexp. Cada rota pode aplicar:
header
: Valores do cabeçalho, o mais notável é provavelmente Cache-Control
. Observe que a lista de metadados definidos pelo sistema que o S3 suporta atualmente e retorna como cabeçalhos HTTP ao hospedar um site estático é muito curta. Se você tiver requisitos mais avançados (por exemplo, cabeçalhos de segurança), consulte este comentário.
gzip
: definido como true para compactar o conteúdo quando armazenado no S3. Isso também definirá a Content-Encoding
correta ao buscar o objeto do S3.
Exemplo:
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
O AWS SDK
retornará às credenciais de ~/.aws/credentials
.
Se você definir a variável de ambiente AWS_SDK_LOAD_CONFIG
, ela também carregará a configuração compartilhada de ~/.aws/config
onde você pode definir a region
global a ser usada se não for fornecida, 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>/* "
}
]
}
Substitua pelo seu próprio.
Se você configurou o CloudFront CDN na frente do bucket S3, poderá fornecer o distribution-id
como um sinalizador. Isso invalidará o cache dos arquivos atualizados após a implantação no S3. Observe que o usuário da AWS deve ter os direitos de acesso necessários.
Observe que o CloudFront permite 1.000 caminhos por mês gratuitamente, portanto, o S3deploy tenta ser inteligente quanto à estratégia de invalidação; tentamos reduzir o número de caminhos para 8. Se isso não for possível, recorreremos a uma invalidação completa, por exemplo, "/*".
{
"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" : " * "
}
]
}
Se você está olhando para s3deploy
, provavelmente já viu o comando aws s3 sync
- este comando tem uma estratégia de sincronização que não é otimizada para sites estáticos, ele compara o carimbo de data e hora e o tamanho de seus arquivos para decidir se deseja fazer upload do arquivo.
Como os geradores de sites estáticos podem recriar todos os arquivos (mesmo que idênticos), o carimbo de data e hora é atualizado e, portanto, aws s3 sync
fará upload desnecessário de cada arquivo. s3deploy
por outro lado, verifica o hash etag para verificar se há alterações reais e o usa.