AWS Türkçe Blog
AWS WAF Bot Kontrolü ve Amazon CloudFront ile arama motorları için içerik nasıl optimize edilir?
Orijinal makale: Link (Paul Le Page)
Sitenizi arama motorlarında listelemek için kullanılan ve özel bir bot türü olan arama motoru tarayıcıları (crawler, örümcek olarak da adlandırılırlar) siteniz için oldukça önemli ziyaretçilerdir. Bu tarayıcılar, içeriğinizin son kullanıcılar tarafından aranabilir olmasını sağlar. Bir arama motoru tarayıcısının içeriğinizi kolayca okuyamaması durumunda içeriğinizde yaptığınız güncellemeler arama sonuçlarına hemen yansımayabilir. Bu durum arama motorunun kullandığı algoritmalara bağlı olarak arama sonuçlarında hangi sırada görüntülendiğinizi, yani arama sıralamanızı da etkileyebilir.
Bu sebeple arama motoru tarayıcılarının içeriğinizi ek bir işlem yapmadan okuyabildiğinden ve içeriğinize olabildiğince hızlı bir şekilde erişebildiğinden emin olmak önemlidir.
Bu yazıda, arama motorlarının sorun yaşayabileceği içerik türlerinden ve bu sorunları çözmek için kullanabileceğiniz yöntemlerden bahsedeceğim. Arama motorlarını nasıl tespit edebileceğinizi ve bunun içeriğinizi bir İçerik Teslim Ağı’nda (Content Delivery Network – CDN) önbelleğe alabilmeniz üzerindeki etkisini tartışacağım. Ardından, arama motorlarını güvenilir bir şekilde tanımlamak için AWS Web Application Firewall (WAF) Bot Kontrolü’nü ve tanımladığınız arama motorlarını içeriğinizin optimize edilmiş bir sürümüne yönlendirmek için Lambda@Edge ile Amazon CloudFront’u nasıl kullanacağınızı ve tüm bunları yaparken CDN önbellek kullanımınızı en üst düzeye nasıl çıkarabileceğinizi anlatacağım.
W3Techs’e göre bugün tüm web sitelerinin yaklaşık %97’si JavaScript kullanıyor. JavaScript kullanımı, aksi takdirde statik olacak web sitelerinin kullanıcının tarayıcısında kod çalıştırarak duyarlı (responsive) web uygulamalarına dönüşebilmesine olanak sağlar. JavaScript genellikle istemci tarafında oluşturma (client-side rendering) olarak da bilinen, HTML içeriğin üretilip tarayıcı üzerinde görüntülenmesi için kullanılır. Ayrıca Tek Sayfalık Uygulamalar (Single Page Applications) kullanıcı uygulama ile etkileşimde girdikçe içerik üretmek için kapsamlı bir şekilde JavaScript kullanır.
JavaScript gerçek kullanıcılar için harikadır, peki ya arama motoru tarayıcıları? Çoğu arama motorları JavaScript ile uyumlu olsa da genellikle içeriği ayrıştırmadan önce işleyebilmek için ek işlemler gerçekleştirmeleri gerekir. Ancak tüm arama motoru tarayıcıları bu işlemleri her zaman başarılı şekilde yapamaz. Arama motoru tarayıcılarının genellikle sınırlı zaman ve işlem gücü kaynağı bulunduğundan sıklıkla sayfayı oluşturmadan önce kuyruğa alarak, sayfa oluşturma işlemi tamamlandığında ayrıştırma işlemini gerçekleştirirler. Bu durum içeriğinizin yayınlandıktan sonra arama sonuçlarında görüntülenmesini geciktirebilir. Bu sebepten dolayı arama motorları kendilerine JavaScript sunmak yerine dinamik içerik (dynamic rendering) oluşturmanızı önerir.
Arama motorlarına dinamik içerik oluşturmayı kullanabilmek için öncelikle arama motorlarını tespit etmeniz gerekir. Bunu yapmanın en yaygın yolu kullanıcı aracısı başlığını (user-agent header) incelemektir. Bu başlık değeri ziyaretçinin bir arama motoru tarayıcısı olduğunu belirttiğinde, arama motorunu içeriğinizin uygun halini sunabilen bir sürümüne (örn. statik HTML) yönlendirebilirsiniz.
Bir CDN çözümü kullanıyorsanız, arama motorlarını tespit etmek için kullanıcı aracısı başlığını kullanmak önbelleğe almayı etkiler. Kullandığınız CDN çözümü, kullanıcı aracısı başlığındaki farklı her değer için her nesnenin farklı bir sürümünü sunmasına ihtiyaç duyacaktır. Başka bir deyişle, kullanıcı aracısı başlığının önbellek anahtarının bir parçasını oluşturması gereklidir. Buradaki sorun, kullanıcı aracı başlığı için olası sayısız farklı değerin (milyonlarca) bulunmasıdır. CDN çözümünün tüm nesneler için kullanıcı aracısındaki her değere karşılık kaynağa istekte bulunması gerekir. Bu durum kaynak sunucuların daha fazla isteğe yanıt vermesini gerektireceğinden sunucuların çalıştırma maliyetini artırır. Dahası, kullanıcı isteklerinin önbellekten karşılanması ihtimalinin daha düşük olması ve kullanıcıların talep ettikleri nesnenin kaynak sunucudan getirilmesi için beklemeleri gerekeceğinden, kullanıcılar için yanıt süreleri artacaktır. Diğer bir deyişle, önbellek isabet oranınız daha düşük olacaktır.
AWS WAF Bot Kontrolü’nü kullanarak kullanıcı aracısı başlığını incelemeye veya CDN için önbellek anahtarına bu başlığı eklemeye gerek duymadan arama motoru tarayıcılarını doğru bir şekilde tespit edebilirsiniz.
AWS WAF Bot Kontrolü bir botun kaynak ve amacını belirlemek için HTTP isteklerini analiz eder. Botları tanımlayabilir ve türlerine göre kategorize edebilir (örn. kazıyıcı – scraper, SEO, tarayıcı – crawler veya site izleyici). Bot Kontrolü bir botu tanımladığında, ilgili isteğe daha sonra özel bir WAF kuralında kullanabileceğiniz bir etiket (label) ekler.
Şimdi size trafiğinizi etiketlemek için AWS WAF Bot Kontrolü’nü nasıl etkinleştireceğiniz konusunda yol göstereceğim. Etiketleri değerlendirerek Bot Kontrolü’nün bir arama motorunu tespit etmesi durumunda yeni bir özel istek başlığı ekleyecek özel bir WAF kuralının nasıl yapılandırılacağını öğreneceksiniz. Ayrıca bir CloudFront dağıtımı için özel başlığınızı önbellek anahtarına nasıl ekleyeceğinizi de öğreneceksiniz.
Ek olarak özel başlığı incelemek için Lambda@Edge kullanarak bot trafiğini alternatif bir kaynağa (örn. statik HTML sunmak üzere yapılandırılmış bir kaynak) nasıl gönderebileceğinizi öğreneceksiniz.
Son konfigürasyonu aşağıdaki şekilde kurgulayacağız:
- Hem gerçek kullanıcılar hem de botlar bir CloudFront dağıtımına istekte bulunur.
- AWS WAF, botları tespit etmek için Bot Kontrolü’nü kullanarak tüm istekleri inceler ve isteklere etiket ekler.
- AWS WAF etiketleri inceler ve bir arama motorunun istekte bulunduğunu belirlediği durumda isteğe özel bir HTTP başlığı ekler.
- CloudFront kaynaktan nesne talep ettiğinde, Lambda@Edge isteği inceleyerek özel başlığı arar. Özel başlığı bulması durumunda, kaynağı değiştirerek CloudFront’a isteği bot için optimize edilmiş kaynağa göndermesini iletir. CloudFront diğer tüm istekleri varsayılan kaynağa gönderir.
Bu örnekte kaynağı değiştiriyor olsanız da, tek bir kaynak kullanarak web sitesi sürümleri (gerçek kullanıcı için veya bot için optimize edilmiş) arasında farklı yöntemlerle ayrım yapmak mümkündür. Örneğin URI yolunu değiştirerek veya bir HTTP istek başlığını kullanarak da bu ayrımı gerçekleştirebilirsiniz. Bu konuda Re:Invent 2021’deki Düşük Gecikmeli Web Steleri Oluşturma oturumundan daha detaylı bilgi alabilirsiniz.
Ayrıca arama motorları genellikle dinamik içerik karşılamadığından, önbellek kontrol başlığı kullanarak statik HTML içeriğiniz için Yaşam Süresi (Time-to-Live, TTL) değerini maksimize edebilirsiniz. Bu yöntem, arama motorlarının içeriğinizi CDN önbelleğinden alma şansını artıracağından daha hızlı yanıt süreleri sağlar ve arama motorları hızlı yanıtları tercih etme eğiliminde olduğundan SEO sıralamanızı iyileştirebilir.
Tam çözüm
Bir WAF WebACL Oluşturma
Bu bölümde, yeni bir WAF WebACL oluşturacak ve botları tespit edebilmek için Amazon Bot Kontrolü’nü yapılandıracaksınız. Bot Kontrolü bir arama motoru tarayıcısı belirlediğinde yeni bir istek başlığı eklemek üzere özel bir kural da oluşturacaksınız.
Yeni bir WebACL oluşturmak ve Amazon Bot Kontrolü’nü yapılandırmak için:
- AWS Management Console üzerinde oturum açın ve buradan AWS WAF konsoluna geçiş yapın.
- Gezinti çubuğunda WebACLs’i seçin ve ardından Create web ACL seçeneğini tıklayın.
- Web ACL details iletişim kutusunda aşağıdaki işlemleri yapın::
- Resource type için CloudFront distributions seçin.
- Name alanına bir isim girin (örn. SearchBot-ACL) ve bir Cloudwatch metric name belirleyin.
- Next seçeneği ile ilerleyin.
- Rules iletişim kutusunda Add rules ve Add managed rule groups seçenekleri ile ilerleyin.
- AWS managed rule groups iletişim kutusunu genişletin ve Bot Control’un yanındaki Add to web ACL seçeneğini aktif edin.
Bot Kontrolü’nün ücretli bir kural grubu olduğunu fark edeceksiniz, fiyatlandırma bilgilerini bu linkten inceleyebilirsiniz.
Varsayılan olarak bu kural grubunun tüm bot trafiğini engelleyeceğini unutmayın. Bot Kontrolü’nün herhangi bir isteği engellemeden değerlendirme yapması için bu yapılandırmayı değiştireceksiniz.
- Add to web ACL altındaki Edit butonunu seçin.
- Set all rule actions to count seçeneğini açın.
- Sayfanın en alt bölümünde Save Rule’u seçin.
- Sayfanın en alt bölümünde Add Rules’u seçin.
Bot Kontrolü, çeşitli botları ve bot kategorilerini tanımlar ve tanımlamaya bağlı olarak isteklere etiket ataması yapar. Uygulamalarınıza yönelik bot trafiği üzerinde ayrıntılı denetim için diğer WAF kurallarındaki etiketleri kullanabilirsiniz. Bu adımda, özel bir kuraldaki etiketleri değerlendirmek için AWS WAF’i yapılandıracak ve Bot Kontrolü bir arama motoru tarayıcısı tanımlarsa yeni bir istek başlığı ekleyeceksiniz.
Etiketleri değerlendirmek ve bir başlık eklemek üzere özel bir kural tanımlamak için (görsel kural oluşturucu):
- Add rules and rule groups sayfasında, Add rules ve Add my own rules and rule groups seçenekleri ile ilerleyin.
- Kuralınızı oluşturmak için görsel kural oluşturucuyu kullanın:
- Name alanına bir isim girin (örn. Add-Bot-Header)
- Type alanında Regular Rule seçin.
- If a request alanında, Matches at least one of the statements (OR) seçeneğini tıklayın.
- Statement 1 iletişim kutusunda aşağıdaki şekilde ilerleyin:
- Inspect alanında Has a label seçin.
- Match scope alanında Label seçin.
- Match key için awswaf:managed:aws:bot-control:bot:category:search_engine seçin.
- Statement 2 iletişim kutusunda aşağıdaki şekilde ilerleyin:
- Inspect alanında Has a label seçin.
- Match scope alanında Label seçin.
- Match key için awswaf:managed:aws:bot-control:bot:category:seo seçin.
- Action iletişim kutusunda aşağıdaki şekilde ilerleyin:
- Action alanında Allow seçin.
- Custom request alanını genişleterek Add new custom header seçin.
- Key alanına bir başlık ismi girin (örn. SearchBot).
AWS WAF’in özel başlık adınızın önüne otomatik olarak x-amzn-waf- eklediğini unutmayın.
-
-
- Value alanında True seçin.
-
- Sayfanın en alt bölümünde Add Rule seçin.
Etiketleri değerlendirmek ve bir başlık eklemek üzere özel bir kural yapılandırmak için (kural json düzenleyicisi):
- Add rules and rule groups sayfasında Add rules ve Add my own rules and rule groups seçin.
- Rule builder alanında Rule JSON Editor seçin.
- Aşağıdaki JSON kod parçasını kopyalayıp konsoldaki düzenleyiciye yapıştırın:
- Sayfanın en alt bölümünde Add Rule’u seçin.
Yeni oluşturduğunuz WebACL’i tamamlamak için::
- Default web ACL action for requests that don’t match any rules iletişim kutusunda Default action için Allow seçin.
- Kalan sayfalardaki varsayılan değerleri seçmek için üç kez Next seçin.
- Create web ACL seçin.
Bu aşamada AWS WAF’i çeşitli botları tespit edip raporlamak ve arama motoru botlarından gelen isteklere x-amzn-waf-searchbot: true şeklinde yeni bir istek başlığı eklemek üzere yapılandırmış oldunuz.
Şimdi x-amzn-waf-searchbot başlığının varlığını kontrol etmek ve bu başlık varsa ilgili isteği yeni özel bir kaynağa göndermek üzere yeni bir Lambda@Edge fonksiyonu oluşturucaksınız.
Lambda@Edge fonksiyonu oluşturma
Lambda@Edge fonksiyonu oluşturmak için:
- Buradan Lambda konsoluna ulaşın
N.Virginia (us-east-1) bölgesini kullanmanız gerektiğini unutmayın. Detaylı bilgi için burayı tıklayın.
- Create Function seçeneğini tıklayın.
- Author from scratch seçeneğini tıklayın.
- Basic Information iletişim kutusunda aşağıdaki şekilde ilerleyin:
- Function name alanında fonksiyonunuz için bir isim belirleyin (örn. Egde-SearchBots).
- Runtime için Node.js 16.x seçin.
- Architecture için x86_64 seçin.
- Permissions altında Change default execution role seçeneğini genişletin.
- Execution role için Create a new role from AWS policy templates seçin.
- Role name alanında rolünüz için bir isim belirleyin (örn. EdgeLambda-role).
- Policy templates için Basic Lambda@Edge permissions (for Cloudfront trigger) seçin.
- Create function’ı seçin.
Lambda@Edge için gereken izinler hakkında daha fazla bilgi için burayı tıklayın.
- Code source iletişim kutusundaki örnek kodu aşağıdaki şekilde değiştirin:
- Kod bloğunun içerisindeki seo-origin.example.com tanımını, arama motoru tarayıcılarından istek alması gereken bir kaynağın DNS tanımı ile değiştirin. Port, protocol ve timeouts gibi diğer ayarları kaynağınıza uygun şekilde girdiğinizden emin olun.
- Kodunuzu dağıtmak için Deploy seçeneğini tıklayın.
- Actions, Publish New Version seçeneklerini tıklayın.
- Version description için uygun bir açıklama girin (örn. v1).
- Publish seçeneğini tıklayın.
Bu adımın fonksiyon kodunuzun CloudFront tarafından kullanılabilmesi için Lambda@Edge’in kodu birden fazla AWS bölgesinde çoğullamasına izin vermesi için gerekli olduğunu unutmayın.
- Fonksiyonunuzun yeni sürümü yayınlandıktan sonra, CloudFront davranışını yapılandırırken ihtiyaç duyacağınızdan dolayı Function ARN değerini bir yere not edin.
Bu adımda bir Labda@Edge fonksiyonuna ve bir WebACL’e sahipsiniz. Ancak bu aşamada ikisi de bir CloudFront dağıtımıyla ilişkilendirilmediğinden henüz kullanımda değiller.
CloudFront dağıtımı ile ilişkilendirmeden önce, x-amzn-waf-searchbot olarak yeni oluşturduğunuz başlığınızı uygun CloudFront davranışlarıyla ilgili olan önbellek politikasına eklemelisiniz. Bu işlem CloudFront’un başlık değerine bağlı olarak her nesnenin farklı bir kopyasını saklamasını sağlar. Başlık yalnızca ‘true’ ve ‘false’ olarak iki değer alabileceğinden, CloudFront her nesne için birinde başlık değeri ‘true’, diğerinde ‘false’ olacak şekilde nesnenin iki kopyasını saklayacaktır. Bu yöntem olası sayısız değer taşıyacak kullanıcı aracısı başlığından çok daha verimlidir.
Bu örnekte x-amzn-waf-searchbot başlık değerini içeren yeni ve özel bir önbellek politikası oluşturmayı öğreneceksiniz. İhtiyaçlarınıza bağlı olarak diğer ayarları düzenlemeniz veya mevcut bir özel politikaya bu özel başlığı eklemeniz gerekebilir.
Özel bir önbellek politikası oluşturma
Özel bir önbellek politikası oluşturmak için:
- Buradan CloudFront konsoluna ulaşın.
- Gezinti panelinde, Policies seçeneği ile ilerleyin.
- Custom policies iletişim kutusunda Create cache policy’i seçin.
- Name alanına bir isim girin (örn. Cache-Searchbot-Header).
- Cache key settings iletişim kutusunda aşağıdaki işlemleri yapın:
- Headers alanında Include the following headers seçin.
- Add Header alanında Add custom seçin.
- Custom header için x-amzn-waf-searchbot’u girin.
- Add ile ilerleyin.
- Create’i seçin.
Bu aşamada CloudFront dağıtımınıza yeni özelliği eklemek üzere tüm bileşenleriniz hazır olacaktır.
Yeni özelliği CloudFront dağıtımınıza ekleme
WebACL ve Lambda@Edge fonksiyonunuzu ve önbellek politikanızı mevcut bir CloudFront dağıtımı ile ilişkilendirmek için:
- Buradan CloudFront konsoluna erişin.
- Yeni özelliği uygulamak istediğiniz CloudFront dağıtımına ait ID’yi seçin.
- Settings iletişim kutusunda Edit’i seçin.
- AWS WAF web ACL alanında daha önce oluşturduğunuz WebACL’i seçin (örn. SearchBot-ACL).
- Sayfanın en alt bölümünde Save changes’i seçin.
- Behaviors sekmesini seçin.
- Bu özelliği uygulamak istediğiniz davranışı seçip Edit’i tıklayın.
- Cache key and origin request için aşağıdaki adımları izleyin:
- Cache policy and origin request policy (recommended)‘i seçin.
- Cache policy için daha önce oluşturduğunuz politikayı seçin (örn. Cache-Searchbot-Header).
- Function Associations için aşağıdaki adımları izleyin:
- Origin request için Lambda@Edge’i seçin.
- Function ARN / Name için fonksiyon sürümünüze ait daha önce kopyaladığınız ARN değerini girin.
- Save changes‘i seçin.
Yaptığınız değişiklikler birkaç dakika sonra tüm CloudFront uç konumlarına yayılmış olacak ve arama motoru botları özel kaynağınıza gönderilecektir.
TestingTest etme
Yapılandırmanızı doğru bir şekilde test etmek için, bir arama motoruna uygulamanıza gerçek bir istek göndermesi için talimat vermelisiniz. AWS WAF Bot Kontrolü’nün arama motorları için doğrulama gerçekleştirmesi nedeniyle test için kullanıcı aracısı başlığını taklit edemezsiniz (spoofing). Ayrıca CloudFront x-amzn-waf-searchbot başlığını kaldıracağı için isteğinize bu başlığı ekleyerek de test gerçekleştiremezsiniz.
Google ve Microsoft web sitenizdeki bir URL için canlı test yapabileceğiniz konsollar sunmaktadır.
Google ile test etmek için:
- Arama konsoluna erişin.
- URL Inspection’ı seçin.
- Daha önce değiştirdiğiniz bir CloudFront davranışı ile eşleşecek bir URL değeri girin.
- Test Live URL ve View tested page’i seçin.
Microsoft ile test etmek için:
- Navigate to the URL Inspection function in Webmaster Tools. Webmaster Tools içerisindeki URL Inspection fonksiyonuna erişin.
- Daha önce değiştirdiğiniz bir CloudFront davranışı ile eşleşecek bir URL değeri girin.
- Sırasıyla Inspect, Live URL ve View Tested Page’i seçin.
Arama motoruna sunulan sayfa içeriğinin beklentilerinize uygun olduğundan emin olun. HTML görünümü, gerçek kullanıcılara sunulan javascript etkin olan sürüm yerine, sayfanın statik sürümünü göstermelidir.
Sonuç
Arama motoru tarayıcılarını tespit etmek için AWS WAF Bot Kontrolü’nü kullanarak, yalnızca kullanıcı aracısı başlığına güvenmek yerine kullanabileceğiniz güçlü bir yönteminiz var.
AWS WAF Bot Kontrolü tarafından trafiğe uygulanan etiketlere bağlı olarak AWS WAF’e yeni ve özel bir istek başlığı eklemekle, CloudFront’ta önbellek anahtarını optimize etmiş oldunuz (önbellek anahtarına kullanıcı aracısı eklemeye kıyasla). Bu çözüm içeriğinizin önbellekten sunulma olasılığını artırmakla beraber, kaynağınızına iletilmesi gereken istek sayısını azaltır.
İstek başlığını uygulama kodunuz içerisinde incelemek yerine, bu işlemi Lambda@Edge üzerine taşıdınız ve bu sayede artık arama motoru trafiğini uygulamanızın HTML içeriğini oluşturmak üzere yapılandırılmış farklı bir örneğine yönlendirebilir hale geldiniz. Dahası, önbellek kontrol başlığını (cache-control header) kullanarak CloudFront önbelleğindeki HTML içeriğinizin TTL değerini artırabilirsiniz. Kaynağın önbellek kontrol başlığını ekleyememesi veya değiştirememesi durumunda Lambda@Edge kullanarak bu işlemi optimize edebilirsiniz.
Tüm bu işlemler, içeriğinizin mümkün olan en düşük yanıt süresi ile arama motoru tarayıcılarına en uygun biçimde iletilmesinin yanı sıra gerçek kullanıcılar için JavaScript tabanlı sayfa içeriklerini kullanmaya devam etmenizi sağlar.