[英]not able to insert data using ZADD(sorted set ) in redis using python
[英]not able to insert data into dynamodb using python
我是无服务器框架的新手,我正在尝试使用 python 将数据放入我的 dynamodb。 但无法插入数据。 即使我没有收到任何错误。
我已经尝试了 .yml 文件的所有设置,但没有任何进展
provider:
name: aws
runtime: python3.7
environment:
DYNAMODB_TABLE: employee
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
stage: dev
region: us-east-1
functions:
create:
handler: functions/create.create
events:
- http:
path: employee
method: post
cors: true
authorizer: aws_iam
get:
handler: functions/get.get
events:
- http:
path: employee/{id}
method: get
cors: true
authorizer: aws_iam
resources:
Resources:
employee:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
- AttributeName: employeeId
AttributeType: S
KeySchema:
- AttributeName: employeeId
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:provider.environment.DYNAMODB_TABLE}
import json
import os
import logging
import boto3
dynamodb = boto3.resource('dynamodb')
logger = logging.getLogger("handler_logger")
logger.setLevel(logging.DEBUG)
def create(event, context):
data = json.loads(event['body'])
table = dynamodb.Table(os.environ['DYNAMODB_TABLE'])
logger.info(table)
item = {
'employeeId': "2",
'employeeName': "Singhs",
}
# write the todo to the database
table.put_item(Item=item)
# create a response
response = {
"statusCode": 200,
"body": json.dumps(item)
}
return response
我不确定为什么插入不起作用,代码看起来正确。 如果您收到put_item
的回复,您可以获得更多信息。 例如:
# write the todo to the database
put_response = table.put_item(Item=item)
# create a response
response = {
"statusCode": 200,
"body": json.dumps(put_response)
}
我已经部署了您的项目,只需稍作修改,它就可以工作。 意味着您的代码基本上可以正常工作,但由于您的 iAM 角色可能存在其他问题,如果您可以提供 POST 请求的结果会更好。
我的如下:
functions/create.create
,因此它可能与您的不同,但使用给定的文件,但为了使其正常工作,我需要将其作为一个简单的无服务器项目。.
├── serverless.yml
└── handler.py
service: stack1
provider:
name: aws
runtime: python3.7
environment:
DYNAMODB_TABLE: employee
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
stage: dev
region: us-east-1
functions:
create:
handler: handler.create
events:
- http:
path: employee
method: post
cors: true
get:
handler: functions/get.get
events:
- http:
path: employee/{id}
method: get
cors: true
resources:
Resources:
employee:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
- AttributeName: employeeId
AttributeType: S
KeySchema:
- AttributeName: employeeId
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:provider.environment.DYNAMODB_TABLE}
handler.py - 与 your.py 文件相同。
结果
~/prj/temp/stack> curl -X POST -H "Content-Type: application/json" -d "{}" https://u85k6*****.execute-api.us-east-1.amazonaws.com/dev/employee
{"employeeId": "2", "employeeName": "Singhs"}%
建议
看起来您的代码没有任何严重缺陷,但仍有很多点可能会导致错误。 这两个建议可能会有所帮助:
1) 捕捉任何异常并打印出来如果你使用下面的函数,你可以很容易地捕捉到那里发生的事情和调试提示。
import sys
import traceback
import os
def printException(exception, writer=None):
if writer is None:
writer = print
top = traceback.extract_tb(sys.exc_info()[2])[-1]
writer(", ".join([type(exception).__name__, str(sys.exc_info()[1]), os.path.basename(top[0]), str(top[1])]))```
if __name__ == "__main__":
try:
1/0 # just to raise an exception and see how this functions works
except Exception as e:
printException(e)
将打印异常,以便您可以在 Cloudwatch 日志中看到它。
2)在Cloudwatch中启用访问日志并查看日志——从无服务器框架v1.42.0开始,您可以在框架中启用访问日志。 只需设置以下属性:
...
provider:
...
logs:
restApi:
level: INFO
...
然后,您将很容易找到任何与 api 端点相关的错误,例如身份验证、验证或 lambda 响应格式错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.