AWSのLambdaにPythonでサーバーレスアーキテクチャーのAPIを作る

はじめに

Pythonで作ったファイルを他の人に使ってもらうのって難しいの?

Pythonで作成したモデル等を実運用に持っていきたい際には、ローカルのPC(MacやWindows)ではなく、サーバーと呼ばれる常に稼働できるコンピュータ上に実装(デプロイ)する必要があります。
ローカル環境と同様にポンポンと出来るんでしょと思われがちですが、ここには以下のように別途追加で覚えるべきことが多く、ハードルがあります。

  • サーバーへのログイン(SSH等)の仕組み
  • UnixのコマンドによるCUI操作
  • ApacheやNginxといったWebサーバーの仕組み
  • Pythonであれば、Flask等のAPI用のWebフレームワーク
  • サーバーを有料レンタル(AWS, Azure, GCP, さくら)
  • サーバーのセキュリティ設定(ポート番号)
  • SSL通信による暗号化(HTTPS)

このように、一口にコンピュータ上で動かすと言っても、難易度としては天地ほどの差があり、機械学習を覚えたて、Pythonを覚えたての初心者が手を出すべきところではなかったりします。

しかし、実プロジェクトとなると常に予測結果を出力できるように稼働させなければいけない、、、といった矛盾もあり、非常に悩ましいものです。

そんな、みなさんに朗報です。

それが サーバーレスアーキテクチャー です。

サーバーがいるのに、サーバーレスアーキテクチャー?どういうこと?と思われるかも知れません。

厳密に言うと、もちろん計算を行うためのサーバーは存在するのですが、AWSのEC2やAzureのVM、さくらのVPSのように、サーバーを所定時間もしくは月額で借り続けるのではなく、必要なときだけ起動して、その使用したほんのちょっとの分だけ支払うという、実行時のみほんのちょっと借りる方式のことを言います。

実質、ほとんどサーバーを保有していないため、サーバーレスアーキテクチャと呼ぶのかと思っています。
もちろん多少のサーバーに関する知識は必要ですが、自分でサーバーを借りて設定してと考えると、遥かに工数が少ないですし、料金もほとんどかからないと思います。

今回は、そんなサーバーレスアーキテクチャーを実装できるAWSLambdaを使用していきましょう。

AWSのLambdaでサーバーレスアーキテクチャー

なぜAWSを使うの?

サーバーレスアーキテクチャー自体は、MicrosoftのAzure上にあるFuctionsでももちろん大丈夫です。
今のところ、AWSのLambdaのリファレンスが多いことが今回AWSを使用する動機であり、まこ今後MicrosoftのAzure上でも実装する記事を紹介できればと思っています。

AWSのアカウント作成・ログイン

AWSではこちらからアカウントの新規作成やログインが行えます。

アカウント作成・ログインが終わると下記のようなダッシュボード画面に遷移します。
AWSでは、色々なサービスが提供されているのですが、今回はLambdaを使用していきます。
最初はお金がかからないのでご安心ください。

Lambdaをはじめよう

それでは、どんどん進めていきましょう。
AWSでは、GUIでかなり多くの操作ができるようになっているため、そこまで苦労しないと思いますが、極力丁寧に説明していきます。
とりあえず、Lambdaにリクエストを投げると、Hello World と返してくれるAPIでも作りましょう。

設計図の選択

まずはプルダウンメニューから Python 3.6 を選択します。
※ 2017年7月現在、AWSのLambdaがPython3.6 をサポートしています。

こちらの hello-world-python3 というそれらしき名前の雛形を使っていきましょう。

hello-world-python3:A starter AWS Lambda function

AWS Lambda を始めるにはこれからだよ的なことが書いてあるので、まずこれで練習していきましょう。

トリガーの選択

つぎに、「トリガーの設定」という聞きなれないものが出てくるのですが、これは「どういうタイミングでこのLambdaで作った関数を呼び出しますか?」という質問です。
HTTP(もしくはHTTPS)経由でリクエストを送って、それに対するレスポンスが欲しい典型的なAPIの場合は「API Gateway」にしておきましょう。


それ以外に、データが保存された時に関数を実行して「低・中・高」みたいに3パターン圧縮するプログラムを実行したりなどは、データ保存用の「S3」と連携させたりできるみたいですね。
個人的には、画像をアップロードしたタイミングで、tiny pngにかけて圧縮してくれるプログラムを早く作りたいですね。
これは、API Gatewayで慣れてきたら、次のステップとして、試してみましょう。

今回はセキュリティとしてをオープンとして、誰でもアクセスできる一番簡単な設定としましょう。
こちらは一般公開ができますが、使った分だけの従量課金で、一般の人が使っても、課金対象は自分なので、LambdaでAPIを一般公開する時は覚悟を持ってからにしましょう。
※ テストが終わった後に削除しておけば大丈夫です。

関数の設定

こちらのよくわからないソースコードがズラッと並んでいますが、とりあえずシンプルに「Hello world」と返すだけの場合は、どのように書くかを見ていきましょう。

このように、編集しました。

def lambda_handler(event, context) の event と context は何かのイベントが起きた際に使用するものらしいので、今は気にせずに書いておきましょう。

ハンドラやロールですが、詳しくはわかりませんが、とりあえずデフォルトの設定を活用しながら、下記のように設定していきました。

関数の作成

確認画面で大丈夫であれば、関数を作成しましょう。

関数の作成が完了すれば、以下のように完成した関数を確認できます。

お!これで完成かな?と思った方、まだ完成ではなく、API Gateway側の設定を行い、あるURLにアクセスした時に、このLambdaの関数を実行するといった紐付けが必要となります。

API Gatawayを設定しよう

API Gatewayの画面にアクセス

AWSはLambdaからAPI Gatewayと移動するのが多少めんどくさいのですが、下記を参考に API Gataway の画面に遷移しましょう。

ここに、「Lambda Microservice」が作られており(おそらく、Lambdaで作成したため)、こちらを選択します。

先ほど作成した「hello_world」に関するアクションがある程度作られているようです。

APIをデプロイしましょう。
デプロイ後からアクセスが出来るようになります。

prod(本番環境)などステージを選択して、デプロイを実行します。

これで準備が完了です。

PythonでLambdaの関数を実行しよう

サーバーレスアーキテクチャの設定が完了すれば、後はPythonのreqiuestsなどでHTTP経由でアクセスすればオッケーです。

実行結果や使用したコードは以下のとおりです。

おわりに

今回は、AWSのLambdaを使用して、サーバーレスアーキテクチャの実装を行いました。

今後こちらの記事に反響があれば、さらに実用性も意識した内容を続編として書こうかと思っています。

  • APIキーなどセキュリティ面の考慮
  • Lambda内でPythonの外部モジュールを使う方法

それでは、素敵なPythonライフをお送りください。

宣伝

最後に今回の件で、「おっ!案外プログラミングいけるかも!」と思っていただけた方へ

株式会社キカガクでは、Pythonのプログラミングを活用した情報収集や作業効率化から始まり、人工知能・機械学習の数学やプログラミングを2〜3日間で効率良く学べるセミナーを開催しておりますので、ぜひ覗いてみてください。

▶ 予約受け付け中のセミナー一覧

また、クラウドコンピューティングのAzureを提供しているマイクロソフトと、ディープラーニングのフレームワークであるChainerを開発しているPreferred Networkとタッグを組み、ディープラーニングに特化したセミナーも2017年7月から開催します。

▶ ディープラーニング ハンズオンセミナー

3日間で20万円と決して安くは無いですが、これは絶対に受講した方が良いです(自分達で言うのも何ですが)。
人工知能関連の初心者向けに教育に定評のある弊社、ディープラーニング理論の最先端のPreferred Networks、言わずもがな最強のインフラを持つマイクロソフトが組むことで、これまでとは違ったセミナーが実現できました。

数学の理論を学ぶだけでなく、Chainerによる本格的なプログラミングでの実装、さらにAzure上のGPUマシンを使用した高速化まで、これからディープラーニングを触っていきたいと思っている人が必要なスキルセットを全て網羅しています。

しかも、受講者限定のコミュニティへの招待といった特典もあり、マイクロソフト、Preferred Networks、キカガクとの繋がりができたり、簡単な質問への対応といったアフターフォロー付きです。
個人的には、なかなか作ることができないコネクションを作ることができる、この特典が一推しです。

それでは、みなさん、セミナーでお待ちしています。