无法使用我的 SAM 应用程序访问 DynamoDB

Posted

技术标签:

【中文标题】无法使用我的 SAM 应用程序访问 DynamoDB【英文标题】:Not able to access DynamoDB with my SAM app 【发布时间】:2020-11-10 14:20:50 【问题描述】:

我正在尝试从本地的 SAM 应用程序连接到 DynamoDB。我能够启动 dynamodb 服务器,并且能够通过我的 python 文件连接它,引用这个 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Python.01.html

导入 json 导入 boto3 从 boto3.dynamodb.conditions 导入密钥 从 pprint 导入 pprint

导入请求

从 botocore.exceptions 导入 ClientError

def put_movie(title, year, plot, rating, dynamodb=None): 如果不是 dynamodb: dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")

table = dynamodb.Table('Movies')
response = table.put_item(
   Item=
        'year': year,
        'title': title,
        'info': 
            'plot': plot,
            'rating': rating
        
    
)
return response

def fun1(): movie_resp = put_movie("大新电影", 2015, “什么都没有发生。”, 0) print("放电影成功:") pprint(movie_resp)

def lambda_handler(事件,上下文): """示例纯 Lambda 函数

Parameters
----------
event: dict, required
    API Gateway Lambda Proxy Input Format

    Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

context: object, required
    Lambda Context runtime methods and attributes

    Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

Returns
------
API Gateway Lambda Proxy Output Format: dict

    Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
"""

# try:
#     ip = requests.get("http://checkip.amazonaws.com/")
# except requests.RequestException as e:
#     # Send some context about this error to Lambda Logs
#     print(e)

#     raise e
fun1()

s1 = "Hello there"
return 
    "statusCode": 200,
    "body": json.dumps(
        #"message": "hello world",
        "message" : s1
        # "location": ip.text.replace("\n", "")
    ),


    

我收到此错误: enter image description here

这是我的 YAML 文件: enter image description here 在此处输入图片说明

【问题讨论】:

【参考方案1】:

如果您使用的是本地 DynamoDB,则需要在创建资源时设置端点 URL。

dynamodb = boto3.resource('dynamodb', endpoint_url="http://localhost:8000")

【讨论】:

【参考方案2】:

如果您已经创建了一个 DynamoDB 表并让它运行,则不需要在 put_movie 函数的第 3 行中使用 endpoint 参数。因此该函数应如下所示:

import boto3

def put_movie(title, year, plot, rating, dynamodb = None):
    if not dynamodb:
        dynamodb = boto3.resource('dynamodb')
    
    table = dynamodb.Table('Movies')

    response = table.put_item(
        Item = 
            'year': year,
            'title': title,
            'info': 
                'plot': plot,
                'rating': rating
                
            
        )
    return response

参考文档:https://boto3.amazonaws.com/v1/documentation/api/latest/guide/dynamodb.html#using-an-existing-table

【讨论】:

以上是关于无法使用我的 SAM 应用程序访问 DynamoDB的主要内容,如果未能解决你的问题,请参考以下文章

需要啥安全访问模块 (SAM)?

映射 SAM L10 设备的中断处理程序

SAM命令失败:ImportError:无法导入名称AliasedEventEmitter

Atmel SAM4S8B:无法进入编程模式

USB 问题 SAM3S-EK -> 自定义卡

使用 SAM 模块存储安全密钥