一个简单的工具,用于将静态网站部署到 Amazon S3 和 CloudFront,并支持 Gzip 和自定义标头(例如“Cache-Control”)。它使用 ETag 哈希来检查文件是否已更改,这使得它与 Hugo 等静态站点生成器结合使用是最佳选择。
可以在此处找到预构建的二进制文件。
s3deploy是一个 Go 应用程序,因此您还可以使用以下命令安装最新版本:
go install github.com/bep/s3deploy/v2@latest
要使用 Homebrew 在 MacOS 上安装:
brew install bep/tap/s3deploy
注意上面的brew tap当前停止于v2.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} "
请注意 int 字段的特殊@U
( Unquotute ) 语法。
选项-skip-local-dirs
和-skip-local-files
将使用 Unix 样式路径分隔符与源目录中的相对路径进行匹配。源目录由 表示.
,其余部分以/
开头。
选项-strip-index-html
从除根条目之外的所有目录中删除 index.html。这与hugo部署中(几乎)相同名称的选项匹配。这简化了某些用例所需的云配置,例如具有 S3 存储桶源的 CloudFront 发行版。请参阅此 PR 了解更多信息。
.s3deploy.yml
配置文件还可以包含一个或多个路由。路由与给定正则表达式的文件相匹配。每条路线均可申请:
header
:标头值,最值得注意的可能是Cache-Control
。请注意,S3 当前支持并在托管静态站点时作为 HTTP 标头返回的系统定义元数据列表非常短。如果您有更高级的要求(例如安全标头),请参阅此评论。
gzip
:设置为 true 以便在存储在 S3 中时对内容进行 gzip 压缩。从 S3 获取对象时,这还将设置正确的Content-Encoding
。
例子:
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>/* "
}
]
}
换成你自己的。
如果您已在 S3 存储桶前面配置了 CloudFront CDN,则可以提供distribution-id
作为标志。这将确保在部署到 S3 后使更新文件的缓存失效。请注意,AWS 用户必须拥有所需的访问权限。
请注意,CloudFront 每月免费允许 1,000 个路径,因此 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 哈希以检查实际更改,并使用它。