ソフトウェア開発では、エンドユーザーのために、特定の問題を解決したり、特定のプロセスを容易にしたり、自動化するためのソリューションを常に構築しています。したがって、ソフトウェアを設計し構築することだけがプロセスの一部ではなく、意図するユーザーがソフトウェアを利用できるようにしなければなりません。
Web ベースのアプリケーションの場合、アプリケーションは動作するだけでなく、多くのユーザーに対して同時に動作し、高い可用性を持つ必要があるため、デプロイはプロセスの非常に重要な側面であり、一部です。
デプロイメントの選択肢としては、自社でサーバーハードウェアを購入してアプリケーションをデプロイする方法や、他社のサーバースペースを借りてデプロイする方法があります。これには、取得に必要なリソースだけでなく、メンテナンス費用やサーバーリソースを監視するための人員などのコストがかかります。
もし、サーバーのプロビジョニングやメンテナンスに煩わされることなく、アプリケーションを利用できるとしたらどうでしょう。私たちのアジリティとデリバリーは大きく向上するはずです。
Amazon Web Servicesが提供するAWS Lambdaのようなサーバーレス・コンピューティング・プラットフォームを利用すれば、これを実現することができるのです。
サーバーレスコンピューティングとは?
クラウドプロバイダーは、アプリケーションのデプロイと実行についてさまざまなソリューションを提供していますが、その1つがサーバーレス・コンピューティングです。このアーキテクチャでは、クラウド・プロバイダーがアプリケーションをホストし、ソフトウェアとハードウェアの面でサーバー管理の責任を引き受けます。これは、IaaS(Infrastructure as a Service)と考えてください。
クラウドプロバイダーは、スケーリング、可用性、サーバーのメンテナンス、設定などを行うので、開発者はコードに集中することができるのです。その結果、アプリケーションの実行やエンドユーザーへの提供に必要なオーバーヘッドを削減することができます。
サーバーレス・コンピューティングには利点もありますが、欠点もあります。たとえば、ログ記録、トレース、モニタリングなどの目的でプロバイダーが使用するオプションやツールに開発者が制限され、開発者が独自のツールを使用することができないことです。また、開発者としては、プロバイダーの可用性に縛られ、もしプロバイダーが問題や停止を起こせば、我々のアプリケーションも影響を受けることになる。
AWSは、AWS Lambdaによるサーバーレス・コンピューティングを提供する代表的なクラウドプロバイダーです。これはサーバーレス計算のランタイムで、開発者はユーザーからのリクエストやS3バケットへのファイルのアップロードなど、特定のイベントに応じてコードを実行することができます。
また、このサービスでは、サービスに対する包括的なコストではなく、利用するコンピューティング・リソースに対するコストのみを支払うことができます。これは、規模に合わせてスケールするLambda関数によって実現され、基盤となるインフラストラクチャからは独立しています。
Chaliceとは?
Chaliceは、Pythonでサーバーレスアプリケーションを構築し、AWS Lambda関数に迅速にデプロイするためのマイクロフレームワークです。ChaliceはPythonアプリケーションの作成だけでなく、アプリケーションの作成、管理、デプロイを行うためのコマンドラインツールを提供することで、迅速なデプロイを支援します。
また、Chaliceは、Amazon API Gateway、Amazon Simple Storage Service(S3)、Simple Queue Service(SQS)など、Amazonの他のサービスとの連携機能も提供しています。RESTfulなAPIを作成したり、特定のスケジュールで実行するタスクを作成したり、ストレージ用のS3バケットに統合したりすることが可能です。
セットアップ
AWSのセットアップ
Chaliceを使い始めるには、コードをデプロイするためにAWSアカウントを設定する必要があります。これはAWSのホームページからサインアップするか、既存のAWSアカウントにログインすることで実現できます。AWSは、私たちの詳細情報だけでなく、請求先の詳細情報を提供する必要がありますが、このデモでは、テストと開発目的のためにAWS Free Tierを使用し、それに対して請求されることはありません。
アカウントが設定されると、プロファイルのドロップダウンに、”My Security Credentials “というセクションがあります。ここでは、AWSコンソールと対話するときに使用する認証情報を作成することができます。これらのクレデンシャルは、Amazon CLIツールでも使用されます。
Amazonは、ターミナルでコマンドを使用してAWSサービスと対話するために使用できるCLIツールも提供しています。このツールは、Mac、Linux、およびWindowsプラットフォームで利用可能で、Python 2.6+またはPython 3.3以降のバージョンが必要です。以下のpipコマンドを実行してインストールします。
$ pip install awscli
セットアップが完了したら、次のコマンドを実行して、CLIツールをテストします。
$ aws --version
CLIツールの詳細や他のプラットフォームへのインストールについては、こちらを参照してください。
AWS CLIツールのセットアップが完了したら、先ほど生成したシークレットキーとアクセスIDを使用して、CLIツールの設定を行ないます。
$ aws configure
アクセスキーID、シークレットアクセスキー
、デフォルトの地域と出力形式を入力するプロンプトが表示されます。最後の2つは任意ですが、AWSコンソールダッシュボードから取得したアクセスキーとシークレットが必要です。
また、AWSではユーザーごとに異なる認証情報を設定することができます。そのほか、詳細はこちらをご覧ください。
プロジェクトセットアップ
このデモプロジェクトでは、Pythonアプリケーションを構築します。プロジェクトの環境をシステムのPython環境から抽象化しておくために、仮想環境内で作業することは良い習慣です。このため、Virtualenv
ツールを用いて仮想環境を作成し、その中で作業を行うことにする。
Virtualenv` ツールがまだインストールされていない場合は、次のコマンドを実行してインストールします。
$ pip install virtualenv
Virtualenvツールの詳細については、こちらをご覧ください。
Virtualenvがインストールされたら、作業ディレクトリに移動し、以下のコマンドを実行して環境を作成してみましょう。
$ virtualenv --python=python3 venv-chalice
環境を有効にするには、次のコマンドを実行します。
$ source venv-chalice/bin/activate
これで環境が整いましたので、Chaliceをインストールし、以下のコマンドを実行してインストールを確認します。
$ pip install chalice
$ chalice --help
2番目のコマンドは、Chaliceのインストールを確認するために使用します。
実装
AWSアカウント、AWS CLIツールのインストール、環境設定、Chaliceのインストールが完了しました。Chaliceを使用して、以下のようにシンプルなRESTful APIを作成することができます。
$ chalice new-project demoapp
このコマンドは、以下のような構造のフォルダ内にシンプルなChaliceプロジェクトを作成します。
$ tree demoapp
demoapp
├── app.py
└── requirements.txt
AWS Lambda上にデプロイされたChaliceアプリを実行するために必要なその他の要件は、demoapp
フォルダ内の requirements.txt
ファイルに、新しい機能は主に app.py
ファイルに格納されます。他のファイルを作成し、メインのプロジェクトファイルである app.py
ファイルにインポートすることができます。
シンプルな API では、ユーザーの GitHub 公開リポジトリの一覧と、それぞれのリポジトリで使われている言語、そしてリポジトリのスター数を返す API を作成します。この情報は GitHub API で一般に公開されているので、API を使うのに認証情報は不要です。ユーザー名を受け取り、必要な情報を返す関数を作成します。指定したユーザー名が存在しない場合は、空のレスポンスペイロードを受け取ります。
GitHub API とのやりとりを行う github_repos
関数を作成しましょう。
import requests
def github_repos(username):
# Final list to contain our repository objects
formatted_repos = []
if username:
# Format the url by insterting the passed username
url = "https://api.github.com/users/{}/repos".format(username)
r = requests.get(url)
# Get the JSON containing the list of repositories
list_of_repos = r.json()
for repo in list_of_repos:
repo_object = {
"name": repo["name"],
"stars": repo["watchers"],
"language": repo["language"],
}
formatted_repos.append(repo_object)
return formatted_repos
関数 github_repos
はユーザー名を受け取り、それを GitHub API の URL に差し込んでからリクエストを行います。受け取ったレスポンスには今すぐには必要ない情報がたくさん含まれているので、必要なリポジトリの詳細を抽出して新しいオブジェクトを作成し、Chalice アプリからユーザーに送信する formatted_repos
のリストに追加します。
まず、この関数に対していくつかのローカルテストを実行してみましょう。
この関数をChaliceアプリの app.py
ファイルに統合する準備ができました!これが私たちのアプリの最終バージョンです。
import requests
from chalice import Chalice
def github_repos(username):
# Function implementation above
app = Chalice(app_name='demoapp')
@app.route('/')
def index():
return {'hello': 'world'}
# Create our new route to handle github repos functionality
@app.route('/user/{username}')
def github(username):
return {"repos": github_repos(username)}
これで、私たちのアプリケーションはユーザーによって消費される準備が整いましたので、AWS Lambdaにデプロイしてみましょう。
アプリのデプロイ
ChaliceアプリケーションをAWS Lambdaにデプロイするのは、作業ディレクトリで以下のコマンドを実行することで簡単にできます。
$ chalice deploy
Chaliceがデプロイ処理を行い、先ほど作成したRESTful APIと対話できるリンクを返してくれます。
API をテストするには、Postman やウェブブラウザ、あるいはその他の API インタラクションツールを使って上のスクリーンショットにある “REST API URL” のエンドポイント /user/<github-username
にリクエストを発行します。GitHub のユーザー名を渡すと、このように出力されました。
もしコードを変更した場合は、もう一度 chalice deploy
コマンドを実行すれば、Chalice が変更した内容でアプリケーションを再デプロイしてくれます。
AWS Consoleに移動して、左側の折りたたみ式サイドバーの「Functions」セクションをクリックすると、現在アプリケーションを実行しているLambda関数が表示されます。
関数をクリックすると、現在の構成、アプリケーションに設定されている環境変数、実行ロール、メモリ構成など、関数の詳細が表示されます。
また、AWSが提供する監視・管理サービスであるCloudWatchを通じて、イベントログやメトリクスなどの監視オプションも提供されています。
これは、私たちのアプリケーションのモニタリングダッシュボードのビューです。
ユーザーによる呼び出しの数、APIによって提供されたリクエストの時間、成功率やエラー率などの統計情報を得ることができます。
上のスクリーンショットでは見えませんが、同じダッシュボードに個々のリクエストのビューも表示されます。AWSは私たちのために箱から出してくれるものがたくさんあり、私たちのデプロイメントの経験を短くし、ポイントにまっすぐにしてくれるのです。サーバーのメンテナンスや、監視やログ取得の方法についてもAWSがカバーしてくれているので、心配する必要はありません。
これがサーバーレス体験です。
概要
この記事では、Chalice マイクロフレームワークを使用してサーバーレス Python API を作成し、それを AWS Lambda にデプロイしました。AWS CLIは、Chalice CLIツールと並んで、私たちのプロジェクトを素早くブートストラップするのに役立ち、私たちはたった1つのコマンドを使用してAWS Lambdaにデプロイを行いました。
私たちのものは、私たちの側でサーバーのプロビジョニングやメンテナンスを行う必要がなかったため、サーバーレスアプリケーションとなっています。私たちはコードを書くだけで、アプリケーションのデプロイ、スケーリング、監視など、残りの部分はAWSに任せました。アプリケーションの監視など他の面ではまだAWSに依存していますが、アプリケーションを利用できるようになるまでにかかる時間は大幅に短縮されました。
このプロジェクトのソースコードはGitHubで公開されています。
</github-username