この記事の目次
AWS Lambdaとは?
今回は、AWSサービスの1つであるAWS Lambdaについて紹介します。簡単な処理を何かのイベントに応じて実行させたい場合に大変便利なサービスです。
AWS Lamdaは、サーバの立ち上げや管理なしにプログラムを実行できるサービスです。任意の時刻やイベントをトリガーにしてプログラム実行可能です。簡単なバッチ処理はもちろんのこと、サーバレスなWebアプリケーション構築にも適しています。
AWS Lambdaの特徴
AWS Lambdaは便利なサービスであることは間違いありませんが、用途によって利用可否を判断するようにしましょう。
以下に主な特徴を挙げますが、特に4番目の特徴は大きな判断基準になるでしょう。時間の短い処理はAWS Lambda、ビックデータ解析など時間の長い処理は他のサービス、と考えるのが良いのではないでしょうか。
- EC2といった仮想サーバを立てる必要がありません。
- プログラム実行時のみ料金が発生します。コードを実行していない時には課金されません。
- API Gatewayを組み合わせることにより、WebサービスやAPIサービスを開発できます。
- 一回の処理時間の上限は15分のため、時間の長い処理には適しません。
利用可能なプログラム言語
AWS Lambdaでは様々なプログラミング言語を利用可能です。
以下、利用可能なプログラミング言語を記載しておりますが、カスタムランタイムを使えば記載されていないプログラミング言語も利用可能です。また、Pythonについては、2系、3系どちらも利用可能です。
- Node.js : 10もしくは12系
- Python : 2.7, 3.6, 3.7, 3.8
- Ruby : 2.5, 2.7
- Java : 8, 11
- Go : 1.x
- .Net : 2.1, 3.1
- カスタムランタイム:上記以外の言語についても、手動追加することが可能です。
料金体系
関数に関するリクエスト数と実行時間に基づいた課金となります。
メモリを128MBから2008MBの間で設定することができ、設定によって金額が変わりますので、詳細はAmazonの公式ページからご確認ください。
また、無料利用枠には、1ヶ月ごとに100万件の無料リクエストおよび40万GB秒のコンピューティング時間が含まれているため、気軽にお試し可能です。本記事ではAWS Lambdaの使い方も紹介するため、是非無料利用枠を使ってお試しください。
AWS Lambdaの設定方法
それでは、早速AWS Lambdaを使っていきましょう。
大まかな流れとしては、1. 関数を作成、2. イベントトリガーを設定、3. プログラムを記述、4. デプロイになります。
関数を作成
それでは、まずは処理を記述するために必要な関数を作成しましょう。AWSコンソール画面のサービス一覧より、「AWS Lambda」を選択してください。
ダッシュボード画面に遷移するので、以下の手順に従って関数を作成してみましょう。
- 画面右上の「関数を作成」をクリックしてください。
- 「一から作成」を選択し、任意の関数名を入力してください。
- ランタイムはお好きなプログラム言語を選択すれば良いですが、ここではPython3.7を選択してください。なお、ランタイムは関数作成後も自由に変更可能です。
- 画面一番下の「関数の作成」をクリックしてください。
イベントトリガーを設定
上記の手順で、空の関数を作ることができました。次に、この関数をどのタイミングで実行するかを設定していきます。イベントトリガーにはAlexaによるトリガーや、AWS API Gatewayによるトリガーなど様々な種類があります。
ここでは、毎日定時に実行するためのトリガーを設定します。
- 関数編集画面のデザイナー枠内にある「トリガーを追加」をクリックしてください。
- 「トリガーを選択」の中からお好きなトリガーを選択すれば良いですが、ここではEventBridge(CloudWatch Events)を選択してください。
- ルールタイプを「スケジュール式」に変更してください。
- スケジュール式に cron(15 10 * * ? *) と入力してください。これで、毎日協定世界時15:10に関数が実行されることになります。
- 「追加」ボタンをクリックしてください。
プログラムを記述
上記までの手順で、任意のイベントに応じて関数を実行するという環境までは構築できましたが、肝心のプログラムが空の状態です。
以下の手順に従えば、Pythonコードを記述可能ですが、次章でSlackにメッセージを送信するPythonコードを記載しますので、現時点では空のままでも構いません。
- 関数編集画面の関数コード枠内にあるlambda_function.pyをクリックしてください。
- def lambda_handler(event, context)にお好きな処理を記述してください。
- File > New Fileを選択することにより、新しいpythonファイルも作成可能です。
デプロイ
最後に、プログラムをデプロイする必要があります。デプロイをしないと、記述したプログラムは実行されません。関数コード枠内右上にある「デプロイ」をクリックしてください。これで毎日15:10に本関数が実行されることになります。
プログラムが正常に回るかどうか試したい方は、画面上部にある「テスト」をクリックしてみてください。即座にプログラムが実行され、結果が出力されます。テストでプログラムが正常に実行されることを確認してから、デプロイするようにしましょう。
AWS LambdaでPythonプログラムを実行しよう
さて、これまではAWS Lambdaの汎用的な設定方法を記載しましたが、ここからはPythonを使ってコミュニケーションツールSlackに定期的にメッセージを送る関数を作ってみましょう。
requestsライブラリを使うことになりますが、AWS Lambdaには外部ライブラリは含まれていないため、このままでは実行できません。そこで、まずはPythonの外部ライブラリ追加方法から始めましょう。
外部ライブラリを導入
AWS Lambdaにて、Pythonの外部ライブラリを導入するには2つの方法があります。1つは、外部ライブラリがインストールされた環境をzipファイルにしてアップロードする方法です。この方法はあらゆるライブラリを導入できる反面、準備に時間がかかるという欠点があります。
そこで、もう1つの方法である、既に作られたレイヤーを関数に紐付ける、という方法をここでは紹介します。自分で用意しなくとも、他の方が用意したレイヤーを使おうという方法になります。
大量のライブラリが整備されているので、使いたいライブラリは大体こちらで見つけられるでしょう。
- https://github.com/keithrozario/Klayers にアクセスしてください。
- deployments > python3.8 > arns > ap-north-east1.csvを選択してください。異なるリージョンでLambdaを利用している方はご自身が選んだリージョンを選択してください。
- csvファイルの中から、導入したいライブラリの行を探してください。ここでは、requestsを探しましょう。
- requestsの行を見つけたら、Arn列の値をコピーしてください。
- AWS Lambdaに戻り、レイヤー枠内にある「レイヤーを追加」をクリックしてください。
- 「ARNを指定」を選択し、先ほどコピーした値を入力し、「追加」をクリックしてください。
コードを記述して実行する
上記までの手順で、AWS Lambda関数内で外部ライブラリであるrequestsを呼び出せるようになりました。このrequestsを使い、メッセージをSlackに送信する関数をPythonで作ってみましょう。
def lambda_handler(event, context)内に、Slackにメッセージを送るためのソースコードを記載します。SlackのWebhook URLが必要になるため、設定方法は参考ページを参照してください。Webhook URLができたら下記のPythonコードを記載してみてください。
import json
import requests
def lambda_handler(event, context):
url = ‘SlackのWebhook URLを入力してください’
requests.post(post_url, data=json.dumps({
“username”: “usernameを入力してください”,
‘text’: ‘Slackに送りたい文章を入力してください’
}))
これでSlackに毎日協定世界時15:10にメッセージが送信される関数が出来あがりました。最後に、Deployボタンを押下するのを忘れないようにしてください。Deployボタンを押下しない限り、Pythonコードは反映されません。
15:10まで待ちきれない方は、画面上部にある「テスト」ボタンを押下してみてください。押下直後に関数が実行されますので、正常にプログラムが動くか確認できます。
まとめ
AWS Lambdaの仕様、特徴からPythonの実行方法までを紹介しました。外部ライブラリの導入方法は知らない方も多いので、是非覚えて活用してみてください。また、今回は紹介できませんでしたが、AWS S3、AWS RDSとの連携など、様々な便利機能があります。
興味のある方は是非調べてみてください。