iPhone と AWS だけで作るマイクロサービス

Merry Christmas🎄

この記事は [Pythonista Advent Calendar 2017](https://qiita.com/advent-calendar/2017/pythonista) の24日目の記事です。
iPhoneとAWSだけでマイクロサービスを作るための忘備録です。スクショの解説多めに作ります。

イブにあまり人気のないカレンダーを書いていて余計に寂しい感じもしますが、頑張ります。


## 前置き
自分の身の周りに存在する小さな問題を解決するのに、Pythonistaは非常に役立ちます。
ここまで完成度の高いアプリがあれば、iPhoneだけでサービスを提供できるのでは？と言う疑問も湧きます。

iOSには[映画撮影で使われたアプリ](https://itunes.apple.com/jp/app/filmic-pro/id436577167?mt=8)、[イラストレーターが仕事で使うアプリ](https://itunes.apple.com/jp/app/procreate/id425073498?mt=8)、[DTMで使えるアプリ](https://itunes.apple.com/jp/app/korg-module/id932191687?mt=8&ign-mpt=uo=4)など、
プロ目線で見てコンテンツを作成するのに十分な機能を持つアプリが既にあるのに、
iPhoneだけでプログラミングされたプロダクトを今までに聞いたことがありません。

幸いPythonista には、Bottle や Flask がプリインストールされているので、
DBを使わないマイクロサービスとクラウドを組み合わせればイケるんじゃないか？と思い立ってチャレンジしました。
(iPhoneやiPadだけで仕事して見たい願望もあります🤞)

なお本文の内容は、iPhoneだけでなくiPadでも作ることができます。


## 技術選定について
ラップトップと同じ感覚で開発すると辛い目にあうので、
コンテンツ制作に集中するため、周辺環境の整備に手間がかからないことを第一条件とします。
筆者がインフラの業務経験がないので、間違いがあればご指摘ください。🙇

### アプリ
* Pythonista
* Working Copy

[Working copy](https://itunes.apple.com/jp/app/working-copy/id896694807?mt=8) は git-flow をiOSで実現できるアプリです。
GitHub or AWSのCodeCommitと紐づける役割をします。

Stash インストール済み環境であれば、`git` が使えるので好みで。

### ツール
* Flask
* AWS CodeStar

WebのPythonと言えば最近メジャーアップデートのあった Django だと思いますが、
iPhoneのコマンドライン作業は手順が煩雑になりそうなので今回はパス。
Pythonista にプリインストールされていて、ある程度の規模まで発展が見込める [Flask](https://github.com/pallets/flask/stargazers) を採用しました。

[AWS CodeStar](https://aws.amazon.com/jp/codestar/) は、いわゆる開発環境のスキャフォールドで、
コードのテスト・デプロイ・コンピューティングを一括で設定できるサービスです。

iPhoneという制約下でサーバ周りを整備する手間をかけていられないので、今回採用します。
ちなみに、2017年12月時点で東京リージョンでは提供されていません。

### サービス
* そば情報API

理由は、東京のそばが美味しいからです😇
一つの食べ物を掘り下げた情報のAPIが見つけられなかった、というのも理由です。
いくつかのユーザーパラメータをPOSTして `json` で返す簡単な仕様で作り始めます。

ぐるなびAPIを使うので、キーを取得しておきます。
http://api.gnavi.co.jp/api/

サンプルコードがあんまり良く無いので修正して使っています。
フロントの準備は、今回やりません。



## 準備
CodeStar側から準備を開始します。

### 手順

1. CodeStar で Flask のテンプレートを選択して作成
2. Working Copy で Git clone
3. Pythonistaでアプリを編集・更新
4. Working Copy で commit
5. ダッシュボードを確認・エンドポイントにアクセス


#### AWS CodeStar 側

##### 1-1. CodeStar プロジェクトを作成
![AWS_CodeStar.png](https://qiita-image-store.s3.amazonaws.com/0/48607/f4f07dd7-eadd-b664-a731-a54bbd3b3073.png)

##### 1-2. Flask テンプレートを選択
![AWS_CodeStar1.png](https://qiita-image-store.s3.amazonaws.com/0/48607/76397994-69de-fd63-e417-2f06c022c133.png)

##### 1-3. プロジェクト名とリポジトリ選択
今回は、GitHub を使います。先にCodeCommitにトライしましたが、手数が多いです。

![AWS_CodeStar2.png](https://qiita-image-store.s3.amazonaws.com/0/48607/e83a4613-629f-6309-0b67-5d327ca45dd6.png)

##### 1-4. 準備完了
数分後、エンドポイントにアクセスできます。
サーバ側の設定は終わりです。


#### iPhone(WorkingCopy) 側

##### 2-1. 右上のプラスアイコンから、`Clone Repository`
<img width="320" alt=”” src=https://qiita-image-store.s3.amazonaws.com/0/48607/70709e5a-56e9-f060-24f3-558e2648a42e.png>

##### 2-2. src ディレクトリを `OpenIn`
<img width="320" alt=”” src=https://qiita-image-store.s3.amazonaws.com/0/48607/958619f2-0db4-e17f-db48-ddc11ad06195.png>

##### 2-3. Run Pythonista から `ImportFile`
<img width="320" alt=”” src=https://qiita-image-store.s3.amazonaws.com/0/48607/74fdcb41-bb34-4310-1338-893a211f5098.png>

##### 2-4. Pythonista 側で実行と編集
<img width="320" alt="BF1CB642-2AD9-447C-A58F-34F4594BA290.png" src="https://qiita-image-store.s3.amazonaws.com/0/48607/88c33d1a-f784-e849-ba47-4f5bacef6f9e.png">

##### 3. Pythonista から WorkingCopyへ
<img width="320" alt="AADE631F-CB6B-4AF4-A494-7EE822DB0A99.png" src="https://qiita-image-store.s3.amazonaws.com/0/48607/106f826b-fa5d-94a1-4033-b926fcf722de.png">

##### 4-1. 更新を反映
`Save As`で src ディレクトリに保存します。

<img width="320" alt="493B8459-DF34-4690-B79B-DDAD3EFFF302.png" src="https://qiita-image-store.s3.amazonaws.com/0/48607/dab9b1b4-287d-6620-4e6c-e935f23c4b92.png">

##### 4-2. GitHub へ commit & push
<img width="320" alt="F3EDFD08-005A-47C6-AFE1-6784FF0D1E65.png" src="https://qiita-image-store.s3.amazonaws.com/0/48607/41db9f4c-6ba6-c326-b87a-19d6758212d9.png">

##### 5. ダッシュボードで確認

![dashboard.jpg](https://qiita-image-store.s3.amazonaws.com/0/48607/69b53c09-6042-9742-972c-45c47b0bd9ed.jpeg)


上記の手順を繰り返して、サービスの中身を更新していきます。


## 成果物

### コード

バックエンド側の Python コードです。

```python:application
#!flask/bin/python
# -*- coding: utf-8 -*-
from flask import Flask, jsonify
from flaskrun import flaskrun
#from flask_cors import CORS

import search


application = Flask(__name__)
application.config['JSON_AS_ASCII'] = False
#CORS(application)

@application.route('/')
def index():
    d = search.run()
    return jsonify(d)


if __name__ == '__main__':
    flaskrun(application)
```


### POST/GET
pythonistaから、httpリクエストします。

```bash
import requests as r; r.get('http://ec2-13-210-212-76.ap-southeast-2.compute.amazonaws.com/').text
>>> '{\n "Output": "Hello World"\n}\n'
```

ローカルでしか動かない… Internal Server Error でハマってしまい、
後味の悪い結果になりました。


## やって見た感想と課題

#### サービス
手段が目的になってしまった感、あります。

APIをラッピングしてアレンジすればうまくいくやろー、とタカを括って取り組み始めましたが、
APIの性質か大まかな情報しか得られず、サービスとしては入り口に立っただけです。
本気で作り込むなら、構成を分けたサーバを用意して、Webスクレイピング等で
自前のデータベースを持つ必要があると感じました。今後の課題です。

#### 環境整備
数回のタップで環境を準備出来る CodeStar は、開発と運用を1人でやりくりする要件にピッタリでした。
初期設定で楽できる分、エラーハンドリングが結構重めです。

Pythonista でカバーしきれない部分に AWS を組み合わせる事で、サービスのデプロイまで進めることができます。
初期投資が圧倒的に低いので、状況によってはiPhoneでプログラミングも全然アリです。



#### 雑感
手順を調べながら作成するのにラップトップが無いと大変ですし、レスポンシブになっていない
AWSコンソールやAPI開発者登録、エラー対応をiPhoneだけで行うのは結構辛いです。
自動化できる部分は省略していかないと、ラップトップ無しでの仕事は少し先かなぁと感じてます。

いわゆる職業プログラマーや、普段インフラを触らない人に向けて書いて見ました。
真似する人は殆どいないと思います(笑)が、モバイルスタイルを模索している方に少しでも参考になれば幸いです。


### 参考リンク
https://dev.classmethod.jp/cloud/aws/whats-aws-codestar/
https://qiita.com/k-nishigaki/items/f9f49b4749395ab5091c
https://qiita.com/takecian/items/6e7085adf093ce114b74
 
### boto3 codestar 関連
http://docs.aws.amazon.com/codestar/latest/APIReference/API_DeleteProject.html
https://boto3.readthedocs.io/en/latest/reference/services/codestar.html#CodeStar.Client.delete_project