lambdaで Youtube Data APIを使おうとしたところ、 "Runtime.ImportModuleError" が発生
今までAWSにはほとんど触れずに来たのだが、仕事で知識が必要になってきたため、Lambdaを触ってみることにした。ちょうど、家でYoutubeを見ながらエクササイズに励んでいるため、Youtube Data API で、動画のIDからの再生時間を取得する処理を作ってみることにした。コードのサンプルは、ありがたいことに、Youtube Data API のページから出力できるので、それを少しだけ修正して、lambda handlerに転記した。
# Sample Python code for youtube.videos.list using API Key
# See instructions for running these code samples locally:
# https://developers.google.com/explorer-help/code-samples#python
import googleapiclient.discovery
import googleapiclient.errors
def lambda_handler(event, context):
api_service_name = "youtube"
api_version = "v3"
api_key = "your api key"
# Create an API client
youtube = googleapiclient.discovery.build(
api_service_name, api_version, developerKey=api_key)
request = youtube.videos().list(
part="snippet,contentDetails",
// まずはサンプルで固定値
id="8j9L9h3ODfU"
)
response = request.execute()
print(response)
実行してみると、以下のようなエラーが発生した。
{
"errorMessage": "Unable to import module 'lambda_function': No module named 'googleapiclient'",
"errorType": "Runtime.ImportModuleError",
"requestId": "b3dd46ce-4ccf-4a60-9389-215b55c04768",
"stackTrace": []
}
lambda レイヤーにライブラリのzipをアップしてみるが直らない
ライブラリのコードをアップしていないので、それはそうだと思い、調べるとlambda レイヤーというところにアップするのが一般的だそうだ。以下を参考にzipファイルをアップしてみるも、全く直らず、途方に暮れた。
https://qiita.com/_YukiOgawa/items/66832f704be1218b09c4
lambdaレイヤーというのは、ライブラリや設定ファイルなどをアップしておける場所だそうだ。この記事の説明がわかりやすかった。
zipにするディレクトリ名が重要だった!
あれこれ調べた後に、もう一度最初の記事を読むと、 "pythonはLambdaレイヤーにアップロードするフォルダ名称と必須なので、ここは変えないようにしてください。" と記載があった!自分の場合、zipにする前のディレクトリ名を適当につけており、これが原因で失敗していた。ということで、zipにする前のディレクトリ名を "python" にしてアップロードすることで、無事解決した。
おまけ: Cloud9が使えず混乱
上記を調べる過程で、ローカル環境が干渉してしまい、うまくいかなかったという記事を見かけた。ということで、AWSのCloud9を使ってみようとするものの、アクセス権がないという画面になってしまった。AWS知識が乏しいもので、四苦八苦しながら権限を確認するものの、権限はあるように見える。
どうやら、サービスの新規利用を停止していたようだ。
https://www.itmedia.co.jp/news/articles/2407/31/news173.html
権限がないと思い込んだが、たしかによくみると、"詳細はこちら"のページに "we have made the dicision to close new customer access to AWS Cloud9" とある。lambdaレイヤーもCloud9もAWS用語の見慣れなさに惑わされて、説明をよく読んでいないことで時間を浪費することになった。気をつけなければいけない。