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

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

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

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

Q&A

0回答

1343閲覧

AWS lambdaで作成した関数のエラー

MaeharaKenji

総合スコア86

AWS Lambda

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

0グッド

0クリップ

投稿2022/11/15 03:05

編集2022/11/15 21:37

追記11/16

コメント欄でアドバイス頂き、追加コードをreturnの前に配置することでエラーを回避できました。
しかし、メールアドレス入力・登録サイトで”登録”ボタンを押しても、何も反応がありません。
cloudwatchで確認しても何もログが記録されていません。
現在はreturn内に何もない状態が問題でしょうか?
追加・修正方法等教えて下さい。

現在のWEBサイトのhtml文も掲載します。

python

1(省略) 2 3 sendmail(email, "登録ありがとうございました", mailbody) 4 5 6 7 body = {'result' : 1} 8 9 result = { 10 'statusCode' : 200, 11 'headers' : { 12 'content-type' : 'application/json' 13 }, 14 'body' : json.dumps(body) 15 } 16 17 18 # 結果を返す 19 return { 20 21 22 ''' 23 'statusCode' : 200, 24 'headers' : { 25 'content-type' : 'text/html' 26 }, 27 'body' : '<!DOCTYPE html><html><meta charset="UTF-8"></head><body>登録ありがとうございました。</body></html>' 28 ''' 29 } 30 except: 31 import traceback 32 traceback.print_exc() 33 return { 34 'statusCode' : 200, 35 'headers' : { 36 'content-type' : 'text/html' 37 }, 38 'body' : '<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>内部エラーが発生しました。</body></html>' 39 } 40

メールアドレスの入力・登録サイトのhtmlコード

html

1 2<!DOCTYPE html> 3<html lang="ja"> 4<head> 5 <meta charset="UTF-8"> 6 <script src="http://code.jquery.com/jquery-3.2.1.min.js"></script> 7 <script> 8 function regist(){ 9 <!-- XXXXXXXXXXXXXは、API GATEWAYのエンドポイント(図5-13--> 10 var apiurl = 'https://XXXXXXX.execute-api.us-west-2.amazonaws.com/prod/regist'; 11 var form = $('#myform'); 12 var formdata = form.serialize(); 13 14 $.ajax({ 15 type : 'POST', 16 url : apiurl, 17 data : formdata, 18 dataType : 'json' 19 }).done(function(response) { 20 if (response.result == 1) { 21 $('#msg').html('登録ありがとうございました。ダウンロード先を記載したメールをお送りしました'); 22 } else { 23 $('#msg').html('エラーが発生しました。' + response.message); 24 } 25 }).fail(function(request, status, err) { 26 alert(status); 27 }); 28 29 return false; 30 } 31 </script> 32</head> 33<body> 34 <form id="myform"> 35 氏名:<input type="text" name="username"><br> 36 メールアドレス:<input type="text" name="email"> 37 <input type="button" value="登録" onclick="regist()"> 38 </form> 39 <p id="msg"></p> 40 41 <!-- 42 <form method="POST" action="https://yoqby9e8kc.execute-api.us-west-2.amazonaws.com/prod/regist"> 43 氏名:<p><input type="text" name="username" /></p><br> 44 メールアドレス:<p><input type="text" name="email" /></p> 45 <input type="submit" value="登録"> 46 </form> 47 --> 48</body> 49</html>

前提

現在、AWSのlambdをAWS関連の書籍で勉強しています。

実現したいこと

この書籍に載っている、lambda,SES,API Gateway,dynamoDB,S3等を利用して、メールアドレスを入力・登録で、登録完了のメールが返信されるWEBサイトを作れるサンプルコードがあり実際やってみて、メール送信できることを確認できました。

その次の章で、”Ajax経由でAPI Gatewayを呼び出す”というのがあり、次のコードを、前の章で作成したサンプルコードの戻り値に追加・変更するように書かれていました。

python

1 body = {'result' : 1} 2 result = { 3 'statusCode' : 200, 4 'headers' : { 5 'content-type' : 'application/json' 6 }, 7 'body' : json.dumps(body) 8 }

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

追加変更してみたところ次のようなエラーが発生しました。

A function update is still in progress so the invocation went to the previously deployed code and configuration. Test Event Name testRegist1028 Response { "errorMessage": "Syntax error in module 'lambda_function': invalid syntax (lambda_function.py, line 110)", "errorType": "Runtime.UserCodeSyntaxError", "stackTrace": [ " File \"/var/task/lambda_function.py\" Line 110\n body = {'result' : 1}\n" ] } Function Logs START RequestId: 2729f521-5ca7-4dd8-aa53-068fc08b496c Version: $LATEST [ERROR] Runtime.UserCodeSyntaxError: Syntax error in module 'lambda_function': invalid syntax (lambda_function.py, line 110) Traceback (most recent call last):   File "/var/task/lambda_function.py" Line 110                 body = {'result' : 1} END RequestId: 2729f521-5ca7-4dd8-aa53-068fc08b496c REPORT RequestId: 2729f521-5ca7-4dd8-aa53-068fc08b496c Duration: 2.91 ms Billed Duration: 3 ms Memory Size: 512 MB Max Memory Used: 37 MB Init Duration: 107.26 ms Request ID 2729f521-5ca7-4dd8-aa53-068fc08b496c

この場合のエラー回避・修正方法をご教示の程よろしくお願い致します。

現在のlambdaの関数コード

python

1import json 2import boto3 3import urllib.parse 4import time 5import decimal 6 7# DynamoDB オブジェクト 8dynamodb = boto3.resource('dynamodb') 9 10# メール送信関数 11MAILFROM = 'hogehoge@hoge.com' 12 13def sendmail(to, subject, body): 14 client = boto3.client('ses', 'us-west-2') 15 16 response = client.send_email( 17 Source=MAILFROM, 18 ReplyToAddresses=[MAILFROM], 19 Destination= { 20 'ToAddresses' : [ 21 to 22 ] 23 }, 24 Message={ 25 'Subject' : { 26 'Data' : subject, 27 'Charset' : 'UTF-8' 28 }, 29 'Body' : { 30 'Text' : { 31 'Data' : body, 32 'Charset' : 'UTF-8' 33 } 34 } 35 } 36 ) 37 38 39# 連番を更新して返す関数 40def next_seq(table, tablename): 41 response = table.update_item( 42 Key={ 43 'tablename' : tablename 44 }, 45 UpdateExpression="set seq = seq + :val", 46 ExpressionAttributeValues= { 47 ':val' : 1 48 }, 49 ReturnValues='UPDATED_NEW' 50 ) 51 return response['Attributes']['seq'] 52 53def lambda_handler(event, context): 54 try: 55 # フォームに入力されたデータを得る 56 param = urllib.parse.parse_qs(event['body']) 57 print('test test test test') 58 print(param) 59 60 username = param['username'][0] 61 email = param['email'][0] 62 63 # クライアントのIPを得る 64 host = event['requestContext']['identity']['sourceIp'] 65 66 # シーケンスデータを得る 67 seqtable = dynamodb.Table('sequence') 68 nextseq = next_seq(seqtable, 'user') 69 70 71 # 現在のUNIXタイムスタンプを得る 72 now = time.time() 73 74 # 署名付きURLを作る 75 s3 = boto3.client('s3') 76 url = s3.generate_presigned_url( 77 ClientMethod = 'get_object', 78 Params = {'Bucket' : 'hogeweb001', 'Key' : 'hoge.pdf'}, 79 ExpiresIn = 10, # 48 * 60 * 60, 80 HttpMethod = 'GET') 81 82 # userテーブルに登録する 83 usertable = dynamodb.Table("user") 84 usertable.put_item( 85 Item={ 86 'id' : nextseq, 87 'username' : username, 88 'email' : email, 89 'accepted_at' : decimal.Decimal(str(now)), 90 'host' : host, 91 'url' : url 92 } 93 ) 94 95 # メールを送信する 96 mailbody = """ 97 {0}様 98 99 ご登録ありがとうございました。 100 下記のURLからダウンロードできます。 101 102 {1} 103 """.format(username, url) 104 105 sendmail(email, "登録ありがとうございました", mailbody) 106 107 # 結果を返す 108 return { 109 110 body = {'result' : 1} 111 result = { 112 'statusCode' : 200, 113 'headers' : { 114 'content-type' : 'application/json' 115 }, 116 'body' : json.dumps(body) 117 } 118 119 ''' 120 'statusCode' : 200, 121 'headers' : { 122 'content-type' : 'text/html' 123 }, 124 'body' : '<!DOCTYPE html><html><meta charset="UTF-8"></head><body>登録ありがとうございました。</body></html>' 125 ''' 126 } 127 except: 128 import traceback 129 traceback.print_exc() 130 return { 131 'statusCode' : 200, 132 'headers' : { 133 'content-type' : 'text/html' 134 }, 135 'body' : '<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>内部エラーが発生しました。</body></html>' 136 } 137 138 139 140

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

pig_vba

2022/11/15 06:33

wandboxでいろいろ試してみましたが、bodyとresultの代入でsyntax errorが発生しているようです。 この二つの代入はreturnの中ではなく、前に行うべきだったりしませんか?
MaeharaKenji

2022/11/15 21:39

回答頂きありがとうございます。 追加のコードをreturnの前に配置したところ、エラー回避できました。 ただ、メールアドレスの入力サイトで、登録ボタンを押しても何も反応がありません。 cloudwatchでもログが記録されない状態です。 他にも修正する箇所は必要でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問