簡體   English   中英

無法使用 python 將數據插入 dynamodb

[英]not able to insert data into dynamodb using python

我是無服務器框架的新手,我正在嘗試使用 python 將數據放入我的 dynamodb。 但無法插入數據。 即使我沒有收到任何錯誤。

我已經嘗試了 .yml 文件的所有設置,但沒有任何進展

.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}

.py 文件

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 請求的結果會更好。

我的如下:

  1. 文件結構 - 您正在使用functions/create.create ,因此它可能與您的不同,但使用給定的文件,但為了使其正常工作,我需要將其作為一個簡單的無服務器項目。
.
├── serverless.yml
└── handler.py
  1. serverless.yml - 添加“服務”屬性並刪除您的授權人以在未經任何授權的情況下調用它。
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}
  1. handler.py - 與 your.py 文件相同。

  2. 結果

~/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM