Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon dynamodb 如何使用Dynamodb全局表和Lambda@edge?_Amazon Dynamodb_Aws Lambda Edge - Fatal编程技术网

Amazon dynamodb 如何使用Dynamodb全局表和Lambda@edge?

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 虽然我承认我还没有尝试过这一点,

我创建了一个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证书,它会起作用吗

我想也许我可以根据下面的例子在代码中映射区域

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表”\_(ツ)_/“

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

  • 使用DynamoDB备份备份表
  • 创建一个新的全局表
  • 将表转储还原到新的全局表中
  • 如果不复制这些表,则流程将略有不同:

  • 使用数据管道从表中导出数据
  • 创建一个新的全局表
  • 使用数据管道将转储导入全局表
  • 请注意,数据管道不支持新的按需DynamoDB资源调配。如果您采用这种方式,则需要在导出时重新配置表以使用旧式资源调配

    我希望这会有所帮助。我想你的问题,到最后,是关于移动到一个全球会议桌,在这一点上,你的lambda@edge我会用最近的桌子,但我不确定你是否需要帮助

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


    编辑:只是确认一下,您是否担心命中错误的数据库而丢失数据,或者获取最接近的数据库以减少延迟?如果是前者,则全局表对您来说可以正常工作,因为当您将数据写入本地数据库时,数据将自动跨区域复制。

    我已经有全局表,所以这不是问题e、 我需要知道要选择哪个区域。我不是在全局表中使用每个区域,所以如果我需要选择一个区域,1.数据存在的区域,2.函数运行到哪个边缘位置的延迟最小。你有没有找到一个很好的解决方案?我在上面的GIST中使用了该解决方案,但我用它制作了一个库。它在我的用例的ne