Реализация геотаргетинга в CloudFront: методы и примеры кода

Геотаргетинг в CloudFront означает возможность доставлять контент на основе географического местоположения пользователя, получающего доступ к контенту. Это позволяет вам ориентироваться на определенные регионы или страны и настраивать доставку контента в зависимости от местоположения пользователя. Эта функция полезна для оптимизации работы веб-сайта, обеспечения соответствия местным нормам и предоставления персонализированного опыта пользователям в разных местах.

В CloudFront существует несколько способов реализации геотаргетинга. Вот несколько примеров:

  1. Использование заголовков геолокации CloudFront.
    CloudFront добавляет заголовки геолокации к получаемым запросам. Вы можете использовать эти заголовки в логике своего приложения, чтобы определить местоположение пользователя и соответствующим образом настроить контент. Вот пример в Node.js:

    const express = require('express');
    const app = express();
    app.get('/', (req, res) => {
     const country = req.headers['cloudfront-viewer-country'];
     if (country === 'US') {
       // Deliver US-specific content
       res.send('Welcome to the US site!');
     } else {
       // Deliver default content
       res.send('Welcome!');
     }
    });
    app.listen(3000, () => {
     console.log('Server started on port 3000');
    });
  2. Использование Lambda@Edge.
    Lambda@Edge позволяет запускать собственный код в периферийных расположениях CloudFront. Вы можете использовать эту функцию для реализации расширенной логики геотаргетинга. Например, вы можете создать функцию Lambda, которая считывает IP-адрес пользователя и определяет его местоположение на основе базы данных геолокации. Вот пример на Python:

    import json
    def lambda_handler(event, context):
     request = event['Records'][0]['cf']['request']
     country = request['headers']['cloudfront-viewer-country'][0]['value']
     if country == 'US':
       # Deliver US-specific content
       response = {
         'status': '200',
         'statusDescription': 'OK',
         'body': 'Welcome to the US site!',
       }
     else:
       # Deliver default content
       response = {
         'status': '200',
         'statusDescription': 'OK',
         'body': 'Welcome!',
       }
     return response
  3. Использование поведений CloudFront.
    Поведения CloudFront позволяют настраивать параметры кэширования и доставки контента на основе определенных путей или шаблонов. Вы можете создать несколько вариантов поведения с разными настройками и связать их с разными местоположениями. Например, вы можете настроить одно поведение для показа контента, предназначенного только для США, а другое — для остального мира.

    Вот пример настройки поведения с помощью интерфейса командной строки AWS:

    aws cloudfront create-distribution --distribution-config '{
     "CallerReference": "my-distribution",
     "DefaultCacheBehavior": {
       "TargetOriginId": "my-origin",
       "ViewerProtocolPolicy": "redirect-to-https",
       "ForwardedValues": {
         "QueryString": false,
         "Cookies": { "Forward": "none" },
         "Headers": { "CloudFront-Viewer-Country": "true" }
       },
       "TrustedSigners": { "Enabled": false },
       "AllowedMethods": {
         "Quantity": 2,
         "Items": ["GET", "HEAD"]
       }
     },
     "CacheBehaviors": {
       "Quantity": 2,
       "Items": [
         {
           "PathPattern": "/us/*",
           "TargetOriginId": "my-origin",
           "ViewerProtocolPolicy": "redirect-to-https",
           "ForwardedValues": {
             "QueryString": false,
             "Cookies": { "Forward": "none" },
             "Headers": { "CloudFront-Viewer-Country": "true" }
           },
           "TrustedSigners": { "Enabled": false },
           "AllowedMethods": {
             "Quantity": 2,
             "Items": ["GET", "HEAD"]
           }
         },
         {
           "PathPattern": "/*",
           "TargetOriginId": "my-origin",
           "ViewerProtocolPolicy": "redirect-to-https",
           "ForwardedValues": {
             "QueryString": false,
             "Cookies": { "Forward": "none" },
             "Headers": { "CloudFront-Viewer-Country": "true" }
           },
           "TrustedSigners": { "Enabled": false },
           "AllowedMethods": {
             "Quantity": 2,
             "Items": ["GET", "HEAD"]
           }
         }
       ]
     },
     "Origins": {
       "Quantity": 1,
       "Items": [
         {
           "Id": "my-origin",
           "DomainName": "example.com",
           "CustomOriginConfig": {
             "HTTPPort": 80,
             "HTTPSPort": 443,
             "OriginProtocolPolicy": "https-only"
           }
         }
       ]
     }
    }'