AWSを使っている時の話。
LambdaとEventBridgeをterraformで構築しようとしている時の話。
プチハマりをしたので共有しておきます。
少しでも開発者の時短に繋がれば幸いです。
エラー発生状況
Lambdaに対してEventBridgeで時間になったらLambda内にあるpythonを起動させようとした。
Lambda内でできるpythonコードのTestを実行したら今回のエラー「Unable to import module ‘index’: No module named ‘index’」が発生。
参考にしたコードは以下。
Lamdaは上記URL先のコードの以下の部分を拝借して自分で改変して書いていました。
module "lambda" {
source = "terraform-aws-modules/lambda/aws"
version = "~> 2.0"
function_name = "${random_pet.this.id}-lambda"
handler = "index.lambda_handler"
runtime = "python3.8"
create_package = false
local_existing_package = local.downloaded
create_current_version_allowed_triggers = false
allowed_triggers = {
ScanAmiRule = {
principal = "events.amazonaws.com"
source_arn = module.eventbridge.eventbridge_rule_arns["crons"]
}
}
}
結論から先に
結論からだと以下がいけなかったです。
handler = "index.lambda_handler"
これを以下に変えたら今回のエラーは解消されました。
handler = "lambda_function.lambda_handler"
調べて悩んでいた部分と問題の切り分け
まず悩んだのはそもそもpythonコードでimportしているmoduleにindexというのが無かったというところでした。
そこでまずLambdaの仕様で知らないところがあるのかと思い、エラーで検索をかけて、サイト等で記載されていた事を試していきました。
こことか👇
こことかですね。👇
でも一向に直らずでした。
問題の切り分けとしてうまくいったのは、正常に動いているLambdaに書かれたpythonコードで試したことでした。
今回のLambdaに動くpythonを試したら同じエラーが出たわけです。
そこで、これはLambda側に問題があってpythonコード側では無いなと切り分けができました。
つまり、上記の参考にしたサイトはpython側に問題があると書かれていており、pythonコードを色々試して四苦八苦していたのですが、Lambda側に問題があるとわかり、terraformのコードを見てみるに至ったわけです。
結論
公式ページのコードをコピペするときは気を付けよう。