أداة بسيطة لنشر مواقع الويب الثابتة على 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
، سيتم أيضًا التحقق من متغيرات بيئة نظام التشغيل 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. يتم تمثيل الدليل المصدر بواسطة .
والباقي يبدأ بـ /
.
يقوم الخيار -strip-index-html
بإزالة ملف Index.html من جميع الأدلة باستثناء الإدخال الجذر. يطابق هذا الخيار الذي يحمل نفس الاسم (تقريبًا) في نشر Hugo. يعمل هذا على تبسيط تكوين السحابة اللازمة لبعض حالات الاستخدام، مثل توزيعات CloudFront مع أصول حاوية S3. انظر هذا العلاقات العامة لمزيد من المعلومات.
يمكن أن يحتوي ملف التكوين .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 للتحقق من التغييرات الفعلية، ويستخدم ذلك بدلاً من ذلك.