获取使用AWS CDK创建的dynamo表的名称



使用这里的示例。我可以创建一个表和可以访问该表的lambda函数。但是我需要知道表的名称,以便使用table.put添加记录。

短期我在dynamo_table_props中声明表名,然后将其导出到lambda作为环境变量。然而,这违背了声明名称的最佳实践。

我尝试访问模式属性,但找不到正确的语法。

我的工作是:

from aws_solutions_constructs.aws_iot_lambda_dynamodb import IotToLambdaToDynamoDB
from aws_cdk import (
aws_iot as iot,
aws_lambda as _lambda,
Stack
)
from constructs import Construct
IotToLambdaToDynamoDB(self, 'test-iot-lambda-dynamodb-stack',
lambda_function_props=_lambda.FunctionProps(
code=_lambda.Code.from_asset('lambda'),
runtime=_lambda.Runtime.PYTHON_3_9,
handler='index.handler',
environment={ 
'TABLE_NAME':'hard_coded_table_name'
},
),
iot_topic_rule_props=iot.CfnTopicRuleProps(
topic_rule_payload=iot.CfnTopicRule.TopicRulePayloadProperty(
rule_disabled=False,
description="Processing of DTC messages from the AWS Connected Vehicle Solution.",
sql="SELECT * FROM 'connectedcar/dtc/#'",
actions=[]
)
),
dynamo_table_props=ddb.TableProps(
partition_key={'name': 'id', 'type': ddb.AttributeType.STRING},
table_name='hard_coded_table_name'))

将表名指定为Lambdas环境变量并不违反最佳实践。

"在结构和堆栈内部查找环境变量是一种常见的反模式。">

这说明在CDK堆栈中使用环境变量是一种反模式。

绝对可以使用Lambdas环境变量来存储表名。另一种方法是使用参数存储,并在运行时从Lambda函数获取值。

您引用的最佳实践"不声明名称";是关于CDK的方面,你可以使用一个"名称道具",因为你做了。这只是违反最佳实践,因为它阻止您的堆栈作为相同帐户中的复制环境被重新部署(并且在某些命名情况下,如s3,名称必须是全局唯一的)

通常,通过使用变量+通用名称来解决这个问题是非常好的-即table_name="${environment}-hard-coded-name",然后在部署时将其传递到堆栈中(使用上下文标志或参数存储或类似的方式在cdk synth运行时检索它们)

或者,如果你不关心人类可读的名称,cdk中的每个Resource都是一个类对象。

根据文档,您可以使用yourTable.tableName

引用表名。我以前从未使用过IotToLambdaToDynamoDB构造,但快速查看似乎表明您可以在实例化后直接访问表和lambda。

意味着你可以这样做:

yourIot.function.addEnvironment("dynamoDbName", yourIot.Table.tableName)

(引用函数属性和物联网模式属性)

我在这篇AWS博客文章中找到了答案的提示。

当您为构造调用函数时,您必须将其分配给一个变量,在本例中我使用iotToLambdaToDynamo。然后,下面代码的最后一行从构造中提取表名,并将其作为环境变量注入到lambda中。

from aws_solutions_constructs.aws_iot_lambda_dynamodb import 
IotToLambdaToDynamoDB
from aws_cdk import (
aws_iot as iot,
aws_lambda as _lambda,
Stack
)
from constructs import Construct
iotToLambdaToDynamo = IotToLambdaToDynamoDB(self, 'test-iot-lambda-dynamodb-stack',
lambda_function_props=_lambda.FunctionProps(
code=_lambda.Code.from_asset('lambda'),
runtime=_lambda.Runtime.PYTHON_3_9,
handler='index.handler',
),
iot_topic_rule_props=iot.CfnTopicRuleProps(
topic_rule_payload=iot.CfnTopicRule.TopicRulePayloadProperty(
rule_disabled=False,
description="Processing of DTC messages from the AWS Connected Vehicle Solution.",
sql="SELECT * FROM 'connectedcar/dtc/#'",
actions=[]
)
),
iotToLambdaToDynamo.lambda_function.add_environment("TABLE_NAME", iotToLambdaToDymamo.dynamo_table.table_name)

最新更新