Простой инструмент для развертывания статических веб-сайтов в Amazon S3 и CloudFront с поддержкой Gzip и пользовательских заголовков (например, «Cache-Control»). Он использует хэши ETag для проверки того, изменился ли файл, что делает его оптимальным в сочетании с генераторами статических сайтов, такими как Hugo.
Готовые двоичные файлы можно найти здесь.
s3deploy — это приложение Go, поэтому вы также можете установить последнюю версию с помощью:
go install github.com/bep/s3deploy/v2@latest
Чтобы установить на MacOS с помощью Homebrew:
brew install bep/tap/s3deploy
Примечание. Кран заваривания выше в настоящее время останавливается на версии 2.8.1; см. этот выпуск для получения дополнительной информации.
Обратите внимание, что s3deploy
— идеальный инструмент для использования с инструментом непрерывной интеграции, таким как CircleCI. См. здесь руководство, в котором используется s3deploy с CircleCI.
Список флагов запуска 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)
Флаги могут быть установлены в одном из (в порядке приоритета):
s3deploy -path public/
S3DEPLOY_
, например S3DEPLOY_PATH="public/"
..s3deploy.yml
, например path: "public/"
key
и secret
также будут проверены переменные среды ОС AWS_ACCESS_KEY_ID
и AWS_SECRET_ACCESS_KEY
(и AWS_SESSION_TOKEN
). Таким образом, вам не нужно делать никаких специальных действий, чтобы он работал с AWS Vault и аналогичными инструментами. Выражения переменных среды в .s3deploy.yml
в форме ${VAR}
будут развернуты перед анализом:
path : " ${MYVARS_PATH} "
max-delete : " ${MYVARS_MAX_DELETE@U} "
Обратите внимание на специальный синтаксис @U
( Unquote ) для поля int.
Параметры -skip-local-dirs
и -skip-local-files
будут соответствовать относительному пути из исходного каталога с разделителями путей в стиле Unix. Исходный каталог представлен .
, остальное начинается с /
.
Опция -strip-index-html
удаляет index.html из всех каталогов, кроме корневой записи. Это соответствует варианту с (почти) тем же именем в Hugo Deployment. Это упрощает настройку облака, необходимую для некоторых случаев использования, например для раздачи CloudFront с источниками корзин S3. См. этот PR для получения дополнительной информации.
Файл конфигурации .s3deploy.yml
также может содержать один или несколько маршрутов. Маршрут соответствует файлам, заданным регулярным выражением. Каждый маршрут может применяться:
header
: значения заголовка, наиболее примечательным из которых, вероятно, является Cache-Control
. Обратите внимание, что список определяемых системой метаданных, которые S3 в настоящее время поддерживает и возвращает в виде заголовков HTTP при размещении статического сайта, очень короткий. Если у вас есть более сложные требования (например, заголовки безопасности), см. этот комментарий.
gzip
: установите значение true, чтобы сжать содержимое при сохранении в S3. Это также установит правильную Content-Encoding
при получении объекта из S3.
Пример:
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
См. https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#hdr-Sessions_from_Shared_Config.
AWS SDK
будет использовать учетные данные из ~/.aws/credentials
.
Если вы установите переменную среды AWS_SDK_LOAD_CONFIG
, она также загрузит общую конфигурацию из ~/.aws/config
, где вы можете установить глобальный region
который будет использоваться, если он не указан, и т. д.
{
"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>/* "
}
]
}
Замените на свой.
Если вы настроили CloudFront CDN перед корзиной S3, вы можете указать distribution-id
в качестве флага. Это обеспечит аннулирование кэша обновленных файлов после развертывания на S3. Обратите внимание, что пользователь AWS должен иметь необходимые права доступа.
Обратите внимание, что CloudFront позволяет бесплатно использовать 1000 путей в месяц, поэтому S3deploy старается разумно подходить к стратегии аннулирования; мы пытаемся уменьшить количество путей до 8. Если это невозможно, мы вернемся к полной инвалидации, например, «/*».
{
"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" : " * "
}
]
}
Если вы просматриваете s3deploy
, то, вероятно, вы уже видели команду aws s3 sync
— эта команда имеет стратегию синхронизации, которая не оптимизирована для статических сайтов. Она сравнивает метку времени и размер ваших файлов, чтобы решить, загружать ли их. файл.
Поскольку генераторы статических сайтов могут воссоздать каждый файл (даже если он идентичен), временная метка обновляется, и, таким образом, aws s3 sync
без необходимости будет загружать каждый отдельный файл. s3deploy
с другой стороны, проверяет хэш etag на предмет фактических изменений и вместо этого использует его.