Как правильно выбрать регион с помощью Dynamodb Global Tables и Lambda @ edge? - PullRequest
1 голос
/ 04 апреля 2019

Я создал функцию Lambda, которая извлекает некоторые данные из DynamoDB и выводит некоторые JSON. Я пытаюсь запустить эту функцию в lambda @ edge и создать ответ, который я могу кэшировать с помощью Cloudfront.

Проблема, с которой я сталкиваюсь, заключается в том, что мои данные в DynamoDB реплицируются (в настоящее время) в двух регионах (us-east-2 и eu-west-1) с использованием Global Tables, а lambda @ edge, очевидно, работает во многих регионах.

Это мешает мне использовать AWS_REGION из лямбда-окружения. Например, если запрос выполняется в us-west-1, переменная окружения будет отражать это, и он попытается получить данные из us-west-1, где он должен фактически перейти к us-east-2.

Хотя по общему признанию я не пробовал это (пока), я задавался вопросом, могу ли я установить собственную маршрутизацию на основе задержки в Route53, чтобы указать ddb.mydomain.com на конечных точках для DynamoDB в регионах, которые я использую, предполагая SAN сертификаты настроены это будет работать?

Я подумал, что, возможно, я смогу отобразить регионы в коде, как показано в примере ниже

const process = { env: { AWS_REGION: 'us-east-1' } };

const regions = {
  'eu-west-1': ['eu-west-1', 'eu-central-1', '...'],
  'us-east-2': ['us-west-1', 'us-east-1', '...'],
};

const activeRegions = Object.keys(regions);

const region = activeRegions.find(
  key => regions[key].includes(process.env.AWS_REGION)
) || activeRegions[0];

console.log(region) // us-east-2

Такое ощущение, что это будет больше обслуживания, чем стоит, и я полагаюсь на то, что я выбираю лучший регион. Мне также пришлось бы обновлять мой список регионов.

Я мог бы использовать только первые две буквы региона, чтобы ограничить необходимость его обновления, когда новые центры обработки данных открываются немного, но это все еще не идеально

const process = { env: { AWS_REGION: 'ca-central-1' } };

const regions = {
  'eu-west-1': ['eu', 'sa', 'ap', '...'],
  'us-east-2': ['us', 'ca', 'sa', '...'],
};

const activeRegions = Object.keys(regions);

const key = activeRegions.find(
  key => regions[key].includes(
    process.env.AWS_REGION.substring(0, 2) // Just the first 2 letters
  )
) || activeRegions[0];

console.log(key); // us-east-2

Я подозреваю, что упускаю что-то очевидное, что может позволить мне разумно выбрать регион, в котором существуют мои данные, по адресу lambda@edge.

Редактировать

С тех пор я нашел этот , мастерскую aws lambda @ edge, которая была удалена, что предполагает аналогичный подход к описанному выше. почему это было удалено, я не знаю.

function updateDynamoDbClientRegion(request) {  
    let region; 

     // Check if viewer country header is available 
    if (request.headers['cloudfront-viewer-country']) { 
        const countryCode = request.headers['cloudfront-viewer-country'][0].value;  
        region = countryToRegionMapping[countryCode];   
    }   

     // Update DynamoDB client with nearer region   
    if (region) {   
        ddb = ddbUS;    
    }   
}

readme для указанного семинара теперь просто обсуждает возможность использования глобальных таблиц для уменьшения задержки, но не дает представления о том, как выбрать ближайшую таблицу с данными.

Редактировать 2

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

https://gist.github.com/benswinburne/06a00fab330dca93ea6df2552f73850a

Недостатком этого является то, что данные устарели. API-интерфейс cloudping, к сожалению, не достаточно быстр для этой цели, и как только я перейду к удаленному ресурсу, чтобы получить обновленные данные, я с таким же успехом мог просто перейти к таблице DynamoDB в любом регионе ¯ \ _ (ツ) _ / ¯

1 Ответ

0 голосов
/ 05 апреля 2019

Относительно вашего последнего комментария о Global Tables; в настоящее время нет способа перенастроить таблицу из определенного региона в глобальную таблицу. В настоящее время существует два варианта, в зависимости от того, реплицированы ли ваши таблицы (то есть содержат ли они одинаковые данные или нет). Если они содержат одинаковые данные:

  1. Резервное копирование таблицы с помощью резервного копирования DynamoDB
  2. Создать новую глобальную таблицу
  3. Восстановить дамп таблицы в новой глобальной таблице

Если таблицы не реплицируются, процесс будет немного другим:

  1. Экспорт данных из таблиц с использованием конвейера данных
  2. Создать новую глобальную таблицу
  3. Импорт дампов в глобальную таблицу с использованием конвейера данных

Обратите внимание, что конвейер данных не поддерживает новую подготовку DynamoDB по требованию. Если вы идете по этому маршруту, вам нужно будет перенастроить таблицы, чтобы они использовали настройку старого стиля во время экспорта.

Надеюсь, это поможет. Я думаю, что ваш вопрос, в конце концов, касался перехода к глобальной таблице, после чего ваш lambda @ edge будет просто использовать ближайшую таблицу. Но я не уверен, нужна ли вам помощь?

РЕДАКТИРОВАТЬ: Только что посмотрел, и теперь я понимаю, что это не решит вашу проблему Вам по-прежнему необходимо указывать регион даже с глобальными таблицами (т. Е. С какого региона читать, даже если данные будут автоматически реплицироваться). Таким образом, ваш вопрос по-прежнему, какой регион использовать для чтения / записи?

РЕДАКТИРОВАТЬ: Просто чтобы подтвердить, вы беспокоитесь о том, чтобы попасть в неправильную БД и пропустить ваши данные, или получить ближайшую БД для уменьшения задержки? Если первое, то с глобальными таблицами все будет работать нормально, так как данные будут автоматически реплицироваться по регионам при записи в локальную БД.

...