事の発端
AWS LambdaとDynamoDBのお勉強で色々弄ってた時のこと。
以下はDynamoDBにテーブルを作成後、Itemを登録するコードです。
lambda_function.py
import boto3
def lambda_handler(event, context):
try:
dynamoDB = boto3.resource("dynamodb", region_name="ap-us-west-2")
table_name = "my_table_name"
table = dynamoDB.Table(tabale_name)
table.put_item(
Item = {
'id: 1',
'name': 'taro'
}
)
except Exception as e:
print(e)
これを実行するとこんなエラーが。。。
log
{
"errorMessage": "2019-02-12T08:25:26.977Z '***************' Task timed out after 3.00 seconds"
}
このエラー自体は、Lambdaに設定してあった実行制限時間になっても処理が終わらなかったよ、という事。
でも、Item登録するのそんなに重い処理じゃない筈だし、そんなに時間かかってたら使いもんにならんぞと思いながらもLambdaの実行時間制限を10秒にしてもう一度実行するもまたタイムアウトした。
原因はRegion名のtypo
単純なタイプミスでした。
dynamoDB = boto3.resource("dynamodb", region_name="ap-us-west-2")
を
dynamoDB = boto3.resource("dynamodb", region_name="us-west-2")
に直して実行するとうまくいった。
原因特定のきっかけ
もうどうすることもできなくて途方にくれていた時、実行制限時間をもっと伸ばしたら何か変わるだろうかという天の声が聞こえて試して見た結果、なんとエラーの内容が変わった。
Could not connect to the endpoint URL: '**************'
このエラーを見て初めて自分がregion名の指定の仕方を間違えているのではと気づいた。
DynamoDBがエラーを返すまでの時間がかかりすぎたためにこの事実に気付くのが遅れてしまった訳だ。
教訓
100回叩けば開くドアはちゃんと100回叩け
DB接続に関して知識が薄かったと思い知らされた。
Lambdaの実行制限時間は30秒以上に設定しておいたほうが無難だと思う。