![](/img/trans.png)
[英]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.