我是AWS新手并致力于在Python上创建lambda函数。该函数将获取dynamodb表流并写入s3中的文件。这里文件的名称应该是表的名称。 如果调用lambda函数的触发器,有人可以告诉我如何获取表名吗?
感谢您的帮助。
答案 0 :(得分:18)
由于您提到您是AWS新手,我将以描述性方式回答。
我假设您已将DynamoDB表的“Stream enabled”设置为“Yes”,并将其设置为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
是唯一标识发生event
的DynamoDB表的ARN(Amazon资源编号)。
这是eventSourceARN
-
ARN:AWS:dynamodb:US-东-1:111111111111:表/的测试强> /stream/2020-10-10T08:18:22.385
请注意上面的粗体文字 - 测试;这是您要查找的表名。
在上面的ddbTable = ddbARN.split(':')[5].split('/')[1]
行中,我尝试先将整个ARN拆分为':',然后再按'/'拆分,以获得值测试。获得此值后,可以调用S3 API以使用相同的名称写入S3中的文件。
希望这有帮助。
答案 1 :(得分:2)
请注意,并非始终提供eventSourceArn。从今天的测试来看,我没有看到eventSourceArn记录在案。您还可以参考链接:
答案 2 :(得分:0)
一种方法是使用正则表达式在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
}
}