使用AWS SAM CLI本地调用Lambda时无法访问DynamoDB问题咨询
解决SAM Local Invoke访问DynamoDB时的ResourceNotFoundException问题
这不是预期行为,本地调用时出现这个错误,通常是因为本地环境和云端环境的DynamoDB访问配置不一致导致的,下面分两种常见场景给出解决方案:
场景1:本地调用时访问云端的真实DynamoDB表
如果你的需求是直接用本地代码调用AWS云端的DynamoDB表,需要检查以下几点:
- 确保本地的AWS凭证配置正确:本地环境的
~/.aws/credentials和~/.aws/config文件要和你部署SAM用的是同一个AWS账号,并且区域设置和表所在区域匹配。你可以在调用时指定profile来明确使用的凭证:sam local invoke --profile your-aws-profile - 确认代码里的区域配置是实际表所在的区域:把代码里的
<MY REGION>替换成具体的区域值,比如'us-east-1',避免占位符导致区域不匹配。 - 检查本地凭证的权限:确保你的本地AWS用户拥有访问
example-table的权限(比如和template里的DynamoDBCrudPolicy类似的权限)。
场景2:本地调用时使用离线DynamoDB实例(推荐用于开发测试)
如果想完全离线测试,不依赖云端服务,可以用本地DynamoDB容器:
- 启动本地DynamoDB容器:用Docker运行官方的DynamoDB本地镜像:
docker run -d -p 8000:8000 amazon/dynamodb-local - 配置函数指向本地DynamoDB:
你可以直接在代码里指定端点,或者通过环境变量配置(更灵活,不用修改代码):- 方式一:修改代码添加端点配置
const dynamo = new AWS.DynamoDB.DocumentClient({ endpoint: 'http://localhost:8000', region: '<MY REGION>' }) - 方式二:在
template.yaml里添加环境变量
然后代码里读取环境变量:Resources: ExampleFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x Environment: Variables: DYNAMODB_ENDPOINT: http://localhost:8000 Policies: - DynamoDBCrudPolicy: TableName: 'example-table'const dynamo = new AWS.DynamoDB.DocumentClient({ endpoint: process.env.DYNAMODB_ENDPOINT || undefined, region: '<MY REGION>' })
- 方式一:修改代码添加端点配置
- 在本地创建测试表:用AWS CLI命令在本地DynamoDB中创建和云端结构一致的
example-table:
(注意替换成你实际表的属性定义和键架构)aws dynamodb create-table \ --table-name example-table \ --attribute-definitions AttributeName=id,AttributeType=S \ --key-schema AttributeName=id,KeyType=HASH \ --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \ --endpoint-url http://localhost:8000
为什么部署到AWS后能正常运行?
部署到AWS后,Lambda函数运行在AWS托管环境中:
- 会自动使用你在
template.yaml中配置的DynamoDBCrudPolicy权限,拥有访问指定DynamoDB表的权限。 - Lambda默认会使用所在区域的DynamoDB服务,不需要额外配置端点,所以能正常访问同区域的表。
内容的提问来源于stack exchange,提问作者reesaspieces
相关产品推荐
相关产品推荐

