当前位置: 首页 > 知识库问答 >
问题:

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

米丰
2023-03-14

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

我面临的问题是,使用全局表和lambda@edge显然,这在许多地区都存在。

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

虽然我承认我还没有尝试过这一点,但我想知道我是否可以在Route53中设置我自己的基于延迟的路由,比如在我使用的地区的DynamoDB的endpoint上设置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;    
    }   
}

研讨会的自述文件现在只是讨论了使用全局表来减少延迟的选择,但没有提供关于如何选择最接近的有数据的表的见解。

编辑2

我从cloudping中获取了延迟数据的副本,并拼凑了以下要点,这些要点目前仍然有效。

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

不幸的是,云计算的api对于这个目的来说不够快,一旦我去一个远程资源获取最新的数据,我可能还不如去任何一个DynamoDB表区域¯\_(ツ)_/¯

共有1个答案

壤驷升
2023-03-14

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

  1. 使用DynamoDB备份备份表

如果不复制这些表,则流程将略有不同:

  1. 使用数据管道从表中导出数据
  2. 创建一个新的全局表
  3. 使用数据管道将转储导入全局表

请注意,数据管道不支持新的按需DynamoDB配置。如果按照这条路线进行,则需要在导出时重新配置表以使用旧式资源调配。

我希望这有帮助。我认为你的问题,到最后,是关于移动到一个全球表格,在这一点上,你的lambda@edge我将使用最近的桌子。但我不确定你是否需要帮助?

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

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

 类似资料:
  • 我在两个不同的区域有两个DynamoDB表,名称相同,都支持流,都显示了全局表版本2019.11.21,一个有数据,一个为空。如果我举个例子,它们可以如下所示: 地区:美国东部1号 表格名称:MyTable 全球表格版本:2019.11.21 表中有项目:是 地区: us-East-2 表名:MyTable 全局表版本:2019.11.21 表有项:否 我使用了DynamoDB和没有任何成功。 #

  • 我有一个dynamoDb表,它设置为两个区域之间的全局(2019版)。 我在表上分配了一个lambda函数作为触发器。当一条记录插入到表的东版本中时,就会触发lambda的东版本。然后将记录复制到表的西版本,并触发lambda的西版本。 我想要一个λ触发。但是我也希望两个触发器都启用,以防一个区域出现故障。 我怎样才能做到这一点?我宁愿不使触发器逻辑幂等。

  • 希望创建一个DynamoDB全局表来存储客户信息。我的问题是,我目前的模式是监听此表上的更改,并使用Lambda触发器发送电子邮件更新。 i、 e.您的个人资料信息已更改。如果不是你。。 我现在是否需要在每个区域中使用该Lambda?数据复制是否意味着每个区域都会触发该Lambda?

  • 我是AWS DynamoDB和nosql的新手,我对表创建有问题。 我试图创建一个名为的表,具有以下属性: 用户ID(HASH) OSType(范围) MSISDN IMSI 设备ID 我不仅需要通过查询表,还需要通过以下字段查询表: MSISDN 我的逻辑如下: 通过字段查询表 在阅读了有关LSI/GSI的手册后,我很难理解如何创建表和定义这些索引。 这是我尝试使用PHP AWS SDK创建表的

  • 我正在尝试使用Node Lambda函数在日期范围之间进行扫描。我正确扫描了数据,但我似乎无法让日期表达式正确工作。 这目前并没有试图在一个范围内返回,它只是现在查看一个日期。我不想在表达式中添加一个和,直到我知道这是可行的。 我的DynamoDB中的示例文档的结构如下: 文档id是我的主键。我对Lamdba和DynamoDB的组合还很陌生,所以我可能把它完全设置错了,但这是我通过研究成功完成的。

  • AWS CLI for Dynamodb创建表在创建全局二级索引时有点混乱。在CLI文档中,它表示全局二级索引可以用以下表达式(简写)表示: 我的解释是,我应该这样做 请注意,我在这里不包括KeySchema来推断复杂性。控制台显示以下错误: 因此AWS CLI无法识别ProvisionedThroughput的映射表达式。我尝试了几种表达方式,但都没能成功。我也没有在谷歌上找到任何描述如何做的网