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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1785閲覧

UnboundLocalErrorの解決方法

konan513

総合スコア2

AWS Lambda

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/10/08 03:32

前提

AWSで自動電話通知システムを作っています。(Lambda Python3.9)

https://infrastructure-engineer.com/aws-amzaonconnect-008/#index_id3

こちらのサイトを拝見しコードを入力していたのですが下記のようなエラーがでてしまいました。

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

[ERROR] UnboundLocalError: local variable 'phone_number' referenced before assignment Traceback (most recent call last): File "/var/task/lambda_function.py", line 112, in lambda_handler phone_number = get_phone_number(contactinfo, priority) File "/var/task/lambda_function.py", line 70, in get_phone_number return phone_number

該当のソースコード

python3.9

1import json 2import boto3 3from boto3.dynamodb.conditions import Key, Attr 4 5# boto3からDynamoDBへアクセスするためのオブジェクトを取得 6dynamodb = boto3.resource('dynamodb') 7 8# "amazonconnect-contact-list"へアクセスするためのオブジェクトを取得 9contactlist = dynamodb.Table("amazonconnect-contact-list") 10 11# "amazonconnect-response-status"へアクセスするためのオブジェクトを取得 12responsestatus = dynamodb.Table("amazonconnect-response-status") 13 14# 残り周回数を取得する関数 15def get_cycle(sqs_event): 16 17 record = sqs_event['Records'][0] 18 json_record = json.loads(record["body"]) 19 cycle = json_record.get("cycle",-1) 20 21 return cycle 22 23 24# "amazonconnect-response-status"の内容を返す関数 25def status_scan(): 26 27 scanData = responsestatus.scan() 28 items=scanData['Items'] 29 30 return scanData["Items"] 31 32 33# "amazonconnect-contact-list"の内容を返す関数 34def operation_scan(): 35 36 scanData = contactlist.scan() 37 items=scanData['Items'] 38 39 return scanData["Items"] 40 41 42# 電話番号リストの行数を返す関数 43def get_contactinfo_item_number(json_contactinfo): 44 45 count = 0 46 47 for line in json_contactinfo: 48 count += 1 49 50 return count 51 52 53# 前回のプライオリティを返す関数 54def get_before_priority(sqs_event): 55 56 record = sqs_event['Records'][0] 57 json_record = json.loads(record["body"]) 58 priority = json_record["priority"] 59 60 return priority 61 62 63# 指定されたプライオリティの電話番号を返す関数 64def get_phone_number(json_contactinfo, now_priority): 65 66 for line in json_contactinfo: 67 if line['Priority']==now_priority: 68 phone_number = line['Phone'] 69 70 return phone_number 71 72 73def lambda_handler(event, context): 74 75 # 残り周回数を取得 76 now_cycle = get_cycle(event) 77 78 # 応答結果を確認 79 statustinfo = status_scan() 80 81 # 応答結果がNGの場合 82 if statustinfo[0]['CallStatus'] == "NG": 83 84 # 電話番号リストを取得 85 contactinfo = operation_scan() 86 87 # 電話番号リストの行数を取得 88 contactinfo_item_number = get_contactinfo_item_number(contactinfo) 89 90 # 前回のプライオリティを取得 91 before_priority = get_before_priority(event) 92 93 # 前回のプラオリティが電話番号リストの行数と同じ場合(リストの最後まで通知した場合) 94 if before_priority == contactinfo_item_number: 95 96 # プライオリティを1に設定(最初に戻る) 97 priority = 1 98 99 # 残り周回数を1減らす 100 now_cycle -= 1 101 102 # 前回のプラオリティが電話番号リストの行数と異なる場合(リストの最後まで通知していない場合) 103 else: 104 105 # プライオリティに1を足す(次のプライオリティを設定) 106 priority = before_priority + 1 107 108 # 残り周回数が0以外の場合 109 if now_cycle != 0: 110 111 # 指定したプライオリティの電話番号を取得 112 phone_number = get_phone_number(contactinfo, priority) 113 114 # boto3からAmazonConnectへアクセスするためのオブジェクトを取得 115 connect = boto3.client('connect') 116 117 # AmzaonConnectの問い合わせフローを呼び出し電話発信 118 connect.start_outbound_voice_contact( 119 DestinationPhoneNumber=phone_number, 120 ContactFlowId='***', 121 InstanceId='***', 122 SourcePhoneNumber='***', 123 ) 124 125 # boto3からSQSへアクセスするためのオブジェクトを取得 126 sqs = boto3.resource('sqs') 127 128 # "amazonconnect-queue-confirm"へアクセスするためのオブジェクトを取得 129 name = 'amazonconnect-queue-confirm' 130 queue = sqs.get_queue_by_name(QueueName=name) 131 132 # 現在のプライオリティと周回数をセットしてステータス確認用のキューにメッセージ送信 133 response = queue.send_message(MessageBody=json.dumps({"priority": priority, "cycle": now_cycle})) 134

UnboundLocalErrorというエラーについて、ローカル変数とグローバル変数でエラーになったりならなかったりするみたいで、コードを書く順番などが関連しているということでしょうか?

初心者で申し訳ありませんが、回答してくださる方がいればお願いしたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題を言い換えると,必ずしもnow_priorityに一致するデータがが存在したわけではなかった.ということになります.

Python

1def get_phone_number(json_contactinfo, now_priority): 2 3 for line in json_contactinfo: 4 if line['Priority'] == now_priority: # 条件に一致せず 5 phone_number = line['Phone'] # 変数phone_numberが定義されなかったことで 6 7 return phone_number # エラーが起きる

ということです.関数の頭にデフォルト値を設定しておくなどして

Python

1def get_phone_number(json_contactinfo, now_priority): 2 phone_number = "XXX-YYYY-ZZZ" # デフォルト値を設定する 3 for line in json_contactinfo: 4 if line['Priority'] == now_priority: # 条件に一致せず 5 phone_number = line['Phone'] # 変数phone_numberが定義されなくても 6 7 return phone_number # デフォルト値を返すことができる

このように対処することが可能です.もしくは,データjson_contactinfoに必ずnow_priorityを持つデータを入れるよう,対処してください.前回もそうですが,「無い値」を抽出しようとしてエラーが出ています.

投稿2022/10/08 03:47

編集2022/10/08 14:17
PondVillege

総合スコア1579

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

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

PondVillege

2022/10/08 03:49

実装記事を読んだ身としては,Python初心者に本システムが扱えるとは到底思えません.もう少しPythonやAWSの勉強をなさってから取り組まれる方がスムーズに開発ができ,異常対応もできるようになると思います.
konan513

2022/10/12 14:15

ps_aux_grepさん 自分としましても勉強不足を痛感しています。 その上で2つの質問に丁寧に回答して頂いたことに対してとても感謝しています。 今後とも勉強させていただきます。 今回はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問