เครื่องมือง่ายๆ ในการปรับใช้เว็บไซต์แบบคงที่กับ Amazon S3 และ CloudFront ด้วย Gzip และการสนับสนุนส่วนหัวแบบกำหนดเอง (เช่น "การควบคุมแคช") มันใช้แฮช 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
ตัวแปรสภาพแวดล้อม OS 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
( Unquotute ) พิเศษสำหรับฟิลด์ int
ตัวเลือก -skip-local-dirs
และ -skip-local-files
จะจับคู่กับพาธสัมพันธ์จากไดเร็กทอรีต้นทางด้วยตัวแยกพาธแบบ Unix ไดเร็กทอรีต้นทางแสดงด้วย .
ที่เหลือจะขึ้นต้นด้วย a /
ตัวเลือก -strip-index-html
จะตัด index.html จากไดเร็กทอรีทั้งหมดที่คาดหวังสำหรับรายการรูท สิ่งนี้ตรงกับตัวเลือกที่มีชื่อเดียวกัน (เกือบ) ในการปรับใช้ Hugo ซึ่งช่วยลดความยุ่งยากในการกำหนดค่าระบบคลาวด์ที่จำเป็นสำหรับกรณีการใช้งานบางกรณี เช่น การกระจาย CloudFront ที่มีต้นทางบัคเก็ต S3 ดูการประชาสัมพันธ์นี้สำหรับข้อมูลเพิ่มเติม
ไฟล์คอนฟิกูเรชัน .s3deploy.yml
ยังสามารถประกอบด้วยเส้นทางตั้งแต่หนึ่งเส้นทางขึ้นไป เส้นทางตรงกับไฟล์ที่กำหนด regexp แต่ละเส้นทางสามารถใช้ได้:
header
: ค่าของส่วนหัว สิ่งที่น่าสังเกตมากที่สุดน่าจะเป็น Cache-Control
โปรดทราบว่ารายการเมตาดาต้าที่ระบบกำหนดซึ่ง S3 รองรับในปัจจุบันและส่งกลับเป็นส่วนหัว HTTP เมื่อโฮสต์ไซต์แบบคงที่นั้นสั้นมาก หากคุณมีข้อกำหนดขั้นสูงเพิ่มเติม (เช่น ส่วนหัวด้านความปลอดภัย) โปรดดูความคิดเห็นนี้
gzip
: ตั้งค่าเป็นจริงเพื่อ gzip เนื้อหาเมื่อจัดเก็บไว้ใน 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 อนุญาต 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 เพื่อตรวจสอบการเปลี่ยนแปลงจริง และใช้สิ่งนั้นแทน