質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1551閲覧

AWS [Python] : API Gateway + Lambdaにおいて、DynamoDBにユーザ入力情報を登録するサーバレスapp作成時の構文エラーについて

oppai

総合スコア2

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/09/19 09:49

編集2020/09/19 10:25

背景

AWS(Lambda)において、HTTPを通してユーザ入力フォーム情報をAPI Gatewayに通して、
その情報をDynamoDBにユーザ名・メールアドレスを登録する簡易サーバレスappを作っています。

ただ、それらを実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

Response: { "errorMessage": "Syntax error in module 'lambda_function'" } Request ID: "64db0245-8fb0-4252-aa39-ae5552889679" Function logs: START RequestId: 64db0245-8fb0-4252-aa39-ae5552889679 Version: $LATEST Syntax error in module 'lambda_function': invalid syntax (lambda_function.py, line 59) END RequestId: 64db0245-8fb0-4252-aa39-ae5552889679 REPORT RequestId: 64db0245-8fb0-4252-aa39-ae5552889679 Duration: 0.48 ms Billed Duration: 100 ms Memory Size: 512 MB Max Memory Used: 43 MB Init Duration: 1.03 ms

該当のソースコード

Python3

1import json 2import boto3 3import urllib.parse 4import time 5import decimal 6 7# Dynamo DB obj 8dynamodb = boto3.resource("dynamodb") 9 10# update seq num 11def next_seq(table, tablename): 12 response = table.update_item( 13 Key={ 14 "tablename" : tablename 15 }, 16 UpdateExpression="set seq = seq + :val", 17 ExpressionAttributeValues={ 18 ":val":1 19 }, 20 ReturnValues="UPDATED_NEW" 21 ) 22 return response["Attributes"]["seq"] 23 24def lambda_handler(event, context): 25 try: 26 # get seq data 27 seqtable = dynamodb.Table("sequence") 28 nextseq = next_seq(seqtable, "user") 29 print(f"nextseq:{nextseq}") 30 31 # get data from form 32 param = urllib.parse.parse_qs(event["body"]) 33 username = param["username"][0] 34 email = param["email"][0] 35 36 # get IP of Client 37 host = event["requestContext"]["identity"]["sourceIp"] 38 39 # get TimeStamp UNIX 40 now = time.time() 41 42 # regist to user TABLE 43 usertable = dynamodb.Table("user") 44 usertable.put_item( 45 Item={ 46 "id" : nextseq, 47 "username":username, 48 "email":email, 49 "accepted_at":decimal.Decimal(str(now)), 50 "host":host 51 } 52 ) 53 #JSON形式の戻り値を設定する 54 return { 55 "statusCode":200, 56 "headers":{ 57 "content-type" : "text/html" 58 }, 59 "body":"<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>Error!</body></html>" 60 } 61 62 except: 63 import traceback 64 traceback.print_exc() 65 return{ 66 "statusCode":500, 67 "headers":{ 68 "content-type":"text/html" 69 }, 70 "body":"<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>Error!</body></html>" 71 }

補足情報(FW/ツールのバージョンなど)

エラー情報がSyntax Errorなので、文法上の構造が問題だと思うのですが、、
なぜか見つかりません。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Syntax error in module 'lambda_function': invalid syntax (lambda_function.py, line 59)

とあるので、59行目を見ましょう。

python

1 "body":"<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>Error!</body></html>"

ダブルクオートでくくった文字列の中にの中にダブルクオートがそのままで入ってしまっています。

文字列の定義として使った文字を文字列として扱う場合には、バックスラッシュでエスケープする必要があります。

python

1 "body":"<!DOCTYPE html><html><head><meta charset=\"UTF-8\"></head><body>Error!</body></html>"

※手元の実行例

>>> d = "<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>Error!</body></html>" File "<stdin>", line 1 d = "<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>Error!</body></html>" ^ SyntaxError: invalid syntax >>> d = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"></head><body>Error!</body></html>" >>> d '<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>Error!</body></html>' >>>

投稿2020/09/19 10:24

attakei

総合スコア2740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oppai

2020/09/19 10:30

@attakei さん、 詳細なご回答ありがとうございます。やはり、エラーはしっかりと見なければならないことがわかりました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問