سؤال

أنا أستخدم Floudfront Amazon لخدمة الملفات الثابتة من تطبيقات الويب الخاصة بي.

هل لا توجد طريقة لإخبار توزيع FloudFront الذي يحتاج إلى تحديث ملفه أو أشر إليه إلى ملف واحد يجب تحديثه؟

يوصي Amazon بإصدار ملفاتك مثل logo_1.gif، logo_2.gif وهكذا كحل مؤقت لهذه المشكلة، ولكن هذا يبدو وكأنه حل غبي جدا. لا يوجد أي طريقة أخرى على الإطلاق؟

هل كانت مفيدة؟

المحلول

أخبار جيدة. وأخيرا الأمازون أضيفت أخيرا ميزة إبطال. انظر مرجع API.

هذا طلب عينة من مرجع API:

POST /2010-08-01/distribution/[distribution ID]/invalidation HTTP/1.0
Host: cloudfront.amazonaws.com
Authorization: [AWS authentication string]
Content-Type: text/xml

<InvalidationBatch>
   <Path>/image1.jpg</Path>
   <Path>/image2.jpg</Path>
   <Path>/videos/movie.flv</Path>
   <CallerReference>my-batch</CallerReference>
</InvalidationBatch>

نصائح أخرى

اعتبارا من 19 مارس، تتيح Amazon الآن ذاكرة التخزين المؤقت ل CloudFront TTL أن تكون 0 ثانية، وبالتالي يجب أن ترى أبدا كائنات لا معنى لها. لذلك إذا كان لديك أصولك في S3، فيمكنك ببساطة الانتقال إلى لوحة الويب AWS => S3 => تحرير الخصائص => بيانات التعريف، ثم قم بتعيين قيمة "التحكم في التخزين المؤقت" الخاص بك إلى "Max-Age = 0".

هذا مستقيم من وثائق API.:

للتحكم في ما إذا كان CloudFront تخزين كائن ولماذا، نوصي باستخدام رأس التحكم ذاكرة التخزين المؤقت مع Max-Age = التوجيه. Cloudfront تخزين الكائن للعدد المحدد من الثواني. (الحد الأدنى للقيمة هو 0 ثانية.)

مع إبطال API، يتم تحديثه في بضع دقائق.
الدفع فب بازلاء.

إعداد التحديث الآلي في 5 دقائق

حسنا يا رفاق. أفضل طريقة ممكنة الآن لأداء تحديث CloudFront التلقائي (Inveltation) هي إنشاء وظيفة LambDA التي سيتم تشغيلها في كل مرة يتم فيها تحميل أي ملف إلى دلو S3 (واحد جديد أو إعادة كتابة).

حتى لو لم تستخدم وظائف Lambda من قبل، فمن السهل حقا - اتبع تعليمات خطوة بخطوة وسوف يستغرق 5 دقائق فقط:

الخطوة 1

اذهب إلى https://console.aws.amazon.com/lambda/home والنقر إنشاء وظيفة Lambda

الخطوة 2

انقر فوق وظيفة فارغة (مخصص)

الخطوه 3

انقر فوق مربع فارغ (مضطرب) وحدد S3. من combo.

الخطوة 4.

حدد الخاص بك دلو (هو نفسه بالنسبة لتوزيع cloudfront)

الخطوة 5.

وضع نوع الحدث إلى "كائن تم إنشاؤه (الكل)"

الخطوة 6.

تعيين بادئة وتحبط أو اترك الأمر فارغا إذا كنت لا تعرف ما هو عليه.

الخطوة 7.

يفحص تمكين الزناد مربع الاختيار والنقر التالي

الخطوة 8.

اسم وظيفتك (شيء مثل: yourbucketnames3tocloudfrontoncreateall.)

الخطوة 9.

يختار بيثون 2.7. (أو في وقت لاحق) كما مدة العرض

الخطوة 10.

لصق التعليمات البرمجية بدلا من رمز Python الافتراضي:

from __future__ import print_function

import boto3
import time

def lambda_handler(event, context):
    for items in event["Records"]:
        path = "/" + items["s3"]["object"]["key"]
        print(path)
        client = boto3.client('cloudfront')
        invalidation = client.create_invalidation(DistributionId='_YOUR_DISTRIBUTION_ID_',
            InvalidationBatch={
            'Paths': {
            'Quantity': 1,
            'Items': [path]
            },
            'CallerReference': str(time.time())
            })

الخطوة 11.

افتح https://console.aws.amazon.com/cloudfront/home. في علامة تبويب متصفح جديد ونسخ معرف توزيع CloudFront الخاص بك للاستخدام في الخطوة التالية.

الخطوة 12.

ارجع إلى علامة التبويب Lambda ولصق معرف التوزيع الخاص بك بدلا من _your_distribution_id_ في رمز Python. الحفاظ على الاقتباسات المحيطة.

الخطوة 13.

تعيين معالج: lambda_function.lambda_handler.

الخطوة 14.

اضغط على وظيفة combobox واختيار إنشاء دور مخصص. وبعد سيتم فتح علامة تبويب جديدة في المتصفح.

الخطوة 15.

انقر عرض وثيقة السياسة, ، انقر تعديل, ، انقر نعم واستبدال تعريف الدور مع التالي (كما هو):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
          "cloudfront:CreateInvalidation"
      ],
      "Resource": [
          "*"
      ]
    }
  ]
}

الخطوة 16.

انقر السماح. وبعد هذا سوف يعيدك إلى Lambda. تحقق مرة أخرى من هذا الاسم الذي أنشأته للتو في الدور الحالي صندوق التحرير.

الخطوة 17.

تعيين الذاكرة (MB) إلى 128 و نفذ الوقت إلى 5 ثوانى.

الخطوة 18.

انقر التالي, ، ثم اضغط إنشاء وظيفة

الخطوة 19.

يمكنك الذهاب! الآن ON، في كل مرة سوف تقوم بتحميلها / إعادة تحميل أي ملف إلى S3، وسيتم تقييمه في جميع مواقع حافة CloudFront.

PS - عندما تقوم بالاختبار، تأكد من تحميل المستعرض الخاص بك الصور من CloudFront، وليس من ذاكرة التخزين المؤقت المحلية.

PSS - يرجى ملاحظة، أن إبطال أول 1000 ملف واحد فقط إبطال شهريا مجانا، تكلف كل إبطال أكثر من 0.005 دولار أمريكي. أيضا قد يتم تطبيق رسوم إضافية لوظيفة Lambda، لكنها رخيصة للغاية.

دلو المستكشف لديه واجهة مستخدم تجعل هذا سهل جدا الآن. إليك الطريقة:

انقر بزر الماوس الأيمن فوق دلو الخاص بك. حدد "إدارة التوزيعات".
انقر بزر الماوس الأيمن فوق التوزيع الخاص بك. حدد "الحصول على قائمة إبطال cloudfront" ثم حدد "إنشاء" لإنشاء قائمة إبطال جديدة. حدد الملفات لإبطالها، وانقر فوق "إبطال". انتظر 5-15 دقيقة.

اذا كنت تمتلك بوتو المثبتة (وهذا ليس فقط من أجل Python، ولكن أيضا تثبيت مجموعة من أدوات مساعدة سطر الأوامر المفيدة)، فهو يوفر سطر أوامر يسمى بشكل خاص cfadmin أو "المسؤول الأمامي السحابي" الذي يقدم الوظيفة التالية:

Usage: cfadmin [command]
cmd - Print help message, optionally about a specific function
help - Print help message, optionally about a specific function
invalidate - Create a cloudfront invalidation request
ls - List all distributions and streaming distributions

يمكنك الاختراق الأشياء عن طريق تشغيل:

$sam# cfadmin invalidate <distribution> <path>

مجرد نشر لإبلاغ أي شخص يزور هذه الصفحة (النتيجة الأولى على "تحديث ملف CloudFront") أن هناك وصول سهل الاستخدام + Intain Inditary متوفر في Swook.net

هذا الأسفل الجديد هو:

  • عبر الإنترنت بالكامل (لا يوجد تثبيت)
  • المتاحة 24x7 (التي تستضيفها Google) ولا تتطلب أي عضوية.
  • هناك دعم التاريخ، والتحقق من المسار للسماح لك بإبطال ملفاتك بسهولة. (في كثير من الأحيان مع عدد قليل من النقرات بعد إبطال لأول مرة!)
  • انها أيضا آمنة للغاية، كما ستكتشف عند قراءة بيان نشر.

الكشف الكامل: لقد صنعت هذا. استمتع!

طريقة واحدة سهلة للغاية للقيام بذلك هي نسخة مجلد.

لذلك إذا كانت ملفاتك الثابتة مئات على سبيل المثال، فما عليك سوى وضع كل منهم في مجلد يسمى بحلول السنة + الإصدار.

على سبيل المثال، أستخدم مجلد يسمى 2014_v1 حيث لدي كل ملفات ثابتة ...

لذا داخل HTML الخاص بي أضع مرجع دائما إلى المجلد. (بالطبع لدي PHP تشمل المكان الذي قمت بتعيين اسم المجلد.) من خلال التغيير في ملف واحد، فإنه يتغير بالفعل في جميع ملفات PHP ..

إذا كنت ترغب في تحديث كامل، فإنني ببساطة أعد تسمية المجلد إلى 2014_v2 في مصدري وتغييرها داخل PHP تتضمن إلى 2014_v2

تتغير كل HTML تلقائيا واسأل المسار الجديد، CloudFront Miss ذاكرة التخزين المؤقت وطلبها إلى المصدر.

مثال: source.mydomain.com هو المصدر الخاص بي، cloudfront.mydomain.com هو CNAME إلى توزيع CloudFront.

لذلك دعا PHP هذا الملف cloudfront.mydomain.com/2012_v1/javascript.js وعندما أريد تحديث كامل، ما عليك سوى إعادة تسمية المجلد في المصدر إلى "2014_v2" وأغير PHP من خلال تعيين المجلد إلى "2014_v2" وبعد

مثل هذا لا يوجد تأخير للإبطال وليس أي تكلفة!

هذا هو أول مشاركتي في Stackoverflow، آمل أن أكون جيدا!

تعيين TTL = 1 ساعة واستبدال

http://developer.amazonwebservices.com/connect/Ann.jspa؟Annid=655.

في روبي، باستخدام جوهرة الضباب

AWS_ACCESS_KEY = ENV['AWS_ACCESS_KEY_ID']
AWS_SECRET_KEY = ENV['AWS_SECRET_ACCESS_KEY']
AWS_DISTRIBUTION_ID = ENV['AWS_DISTRIBUTION_ID']

conn = Fog::CDN.new(
    :provider => 'AWS',
    :aws_access_key_id => AWS_ACCESS_KEY,
    :aws_secret_access_key => AWS_SECRET_KEY
)

images = ['/path/to/image1.jpg', '/path/to/another/image2.jpg']

conn.post_invalidation AWS_DISTRIBUTION_ID, images

حتى عند الإبطال، لا يزال يستغرق 5-10 دقائق عن الإبطال مع معالجة وتحديث جميع خوادم Amazon Edge

إبطال CLI الحالي CLI الحالي في وضع المعاينة. قم بتشغيل ما يلي في وحدة التحكم الخاصة بك مرة واحدة:

aws configure set preview.cloudfront true

أنا نشر مشروع الويب الخاص بي باستخدام NPM. لدي البرامج النصية التالية في بلدي package.json:

{
    "build.prod": "ng build --prod --aot",
    "aws.deploy": "aws s3 sync dist/ s3://www.mywebsite.com --delete --region us-east-1",
    "aws.invalidate": "aws cloudfront create-invalidation --distribution-id [MY_DISTRIBUTION_ID] --paths /",
    "deploy": "npm run build.prod && npm run aws.deploy && npm run aws.invalidate"
}

وجود البرامج النصية أعلاه في مكان يمكنك نشر موقعك مع:

npm run deploy

إذا كنت تستخدم AWS، فربما تستخدم أيضا أداة CLI الرسمية (عاجلا أم آجلا). AWS CLI الإصدار 1.9.12 أو أعلى يدعم إبطال قائمة أسماء الملفات.

الكشف الكامل: لقد صنعت هذا. استمتع!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top