一個簡單的工具,用於將靜態網站部署到 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 雜湊以檢查實際更改,並使用它。