suzu6suzu6.netHome記事一覧PythonJavaScript眺めていられるシミュレーションブログの構築手順やらアルゴリズムAWS言語処理100本ノック@suzu6主にWEBと解析の技術について書きます。広く浅くも続ければ深くなるはず。Lambdaで実行する方法について紹介します。pipでインストールしたモジュールも一緒にLambdaにアップロードします。個人的な興味として、気象情報を取得してDynamoDBに保存するコードを定期的に実行する方法も書きます。いったバッチ処理を切り出すとメインサーバの負荷が減ったり、コードの見通しが良くなり保守性も上がります。OpenWeatherMapで都市名から気象情報を取得する【Python】Boto3でDynamoDBにデータを保存するこの2つの続きであり、目標は気象データのAPIを作成することです。3.6Lambdaで動かすための準備ローカルにて作成したコードをLambdaで動かすための準備をします。Lambdaで外部モジュールを利用するには?LambdaではPythonコードを直接書いて(インラインコード)実行することが出来ます。この場合は外部モジュールをpipでインストールすることは出来ません。そこで、コードとモジュールをzipでまとめてアップロードする必要があります。手作業でzipにまとめる場合は、まずモジュールをコードと同じディレクトリにインストールします。pipでカレントディレクトリにインストールするpipでコードと同じディレクトリにインストールします。前回作成したコードに必要なモジュールを用意していきます。以下の2つをインストールする。boto3requests実行ファイルのあるディレクトリに移動して、オプション-tで指定の場所にモジュールをインストールする。./そうすると以下のようなファイルが置かれます。lambda_function.pyは前回製作したLambdaで実行するメインコード。requests-2.21.0.dist-info一度、lambda_function.pyを実行して確認してみてください。実行権限を変更するLambdaが実行できるようにファイルの権限を変更します。実行と読みこみの権限があれば大丈夫です。./*-Rはディレクトリ内も再帰的に処理します。zipに圧縮してまとめる続いて、Lambdaにアップロードするためコードとモジュールをzipにまとめます。コマンドでも圧縮ツールでまとめるてもどちらでも良いです。この時、コードのディレクトリ内のファイルを選択してzipにして下さい。ディレクトリを選択してzipにすると、1階層分深くなりLambdaのハンドラが読めません。(Lambdaの設定で回避できそうだが、上手くいかなかった。ツールで圧縮しても大丈夫です。Windowsの場合はAWSのドキュメントにある通り7-ZIPでzip化することが推奨されています。図のように、ディレクトリ内のファイルを選択してzipにして下さい。コマンドでzipにする。(LinuxまたはMac)以下のコマンドでzipにできます。./*zip_file.zipというファイルができているはずです。ファイル名は適宜変更して構いません。zipコマンドの詳細はこちら。Lambdaを用意していきます。Lambda関数を作成するAWSコンソールのサービスからLambdaを選びます。「ダッシュボード」か「関数」から「関数の作成」ボタンを押してLambda関数を作成します。この後は「一から作成」の手順を解説します。それぞれ項目を記入していきます。Pythonのランタイムは2.7、3.6、3.7とあり利用したいバージョンを選びます。バージョンは後からも変更可能です。(図では3.7を選んでいますが3.6で前回作ったことを思い出して、後で変更しました。)ロールは既存のロールを選択して、「microService」を選んでみました。Eventsを利用できます。下図は関数を作成後の初期画面です。左がLambdaを実行するトリガー、右がLambdaが操作できるサービスです。選択できるサービスはロールの「microService」が権限を持つものです。Eventsを選択します。Eventsがトリガーとして追加されました。Eventsをクリックすると実行する時間を設定できます。*)利用するOpenWeatherMapのAPIの更新頻度が30分間隔なので、スケジュールも30分ごとに設定しました。更新出来ていないことがあるので、2分待ってから取得する設定です。AWS公式による設定の詳細はこちら。設定が終わるとこうなります。追記:Eventの詳細で実行した日時の記録が見れました。設定は間違っていないようです。Lambdaの設定は以上です。zipファイルをLambdaにアップロードする間が空きましたが、作成したzipファイルをLambdaにアップロードします。「アップロード」ボタンからzipファイルを選んでアップロードします。S3経由でのアップロードこの方法では、ファイルサイズに10MBまでの制限があります。それ以上に大きい場合は、一度S3を経由してLambdaへアップロードすることになります。URLを張り付けます。「ハンドラ」はLambdaが実行する関数を指定する箇所です。デフォルトではlambda_function.lambda_handlerとなっています。これはlambda_function.pyのlambda_handler()という関数を実行します。前回作ったコードもデフォルトに合わせてあります。zipファイルを作成するとき階層を意識してzip化したのもこのためです。アップロードが終わったら、上部の「保存」を押してコードを保存して下さい。Lambda関数をテストしてみる。以上で実行できるはずです。大丈夫かどうかテストしてみます。「保存」ボタンの横に「テスト」があるので押します。こんな感じになりますが、今回のコードはパラメータを受け取るタイプではないので適当に作っても実行できます。イベント名をつけたら保存します。先ほど作ったテストイベントを選んで「テスト」を押すと実行できます。成功するとこうなります。詳細を開くとprint()で出力したログが出るのでちゃんと動いているか確認できます。失敗した場合はエラーログを確認してください。deniedでファイルの実行権限がない。「ファイルもしくは関数が見つかりません」です。ディレクトリ構造と権限を見直して何度が試してみてください。スケジュール実行は待ってみて結果が解ると思います。おわりに以上で定期的に気象データを取得してDynamoDBに貯めることが出来ました。zipでLamdaにあげる以外にも、zappaを使ってコマンドで行う方法もあります。Gatewayなども自動で用意させることも出来ます。Lambdaにデプロイするを見てください。github寒いけど北海道の冬も好きですよ。