cloud9からlambdaを動かす際の注意点(No module named ~のエラーなど)


はじめに

AWS関連で、cloud9からlambdaを動かす際に少し躓いたことがあったのでその辺をまとめていきます。lambdaはサーバーレスでプログラムを実行してくれるので非常に便利で、私もスクレイピング等の定期実行のために使いはじめました。
この記事は主に初めてcloud9、lambdaを使う方向けになると思います。

実践

まず新しくcloud9の環境を作成。名前はexampleにしておきます。

これが終わると下のような画面に移ります。画面右に表示されている漢字の「入」のようなボタンをクリック、さらにCreate a new Lambda function(画像のオレンジ色の部分)をクリックしてlambda-functionを作成できます。

function名は適当に決めてあげて(ここではsample)、Select runtimeのところで使用する言語を選びます。(下の画像)今回はpythonを使ってスクレイピングに使用するBeautifulSoupライブラリのimportが成功するまでを書いていくので、「python3.6」を選びます。そのほかの設定は特にいじらなくて大丈夫だと思います。
home/ec2-user/environmentにsampleディレクトリが出来ていると思います。
次にhome/ec2-user/environment/sample/sampleにあるlambda_function.pyを開いてみてください。ここにプログラムを実行していくコードを書いていくことになります。

lambda_function.py
from bs4 import BeautifulSoup

def lambda_handler(event, context):

    return 'success'

今回は練習なのでこれだけ書きます。bs4からBeautifulSoupをimportすることが出来ていたらsuccessが返ってきます。

ではbs4をinstallしていきます。
まずは

sudo pip install --upgrade pip

でpipを最新のバージョンにupgradeしましょう。

次に

pip install bs4

を実行。(Permission deniedのエラーが出るときは末尾に --userを付け加えます)

無事インストールが成功しました。

早速、lambda_functionを実行してみます。画面右のLocal Functions でsampleを選択し、Run the selected Lambda functionをクリックしましょう。

すると Unable to import module 'sample/lambda_function': No module named 'bs4'
とエラーが出てしまします。bs4のinstallは成功しているはずなのにbs4が見つからないと言われています。なぜでしょうか。

答えとしては、lambdaはサーバーレスで動くので、lambdaの作業用ファイル(sample)内で完結している必要がある(使用するライブラリはファイル内に入れておかなければならない)からです。
解決策するために

cd sample
pip install bs4 -t .

を実行します(-tとディレクトリ名でinstall先を指定)

もう一度lambda_functionを動かしてみてください
successと返ってきたら成功です。

最後にremoteにlambdaファイルをデプロイすれば終了です。(画面右上)

プログラムの定期実行を行いたいときはAmazon EventBridgeから設定することが出来ます。

おわりに

pipコマンドの -t は忘れそうだったので記事にしてみました。少額ですが実行時間に応じてお金がかかるので、実行時間が長く頻繁に動かすなら注意した方がいいですね。