Amazon dynamodb 如何使用Dynamodb全局表和Lambda@edge?
我创建了一个Lambda函数,它从DynamoDB检索一些数据,并输出一些JSON。我要做的是在中运行这个函数lambda@edge并生成一个我可以使用Cloudfront缓存的响应 我面临的问题是,使用全局表和lambda@edge显然,这在许多地区都存在 这使我无法从lambda环境中使用AWS_REGION。例如,如果一个请求在us-west-1中运行,环境变量将反映这一点,并且它将尝试从us-west-1中检索数据,该数据实际上应该到达us-east-2 虽然我承认我还没有尝试过这一点,但我想知道我是否可以在Route53中设置我自己的基于延迟的路由,比如在我使用的地区的DynamoDB的端点上设置ddb.mydomain.com,假设设置了SAN证书,它会起作用吗 我想也许我可以根据下面的例子在代码中映射区域Amazon dynamodb 如何使用Dynamodb全局表和Lambda@edge?,amazon-dynamodb,aws-lambda-edge,Amazon Dynamodb,Aws Lambda Edge,我创建了一个Lambda函数,它从DynamoDB检索一些数据,并输出一些JSON。我要做的是在中运行这个函数lambda@edge并生成一个我可以使用Cloudfront缓存的响应 我面临的问题是,使用全局表和lambda@edge显然,这在许多地区都存在 这使我无法从lambda环境中使用AWS_REGION。例如,如果一个请求在us-west-1中运行,环境变量将反映这一点,并且它将尝试从us-west-1中检索数据,该数据实际上应该到达us-east-2 虽然我承认我还没有尝试过这一点,
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.
编辑
我找到了一个awslambda@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;
}
}
for说的研讨会现在只讨论了使用全局表来减少延迟的选项,但没有提供关于如何选择最接近的具有数据的表的见解
编辑2
我从cloudping中获取了延迟数据的副本,并拼凑了以下要点,这些要点目前仍然有效
这样做的缺点显然是数据陈旧。不幸的是,cloudping的api在这方面还不够快,一旦我去远程资源获取最新的数据,我就可能去了任何地区的DynamoDB表”\_(ツ)_/“关于您上次对全局表的评论;目前无法将表从特定区域重新配置为全局表。根据是否复制表(即是否包含相同的数据),当前有两个选项。如果它们包含相同的数据:
编辑:只是确认一下,您是否担心命中错误的数据库而丢失数据,或者获取最接近的数据库以减少延迟?如果是前者,则全局表对您来说可以正常工作,因为当您将数据写入本地数据库时,数据将自动跨区域复制。我已经有全局表,所以这不是问题e、 我需要知道要选择哪个区域。我不是在全局表中使用每个区域,所以如果我需要选择一个区域,1.数据存在的区域,2.函数运行到哪个边缘位置的延迟最小。你有没有找到一个很好的解决方案?我在上面的GIST中使用了该解决方案,但我用它制作了一个库。它在我的用例的ne