gpt4 book ai didi

amazon-dynamodb - 如何使用 Dynamodb Global Tables 和 Lambda@edge 选择正确的区域?

转载 作者:行者123 更新时间:2023-12-04 13:58:46 25 4
gpt4 key购买 nike

我创建了一个 Lambda 函数,它从 DynamoDB 检索一些数据,它会输出一些 JSON。我想要做的是在 lambda@edge 中运行这个函数并生成一个我可以使用 Cloudfront 缓存的响应。

我面临的问题是,我在 DynamoDB 中的数据使用全局表在(当前)两个区域(us-east-2 和 eu-west-1)中复制,而 lambda@edge 显然在许多区域中运行。

这使我无法使用 AWS_REGION来自 lambda 环境。例如,如果一个请求在 us-west-1 中运行,环境变量将反射(reflect)这一点,并且它会尝试从 us-west-1 检索数据,它实际上应该转到 us-east-2。

诚然,我还没有尝试过这个(还)我想知道我是否可以在 Route53 中设置我自己的基于延迟的路由,以在我使用的区域中的 DynamoDB 端点上说 ddb.mydomain.com,假设 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

这感觉就像它的维护比它的值(value)要多,并且依赖于我对选择的最佳区域做出假设。我还必须使我的区域列表保持最新。

我可以只使用该地区的前两个字母来限制在新数据中心稍微开放时更新它的需要,但它仍然不理想
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 中选择我的数据存在的区域。

编辑

我已经找到了 this ,已删除的 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

我从 cloudping 中获取了一份延迟数据的副本,并将以下要点拼凑在一起,目前适用。

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

这样做的缺点显然是数据陈旧。不幸的是,cloudping 的 api 对此目的来说还不够快,一旦我去远程资源获取最新数据,我也可能刚刚去任何区域的 DynamoDB 表 ¯\_(ツ)_/¯

最佳答案

关于您对全局表的最后评论;目前无法将表从特定区域重新配置为全局表。当前有两个选项,具体取决于您的表是否被复制(即包含相同的数据与否)。如果它们包含相同的数据:

  • 使用 DynamoDB 备份备份表
  • 创建一个新的全局表
  • 将表转储恢复到新的全局表

  • 如果不复制表,过程会略有不同:
  • 使用数据管道从表中导出数据
  • 创建一个新的全局表
  • 使用数据管道将转储导入全局表

  • 请注意,Data Pipeline 不支持新的按需 DynamoDB 配置。如果您要沿着这条路线走下去,您需要在导出时重新配置表以使用旧样式的配置。

    我希望这有帮助。我认为您的问题最终是关于移动到全局表,此时您的 lambda@edge 将只使用最近的表。但我不确定这是否是你需要帮助的?

    编辑:刚刚看了一眼,我现在意识到这并不能真正解决您的问题。即使使用全局表,您仍然需要指定一个区域(即从哪个区域读取,即使数据将被自动复制)。所以你的问题仍然是,哪个区域用于读/写?

    编辑:只是为了确认,您是否担心访问错误的数据库并丢失数据,或者获取最近的数据库以减少延迟?如果是前者,全局表对您来说会很好,因为当您将数据写入本地数据库时,数据将自动跨区域复制。

    关于amazon-dynamodb - 如何使用 Dynamodb Global Tables 和 Lambda@edge 选择正确的区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55524218/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com