はじめに
第1章 Pythonでサーバーレスアプリの実装をしよう
第2章 サーバーレスアプリ開発環境の構築をしよう
第3章 ChaliceでWeb APIの実装をしよう
第4章 DynamoDBでデータの永続化をしよう
第5章 Transcryptで画面の実装をしよう
第6章 AWS CodePipelineでCI/CD環境の構築をしよう
第7章 Pythonでサーバーレスアプリのテストをしよう
第8章 pytestでユニットテストをしよう
第9章 pytestでAPIテストをしよう
第10章 SeleneでUIテストをしよう
第11章 手動テストは……さすがに手でやろう
第12章 CI/CD環境で自動テストをしよう
このたびは『ほぼPythonだけでサーバーレスアプリをつくろう』をお手に取っていただきありがとうございます。本書はAmazon Web Servicesを利用したサーバーレスアプリ開発のガイドブックです。タイトルにあるように、実装、テストに関わるほぼすべてのコードをPythonで記述します。
ここ数年でPythonの注目度は一気に高まり、2020年春から基本情報技術者試験の選択問題として採用されるまでになりました。以前よりPythonを利用していた筆者たちはこの盛り上がりを喜ぶ一方、データサイエンスや機械学習の領域ばかりで持て囃されることに歯がゆさも感じています。本書によってPythonの違った側面を知っていただければ幸いです。
本書がみなさまのサーバーレス開発の一助となりますように。
令和元年7月吉日
筆者を代表して
長谷場 潤也
本書は次のような方を読者と想定して書かれています。
・何らかの言語でのプログラミング経験がある
・Amazon Web Servicesを利用したサーバーレスアプリの開発に興味がある
・Webアプリに対してのテスト手法に興味がある
本書は第1章から第6章でサーバーレスアプリを一から実装し、第7章から第12章でそのアプリに対するテストを実施します。チュートリアル形式で進めますので、はじめて読まれる際には第1章から順に読み進めることをお勧めします。
なお、本書に登場するソフトウェアは、一部を除いて2019年7月時点の最新版で動作を確認しています。
・Python 3.7.4
・AdoptOpenJDK 11.0.3+7
・Chalice 1.9.1
・Transcrypt 3.7.16
・Boto3 1.9.185
・pytest 5.0.1
・Requests 2.22.0
・Selenium 3.141.0
・Selene 1.0.0a13
表紙のイラストを描いてくださったジョン湿地王さん1に感謝いたします。素敵なイラストが執筆中の筆者たちの励みになりました。ありがとうございます。
本書の原稿をレビューしてくださった、ささきさん2、矢田裕基さん3(順不同)にも御礼申し上げます。お二人のご指摘のおかげで、本書の内容がより良いものになりました。ありがとうございます。
本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。
本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。
本書籍は、技術系同人誌即売会「技術書典5」で頒布されたものを底本としています。
本書のタイトルは『ほぼPythonだけでサーバーレスアプリをつくろう』です。タイトルのとおり、ほぼすべてのコードをPython1で実装します。
近ごろ話題に上ることが多くなったので、「Pythonという名前くらいは聞いたことがある」という方も多いでしょう。データサイエンスや機械学習の領域に強い言語ですが、それだけではなく、もっと広い用途に活用できる汎用プログラミング言語です。
Pythonの日本語ポータルサイトPython Japanでは、Pythonの特徴として次のようなことを挙げています2。
・とてもクリーンで読みやすい文法
・強力な内省(イントロスペクション)機能
・直感的なオブジェクト指向
・手続き型のコードによる、自然な表現
・パッケージの階層化もサポートした、完全なモジュール化サポート
・例外ベースのエラーハンドリング
・高レベルな動的データ型
・事実上すべてのタスクをこなせる、広範囲に及ぶ標準ライブラリとサードパーティのモジュール
・拡張とモジュールはC/C++で書くのが容易(JythonではJava、IronPythonでは.NET言語を利用)
・アプリケーションに組み込んでスクリプトインタフェースとして利用することが可能
本書を通じてこれらの特徴の一端に触れ、Pythonという言語を好きになっていただければ、筆者としてこれに勝る喜びはありません。
本書ではChalice3、Transcrypt4などのパッケージを利用して実装を進めます。もちろん、どちらもPython製のパッケージです。
本書ではサーバーレスコンピューティング(以下サーバーレス)を活用してWebアプリを開発します。では、そのサーバーレスとは何なのでしょうか?
Cloud Native Computing FoundationのServerless Working Groupが公開しているCNCF Serverless Whitepaper5には、サーバーレスについて次のように書かれています。
A serverless computing platform may provide one or both of the following:
1. Functions-as-a-Service (FaaS), which typically provides event-driven computing. Developers run and manage application code with functions that are triggered by events or HTTP requests. Developers deploy small units of code to the FaaS, which are executed as needed as discrete actions, scaling without the need to manage servers or any other underlying infrastructure.
2. Backend-as-a-Service (BaaS), which are third-party API-based services that replace core subsets of functionality in an application. Because those APIs are provided as a service that auto-scales and operates transparently, this appears to the developer to be serverless.
FaaSやBaaSという言葉を聞いたことがある方もいらっしゃるでしょう。これらの技術の総称がサーバーレスということになります。
FaaS(Functions as a Service)は、イベント駆動で関数を実行するための基盤を提供するサービスです。FaaS上の関数は、HTTPリクエストなど特定のイベントがトリガーとなって呼び出されます。開発者は関数の実行基盤より下位のレイヤーを意識する必要はなく、似たような名前のIaaS(Infrastructure as a Service)、PaaS(Platform as a Service)などと比べると、管理が必要となる領域はより小さくなっています。
BaaS(Backend as a Service)は、認証やデータベースといった多くのアプリで必要とされるバックエンドの機能を提供するサービスです。モバイル向けのBaaSは、特にmBaaS(mobile Backend as a Service)と呼ばれることもあります。BaaS/mBaaSを利用することによって、バックエンドの開発量を削減できるとともに、それらの機能を扱うサーバーを管理する必要もなくなります。
FaaS、BaaSともに、重要なのはサーバーの管理が不要になることです6。Serverlessを直訳すると「サーバーが存在しない」という意味になりますが、実行環境としてのサーバーではなく、管理対象としてのサーバーが存在しないのだと考えてください。サーバーレスでアプリを構築することにより、開発者はサーバーの管理から解放され、アプリ内部の実装に集中できるのです7。
本書ではAmazon Web Services(以下AWS)を利用してサーバーレスを実現します。
ChaliceはAWS向けのPython製サーバーレスマイクロフレームワークです。Chaliceを利用することにより、Amazon API Gateway8とAWS Lambda9を組み合わせたWeb APIをスピーディに開発できます。
AWSに対応したサーバーレスフレームワークはChalice以外にも存在します。その中から筆者たちがChaliceを選んだのにはふたつの理由がありました。
ひとつ目はAWSによって開発されていることです。AWS謹製といわれるとやはり安心感がありますよね。
ふたつ目は名前がChaliceであることです。聖杯なのです。Pythonで聖杯といえばMonty Python and the Holy Grail10であり、Monty Python's Spamalot11なのです。ニッ!12
本文中で触れたとおり、AWSに対応したサーバーレスフレームワークはChaliceだけではありません。その中でも代表的なServerless Framework13とZappa14を簡単にご紹介しましょう。
Serverless Frameworkは、Node.js、Python、Java、Go、C#、Ruby、Swift、Kotlin、PHP、Scala、F#と、非常に多くの言語をサポートしたフレームワークです。AWS以外にも、Microsoft Azure、Apache OpenWhisk、Google Cloud Functions、Kubeless、Spotinst、Fn Project、Cloudflare Workersに対応しています。特定のプラットフォームにロックインされたくないプロジェクトでは有力な選択肢になるでしょう。
ZappaはChaliceと同様、Python製のフレームワークです。WSGI15に対応したアプリを、API GatewayとLambdaに対してそのままデプロイできます。既存のWebアプリを手っ取り早くサーバーレスへ移行するにはうってつけのフレームワークです。
TranscryptはPython製のJavaScriptトランスパイラで、PythonのコードをJavaScriptへ変換します。つまり、Transcryptを利用すれば、PythonをAltJSとして扱えるのです。
JavaScriptへ変換できれば、Pythonの可能性が大きく広がっていきます。Webブラウザー上で実行することはもちろん、Electron16を利用すればデスクトップアプリが、React Native17を利用すればスマートフォンアプリが開発できてしまうのです。JavaScriptのエコシステム万歳!
なお、本書ではjQuery18を利用してフロントエンドを実装します。
本書に掲載されたプログラムを実行するには、インターネットに接続されたmacOS、もしくはLinuxのPCが必要になります。
お使いのPCがWindowsの場合、Docker1やVirtualBox2などの仮想化ソフトウェアを利用してLinux環境を構築し、その上で本書のプログラムを実行することを推奨します。
どうしてもWindows上で実行したい場合、いくつかのコマンドはWindows向けに読み替えてください。
それでは、サーバーレスアプリを開発するための環境を整えていきましょう。まずはPythonのインストールからです。
本書で採用しているChaliceのREADME3に次のような記述があります。
Note: make sure you are using python2.7, python3.6, or python3.7.
サポート終了まで半年を切っている4Python2.7を今さら選んではいけません。また、わざわざバージョンを3.6に下げるだけの特別な理由もありませんので、本書では最新バージョン5のPython3.7.4を利用します。
https://www.python.org/downloads/mac-osx/ からインストーラーをダウンロードします。「Python 3.7.4 - July 8, 2019」のリストから、ご利用の環境に合わせたファイルを選んでください。
ダウンロードしたpkgファイルを開くとインストーラーが起動します。以降はインストーラーの指示にしたがってインストールを完了させてください。
ディストリビューションによって手順が異なるため、Python Japanの環境構築ガイド6を参考にインストールしてください。
https://www.python.org/downloads/windows/ からインストーラーをダウンロードします。「Python 3.7.4 - July 8, 2019」のリストから、ご利用の環境に合わせたファイルを選んでください。
ダウンロードしたexeファイルを開くとインストーラーが起動します。「Add Python 3.7 to PATH」にチェックを入れ、「Install now」をクリックしてください(図2.1)。以降はインストーラーの指示にしたがってインストールを完了させてください。
インストールが完了したら、最後に環境変数を編集しましょう。ユーザー環境変数のPathに%APPDATA%\Python\Python37\Scriptsを追加してください7。
何度も繰り返しますが、本書のタイトルは『ほぼPythonだけでサーバーレスアプリをつくろう』です。残念ながら次のような場面ではJavaの力を借りなければなりません。
・DynamoDB Localを起動する(第4章)
・Transcryptでトランスパイルしたコードをminifyする(第5章)
とはいえ、ここで要求されているのは実行環境としてのJava Virtual Machineであり、プログラミング言語としてのJavaではありません。本書の範囲内でJavaのコードを書くことはありませんのでご安心ください。
なお、本書ではAdoptOpenJDKを例にインストール方法を説明しますが、別の団体がビルドしたJDKを利用してもまったく問題はありません。
それではインストール作業に戻りましょう。https://adoptopenjdk.net/ からインストーラーをダウンロードします。「Choose a Version」から「OpenJDK 11 (LTS)」を選択し、「Latest release」のリンクからダウンロードしてください。
ダウンロードしたファイルを開くとインストーラーが起動します。以降はインストーラーの指示にしたがってインストールを完了させてください。
「Javaは有償化されるんじゃなかったの? インストールしても大丈夫なの?」と不安になった方もいらっしゃるでしょう。でも、ご安心ください。Javaは今後も無償で利用できます。
リリースモデルがこれまでとは大きく変わったため、情報が錯綜するのは仕方がない面もあります。その一方で、意図的に誤った解釈をしているように見受けられる例もあるのが困りものです。Oracle嫌いをこじらせたアンチがOracleを叩くためだったり、SEO対策だけは完璧な自称技術ブログがPVを稼ぐためだったり……。
このような誤った情報のせいで誤解されていた方は「『Java 有償化』で誤解する人になるべく分かりやすく説明するためのまとめ」8をぜひご一読ください。「ほぼPythonだけ」を銘打った本でこんなことを力説するのもおかしな話ですが、筆者たちはこういった正しい情報が広まってくれることを心より願っています。
第6章でCI/CD環境を構築するために、分散型バージョン管理システムのGitを利用します。普段Gitをお使いでない方は、手順にしたがってインストールしてください。
http://git-scm.com/download/mac からインストーラーをダウンロードします。
ダウンロードしたdmgファイル内のpkgファイルを開くとインストーラーが起動します。以降はインストーラーの指示にしたがってインストールを完了させてください。
apt-get、yum、dnfなど、ディストリビューションに応じたパッケージ管理コマンドでgitをインストールしてください。
https://git-scm.com/download/win からインストーラーをダウンロードします。
ダウンロードしたexeファイルを開くとインストーラーが起動します。以降はインストーラーの指示にしたがってインストールを完了させてください。
本書ではサンプルのWeb APIに何度もアクセスすることになります。curlなどを使っても構わないのですが、今回はより便利なHTTPie9を利用しましょう。
Homebrew10でインストールします。ターミナルで次のコマンドを実行してください。
$ brew install httpie
何らかの理由でHomebrewを利用できない、もしくは利用したくない場合は、Windowsと同様のコマンドでインストールしてください。
apt-get、yum、dnfなど、ディストリビューションに応じたパッケージ管理コマンドでhttpieをインストールしてください。
コマンドプロンプトで次のコマンドを実行してください。
> pip install --upgrade httpie