Alat sederhana untuk menerapkan situs web statis ke Amazon S3 dan CloudFront dengan dukungan Gzip dan header khusus (misalnya "Kontrol Cache"). Ia menggunakan hash ETag untuk memeriksa apakah suatu file telah berubah, yang membuatnya optimal jika dikombinasikan dengan generator situs statis seperti Hugo.
Biner yang sudah dibuat sebelumnya dapat ditemukan di sini.
s3deploy adalah aplikasi Go, jadi Anda juga dapat menginstal versi terbaru dengan:
go install github.com/bep/s3deploy/v2@latest
Untuk menginstal di MacOS menggunakan Homebrew:
brew install bep/tap/s3deploy
Catatan Keran minuman di atas saat ini berhenti di v2.8.1; lihat masalah ini untuk info lebih lanjut.
Perhatikan bahwa s3deploy
adalah alat yang sempurna untuk digunakan dengan alat integrasi berkelanjutan seperti CircleCI. Lihat ini untuk tutorial yang menggunakan s3deploy dengan CircleCI.
Daftar tanda dari menjalankan 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)
Bendera dapat diatur dalam salah satu (dalam urutan prioritas):
s3deploy -path public/
S3DEPLOY_
, misalnya S3DEPLOY_PATH="public/"
..s3deploy.yml
, misalnya path: "public/"
key
dan secret
, variabel lingkungan OS AWS_ACCESS_KEY_ID
dan AWS_SECRET_ACCESS_KEY
(dan AWS_SESSION_TOKEN
) juga akan diperiksa. Dengan cara ini Anda tidak perlu melakukan tindakan khusus apa pun untuk membuatnya berfungsi dengan AWS Vault dan alat serupa. Ekspresi variabel lingkungan di .s3deploy.yml
pada formulir ${VAR}
akan diperluas sebelum diurai:
path : " ${MYVARS_PATH} "
max-delete : " ${MYVARS_MAX_DELETE@U} "
Perhatikan sintaks @U
( Unquotute ) khusus untuk bidang int.
Opsi -skip-local-dirs
dan -skip-local-files
akan cocok dengan jalur relatif dari direktori sumber dengan pemisah jalur gaya Unix. Direktori sumber diwakili oleh .
, sisanya dimulai dengan /
.
Opsi -strip-index-html
menghapus index.html dari semua direktori yang diharapkan untuk entri root. Ini cocok dengan opsi dengan (hampir) nama yang sama di penerapan Hugo. Hal ini menyederhanakan konfigurasi cloud yang diperlukan untuk beberapa kasus penggunaan, seperti distribusi CloudFront dengan asal bucket S3. Lihat PR ini untuk informasi lebih lanjut.
File konfigurasi .s3deploy.yml
juga dapat berisi satu atau lebih rute. Rute cocok dengan file yang diberi regexp. Setiap rute dapat berlaku:
header
: Nilai header, yang paling menonjol mungkin adalah Cache-Control
. Perhatikan bahwa daftar metadata yang ditentukan sistem yang saat ini didukung dan dikembalikan S3 sebagai header HTTP saat menghosting situs statis sangat sedikit. Jika Anda memiliki persyaratan lebih lanjut (misalnya header keamanan), lihat komentar ini.
gzip
: Setel ke true untuk meng-gzip konten saat disimpan di S3. Ini juga akan mengatur Content-Encoding
yang benar saat mengambil objek dari S3.
Contoh:
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
Lihat https://docs.aws.amazon.com/sdk-for-go/api/aws/session/#hdr-Sessions_from_Shared_Config
AWS SDK
akan kembali ke kredensial dari ~/.aws/credentials
.
Jika Anda mengatur variabel lingkungan AWS_SDK_LOAD_CONFIG
, variabel tersebut juga akan memuat konfigurasi bersama dari ~/.aws/config
tempat Anda dapat mengatur region
global untuk digunakan jika tidak disediakan, dll.
{
"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>/* "
}
]
}
Ganti dengan milik Anda sendiri.
Jika Anda telah mengonfigurasi CloudFront CDN di depan bucket S3 Anda, Anda dapat menyediakan distribution-id
sebagai tanda. Ini akan memastikan cache untuk file yang diperbarui tidak valid setelah penerapan ke S3. Perhatikan bahwa pengguna AWS harus memiliki hak akses yang diperlukan.
Perhatikan bahwa CloudFront mengizinkan 1.000 jalur per bulan tanpa biaya, jadi S3deploy mencoba cerdas dalam strategi pembatalan; kami mencoba mengurangi jumlah jalur menjadi 8. Jika tidak memungkinkan, kami akan kembali ke pembatalan penuh, misalnya "/*".
{
"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" : " * "
}
]
}
Jika Anda melihat s3deploy
maka Anda mungkin sudah melihat perintah aws s3 sync
- perintah ini memiliki strategi sinkronisasi yang tidak dioptimalkan untuk situs statis, perintah ini membandingkan stempel waktu dan ukuran file Anda untuk memutuskan apakah akan mengunggah mengajukan.
Karena generator situs statis dapat membuat ulang setiap file (meskipun identik), stempel waktu diperbarui dan dengan demikian aws s3 sync
tidak perlu mengunggah setiap file. s3deploy
di sisi lain memeriksa hash etag untuk memeriksa perubahan aktual, dan menggunakannya sebagai gantinya.