我正在使用无服务器框架创建DynamoDB表,然后我想从Lambda函数访问它。
在serverless.yml
文件中,我有以下环境变量和CF资源的定义。
我所期望的是一个名为accounts-api-dev-accounts
的表,但cloudformation堆栈为我创建的是accounts-api-dev-accounts-SOME_RANDOM_LETTERS_AND_NUMBERS_SUFFIX
。
在我的lambda函数中,环境变量DYNAMODB_ACCOUNTS_TABLE_NAME
暴露给没有SOME_RANDOM_LETTERS_AND_NUMBERS_SUFFIX
部分的函数。CF堆栈应该添加一个随机后缀吗?如何实际检索正确的表名?
service:
name: accounts-api
provider:
...
stage: ${opt:stage, 'dev'}
environment:
DYNAMODB_ACCOUNTS_TABLE_NAME: '${self:service}-${self:provider.stage}-accounts'
以及以下CF资源:
Resources:
AccountsTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: ${env:DYNAMODB_ACCOUNTS_TABLE_NAME}
AttributeDefinitions:
- AttributeName: customerNumber
AttributeType: S
- AttributeName: accountNumber
AttributeType: S
KeySchema:
- AttributeName: customerNumber
KeyType: HASH
- AttributeName: accountNumber
KeyType: RANGE
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
也许在创建表定义时环境变量还没有更新?我不确定。
尝试${self:provider.environment.DYNAMODB_ACCOUNTS_TABLE_NAME}
而不是${env:DYNAMODB_ACCOUNTS_TABLE_NAME}
。
我还没有看到这种行为(部署后的随机字符(,当必须替换表时,这可能是一种强制唯一性的方法。您可以使用另一个环境变量,并由表资源的输出填充值。这样,CloudFormation将向Lambda环境变量注入实际的资源名称。我还没有尝试过,但这将是我的第一次";转到";。
environment:
DYNAMODB_ACCOUNTS_TABLE_NAME: '${self:service}-${self:provider.stage}-accounts'
ACTUAL_DYNAMODB_ACCOUNTS_TABLE_NAME:
Ref: AccountsTable