目次

はじめに

本書の想定読者
本書の構成
サンプルコードと正誤表など
謝辞
免責事項
表記関係について
底本について

第1章 Pythonでサーバーレスアプリの実装をしよう

1.1 Pythonとは
1.2 サーバーレスとは
1.3 Chaliceとは
1.4 Transcryptとは

第2章 サーバーレスアプリ開発環境の構築をしよう

2.1 開発用PCを用意する
2.2 Pythonをインストールする
2.3 Javaをインストールする
2.4 Gitをインストールする
2.5 HTTPieをインストールする
2.6 Web Server for Chromeをインストールする
2.7 Access key IDとSecret access keyを取得する
2.8 AWSコマンドラインインターフェイスをインストールする
2.9 AWSの認証情報を設定する
2.10 作業用ディレクトリーを作成する
2.11 仮想環境を作成する
2.12 Chaliceをインストールする
2.13 Boto3をインストールする
2.14 Transcryptをインストールする

第3章 ChaliceでWeb APIの実装をしよう

3.1 開発するWeb API
3.2 プロジェクトを作成する
3.3 AWSにデプロイする
3.4 AWSから削除する
3.5 ローカル環境で実行する
3.6 モジュールを分割する
3.7 パス変数を受け取る
3.8 HTTPエラーを返す

第4章 DynamoDBでデータの永続化をしよう

4.1 DynamoDBとは
4.2 テーブルを設計する
4.3 DynamoDBをシミュレートする
4.4 テーブルを作成する
4.5 初期データを投入する
4.6 DynamoDBに接続する
4.7 データを登録する
4.8 データを更新する
4.9 データを削除する
4.10 AWS環境にデプロイする

第5章 Transcryptで画面の実装をしよう

5.1 HTMLで画面を作成する
5.2 CORSに対応する
5.3 初期表示処理を実装する
5.4 新規登録機能を実装する
5.5 変更機能を実装する
5.6 完了/完了取り消し機能を実装する
5.7 削除機能を実装する
5.8 AWSにデプロイする

第6章 AWS CodePipelineでCI/CD環境の構築をしよう

6.1 CI/CDとは
6.2 バックエンドのCI/CD環境を構築する
6.3 バックエンドのソースコードをGitで管理する
6.4 バックエンドの動作を確認する
6.5 フロントエンドのCI/CD環境を構築する
6.6 フロントエンドのソースコードをGitで管理する
6.7 フロントエンドの動作を確認する
6.8 お疲れ様でした!

第7章 Pythonでサーバーレスアプリのテストをしよう

7.1 実装しておしまいじゃないよね
7.2 V字モデルをみてみよう
7.3 テストピラミッドという理想形
7.4 だから「テスト」も「つくる」の範疇

第8章 pytestでユニットテストをしよう

8.1 PythonにおけるxUnit
8.2 ユニットテストの環境を用意する
8.3 ユニットテストを書いてみる
8.4 テストコードを実行する
8.5 ユニットテストの落とし穴
8.6 使えそうなテスト技法
8.7 技法を踏まえてテストケースを追加する
8.8 どのくらいテストできているか
8.9 モックを使ってテストする
8.10 不安が退屈に変わるまで

第9章 pytestでAPIテストをしよう

9.1 APIテストでもpytest
9.2 サーバーとデータベースの準備をする
9.3 APIテストの環境を用意する
9.4 APIテストを書いてみる
9.5 ここでも使える同値分割・境界値分析
9.6 組み合わせテストのテクニック
9.7 pictのインストールと使い方
9.8 テストのパラメーター化
9.9 実行してみると?

第10章 SeleneでUIテストをしよう

10.1 End to Endを自動化する
10.2 スモークテスト
10.3 UIテストの環境を用意する
10.4 Seleniumだけでやってみる、あえてね。
10.5 そしてSelene
10.6 Page Objectパターン
10.7 はやるかな?

第11章 手動テストは……さすがに手でやろう

11.1 手動テストはなくならない
11.2 じゃ今までのことは?
11.3 まだ確認してないことを手動テストで
11.4 完璧を目指すよりも……

第12章 CI/CD環境で自動テストをしよう

12.1 触れていなかった自動テストのメリット
12.2 CI/CD環境に自動テストを設定する
12.3 どのようにテストを運用するか
12.4 お疲れ様でした!

はじめに

 このたびは『ほぼ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

サンプルコードと正誤表など

 本書に掲載されているコードや正誤表などは、次のリポジトリーで公開しています。

 ・https://github.com/7pairs/hobopy

謝辞

 表紙のイラストを描いてくださったジョン湿地王さん1に感謝いたします。素敵なイラストが執筆中の筆者たちの励みになりました。ありがとうございます。

 本書の原稿をレビューしてくださった、ささきさん2、矢田裕基さん3(順不同)にも御礼申し上げます。お二人のご指摘のおかげで、本書の内容がより良いものになりました。ありがとうございます。

免責事項

 本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。

表記関係について

 本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。

底本について

 本書籍は、技術系同人誌即売会「技術書典5」で頒布されたものを底本としています。

第1章 Pythonでサーバーレスアプリの実装をしよう

1.1 Pythonとは

 本書のタイトルは『ほぼPythonだけでサーバーレスアプリをつくろう』です。タイトルのとおり、ほぼすべてのコードをPython1で実装します。

 近ごろ話題に上ることが多くなったので、「Pythonという名前くらいは聞いたことがある」という方も多いでしょう。データサイエンスや機械学習の領域に強い言語ですが、それだけではなく、もっと広い用途に活用できる汎用プログラミング言語です。

 Pythonの日本語ポータルサイトPython Japanでは、Pythonの特徴として次のようなことを挙げています2


 ・とてもクリーンで読みやすい文法

 ・強力な内省(イントロスペクション)機能

 ・直感的なオブジェクト指向

 ・手続き型のコードによる、自然な表現

 ・パッケージの階層化もサポートした、完全なモジュール化サポート

 ・例外ベースのエラーハンドリング

 ・高レベルな動的データ型

 ・事実上すべてのタスクをこなせる、広範囲に及ぶ標準ライブラリとサードパーティのモジュール

 ・拡張とモジュールはC/C++で書くのが容易(JythonではJava、IronPythonでは.NET言語を利用)

 ・アプリケーションに組み込んでスクリプトインタフェースとして利用することが可能


 本書を通じてこれらの特徴の一端に触れ、Pythonという言語を好きになっていただければ、筆者としてこれに勝る喜びはありません。

 本書ではChalice3Transcrypt4などのパッケージを利用して実装を進めます。もちろん、どちらもPython製のパッケージです。

1.2 サーバーレスとは

 本書ではサーバーレスコンピューティング(以下サーバーレス)を活用して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.

 FaaSBaaSという言葉を聞いたことがある方もいらっしゃるでしょう。これらの技術の総称がサーバーレスということになります。

 FaaS(Functions as a Service)は、イベント駆動で関数を実行するための基盤を提供するサービスです。FaaS上の関数は、HTTPリクエストなど特定のイベントがトリガーとなって呼び出されます。開発者は関数の実行基盤より下位のレイヤーを意識する必要はなく、似たような名前のIaaS(Infrastructure as a Service)、PaaS(Platform as a Service)などと比べると、管理が必要となる領域はより小さくなっています。

図1.1: Everything 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)を利用してサーバーレスを実現します。

1.3 Chaliceとは

 ChaliceはAWS向けのPython製サーバーレスマイクロフレームワークです。Chaliceを利用することにより、Amazon API Gateway8AWS Lambda9を組み合わせたWeb APIをスピーディに開発できます。

 AWSに対応したサーバーレスフレームワークはChalice以外にも存在します。その中から筆者たちがChaliceを選んだのにはふたつの理由がありました。

 ひとつ目はAWSによって開発されていることです。AWS謹製といわれるとやはり安心感がありますよね。

 ふたつ目は名前がChaliceであることです。聖杯なのです。Pythonで聖杯といえばMonty Python and the Holy Grail10であり、Monty Python's Spamalot11なのです。ニッ!12

AWS向けサーバーレスフレームワーク

 本文中で触れたとおり、AWSに対応したサーバーレスフレームワークはChaliceだけではありません。その中でも代表的なServerless Framework13Zappa14を簡単にご紹介しましょう。

 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アプリを手っ取り早くサーバーレスへ移行するにはうってつけのフレームワークです。

1.4 Transcryptとは

 TranscryptはPython製のJavaScriptトランスパイラで、PythonのコードをJavaScriptへ変換します。つまり、Transcryptを利用すれば、PythonをAltJSとして扱えるのです。

 JavaScriptへ変換できれば、Pythonの可能性が大きく広がっていきます。Webブラウザー上で実行することはもちろん、Electron16を利用すればデスクトップアプリが、React Native17を利用すればスマートフォンアプリが開発できてしまうのです。JavaScriptのエコシステム万歳!

 なお、本書ではjQuery18を利用してフロントエンドを実装します。



第2章 サーバーレスアプリ開発環境の構築をしよう

2.1 開発用PCを用意する

 本書に掲載されたプログラムを実行するには、インターネットに接続されたmacOS、もしくはLinuxのPCが必要になります。

 お使いのPCがWindowsの場合、Docker1やVirtualBox2などの仮想化ソフトウェアを利用してLinux環境を構築し、その上で本書のプログラムを実行することを推奨します。

 どうしてもWindows上で実行したい場合、いくつかのコマンドはWindows向けに読み替えてください。

2.2 Pythonをインストールする

 それでは、サーバーレスアプリを開発するための環境を整えていきましょう。まずはPythonのインストールからです。

 本書で採用しているChaliceのREADME3に次のような記述があります。

Note: make sure you are using python2.7, python3.6, or python3.7.

 サポート終了まで半年を切っている4Python2.7を今さら選んではいけません。また、わざわざバージョンを3.6に下げるだけの特別な理由もありませんので、本書では最新バージョン5のPython3.7.4を利用します。

2.2.1 Macの場合

 https://www.python.org/downloads/mac-osx/ からインストーラーをダウンロードします。「Python 3.7.4 - July 8, 2019」のリストから、ご利用の環境に合わせたファイルを選んでください。

 ダウンロードしたpkgファイルを開くとインストーラーが起動します。以降はインストーラーの指示にしたがってインストールを完了させてください。

2.2.2 Linuxの場合

 ディストリビューションによって手順が異なるため、Python Japanの環境構築ガイド6を参考にインストールしてください。

2.2.3 Windowsの場合

 https://www.python.org/downloads/windows/ からインストーラーをダウンロードします。「Python 3.7.4 - July 8, 2019」のリストから、ご利用の環境に合わせたファイルを選んでください。

 ダウンロードしたexeファイルを開くとインストーラーが起動します。「Add Python 3.7 to PATH」にチェックを入れ、「Install now」をクリックしてください(図2.1)。以降はインストーラーの指示にしたがってインストールを完了させてください。

図2.1: Python3.7.4のインストーラー

 インストールが完了したら、最後に環境変数を編集しましょう。ユーザー環境変数のPath%APPDATA%\Python\Python37\Scriptsを追加してください7

2.3 Javaをインストールする

 何度も繰り返しますが、本書のタイトルは『ほぼ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 is Still Free.

 「Javaは有償化されるんじゃなかったの? インストールしても大丈夫なの?」と不安になった方もいらっしゃるでしょう。でも、ご安心ください。Javaは今後も無償で利用できます。

 リリースモデルがこれまでとは大きく変わったため、情報が錯綜するのは仕方がない面もあります。その一方で、意図的に誤った解釈をしているように見受けられる例もあるのが困りものです。Oracle嫌いをこじらせたアンチがOracleを叩くためだったり、SEO対策だけは完璧な自称技術ブログがPVを稼ぐためだったり……。

 このような誤った情報のせいで誤解されていた方は「『Java 有償化』で誤解する人になるべく分かりやすく説明するためのまとめ」8をぜひご一読ください。「ほぼPythonだけ」を銘打った本でこんなことを力説するのもおかしな話ですが、筆者たちはこういった正しい情報が広まってくれることを心より願っています。

2.4 Gitをインストールする

 第6章でCI/CD環境を構築するために、分散型バージョン管理システムのGitを利用します。普段Gitをお使いでない方は、手順にしたがってインストールしてください。

2.4.1 Macの場合

 http://git-scm.com/download/mac からインストーラーをダウンロードします。

 ダウンロードしたdmgファイル内のpkgファイルを開くとインストーラーが起動します。以降はインストーラーの指示にしたがってインストールを完了させてください。

2.4.2 Linuxの場合

 apt-getyumdnfなど、ディストリビューションに応じたパッケージ管理コマンドでgitをインストールしてください。

2.4.3 Windowsの場合

 https://git-scm.com/download/win からインストーラーをダウンロードします。

 ダウンロードしたexeファイルを開くとインストーラーが起動します。以降はインストーラーの指示にしたがってインストールを完了させてください。

2.5 HTTPieをインストールする

 本書ではサンプルのWeb APIに何度もアクセスすることになります。curlなどを使っても構わないのですが、今回はより便利なHTTPie9を利用しましょう。

2.5.1 Macの場合

 Homebrew10でインストールします。ターミナルで次のコマンドを実行してください。

$ brew install httpie

 何らかの理由でHomebrewを利用できない、もしくは利用したくない場合は、Windowsと同様のコマンドでインストールしてください。

2.5.2 Linuxの場合

 apt-getyumdnfなど、ディストリビューションに応じたパッケージ管理コマンドでhttpieをインストールしてください。

2.5.3 Windowsの場合

 コマンドプロンプトで次のコマンドを実行してください。

> pip install --upgrade httpie

試し読みはここまでです。
この続きは、製品版でお楽しみください。