■「Unable to import module ‘index’: No module named ‘index’」というエラーに悩んでいるあなたへ

スポンサーリンク
tech系(python)
スポンサーリンク

AWSを使っている時の話。

LambdaとEventBridgeをterraformで構築しようとしている時の話。

プチハマりをしたので共有しておきます。

少しでも開発者の時短に繋がれば幸いです。

エラー発生状況

Lambdaに対してEventBridgeで時間になったらLambda内にあるpythonを起動させようとした。

Lambda内でできるpythonコードのTestを実行したら今回のエラー「Unable to import module ‘index’: No module named ‘index’」が発生。

参考にしたコードは以下。

https://github.com/terraform-aws-modules/terraform-aws-eventbridge/blob/v1.17.0/examples/with-lambda-scheduling/main.tf

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 デプロイパッケージのアップロードエラーのトラブルシューティング
AWS Lambda デプロイパッケージをアップロードしようとすると、アクセス許可が拒否されたか、モジュールをインポートできないというエラーが表示されます。これらのエラーを解決するにはどうしたらよいですか?

こことかですね。👇

AWS "Hello World" Python Lambda results in Runtime.ImportModuleError: "Unable to import module"
I've read dozens of articles, blog posts, docs, and Q&A posts on this site on this issue, and I haven't found a solution. My Python code in index.py is simp

でも一向に直らずでした。

問題の切り分けとしてうまくいったのは、正常に動いているLambdaに書かれたpythonコードで試したことでした。

今回のLambdaに動くpythonを試したら同じエラーが出たわけです。

そこで、これはLambda側に問題があってpythonコード側では無いなと切り分けができました。

つまり、上記の参考にしたサイトはpython側に問題があると書かれていており、pythonコードを色々試して四苦八苦していたのですが、Lambda側に問題があるとわかり、terraformのコードを見てみるに至ったわけです。

結論

公式ページのコードをコピペするときは気を付けよう。


タイトルとURLをコピーしました