【发布时间】:2016-02-08 20:39:33
【问题描述】:
我是 AWS 的新手,正在致力于在 Python 上创建一个 lambda 函数。该函数将获取 dynamodb 表流并写入 s3 中的文件。这里文件名应该是表名。 如果触发器正在调用 lambda 函数,有人可以告诉我如何获取表名吗?
感谢您的帮助。
【问题讨论】:
标签: amazon-dynamodb aws-lambda
我是 AWS 的新手,正在致力于在 Python 上创建一个 lambda 函数。该函数将获取 dynamodb 表流并写入 s3 中的文件。这里文件名应该是表名。 如果触发器正在调用 lambda 函数,有人可以告诉我如何获取表名吗?
感谢您的帮助。
【问题讨论】:
标签: amazon-dynamodb aws-lambda
既然你提到你是 AWS 新手,我将描述性地回答。
我假设您已将 DynamoDB 表的“启用流”设置为“是”,并将其设置为 lambda 函数的事件源。
这就是我从调用我的 lambda 函数的流中获取表名的方式 -
def lambda_handler(event, context):
print(json.dumps(event, indent=2)) # Shows what's in the event object
for record in event['Records']:
ddbARN = record['eventSourceARN']
ddbTable = ddbARN.split(':')[5].split('/')[1]
print("DynamoDB table name: " + ddbTable)
return 'Successfully processed records.'
基本上,包含有关负责特定 lambda 函数调用的特定 DynamoDB 流的所有信息的 event 对象包含一个参数 eventSourceARN。此eventSourceARN 是唯一标识您的 DynamoDB 表的 ARN(Amazon 资源编号),event 从该表中发生。
这是eventSourceARN 的示例值 -
arn:aws:dynamodb:us-east-1:111111111111:table/test/stream/2020-10-10T08:18:22.385
注意上面的粗体文字 - test;这是您要查找的表名。
在上面的ddbTable = ddbARN.split(':')[5].split('/')[1] 行中,我尝试先将整个ARN 拆分为':',然后再拆分为'/',以获得值test。获得此值后,您可以调用 S3 API 以写入 S3 中具有相同名称的文件。
希望这会有所帮助。
【讨论】:
请注意,并非总是提供 eventSourceArn。从我今天的测试来看,我没有看到 eventSourceArn 出现在记录中。也可以参考链接:
【讨论】:
一种方法是在 Scala 中使用正则表达式进行模式匹配:
val ddbArnRegex: Regex = """arn:aws:dynamodb:(.+):(.+):table/(.+)/stream/(.+)""".r
def parseTableName(ddbARN: String): Option[String] = {
if (null == ddbARN) None
ddbARN match {
case ddbArnRegex(_, _, table, _) => Some(table)
case _ => None
}
}
【讨论】: