SwiftとHexavilleで作ったWEB APIをAWS Lambdaにデプロイした

この記事は[SwiftとHexavilleで駅探索APIを作ってみた](https://qiita.com/ochim/items/7857d04d923816f80ced)の続編です。

## 環境
- Mac OS 10.12.6
- Swift 4.0
- Xcode 9.2
- Hexaville 0.5.6

## モチベーション
- ローカルで動くAPIができたのでデプロイしたい
- [Hexaville](https://github.com/noppoMan/Hexaville)はAWS Lambdaへのデプロイをサポートしている

Hexaville は簡単に言えば、Swiftの為のモダンなWebアプリケーションフレームワーク及びエンジンです。Swiftで作られたwebアプリをAWS Lambda と ApiGatewayで実行する事をコンセプトにしているそうです。手軽にAWS Lambdaにデプロイできる仕組みを持っています。

## 準備
- AWSのアカウント
- access_key_id, secret_access_key
- Lambdaを実行するロール

ここからデプロイ手順になります。

## Hexavillefile.ymlの編集

プロジェクト作成で自動生成されているHexavillefile.ymlを編集。

```
name: NearStations
service: aws
aws:
  credential:
     access_key_id: xxxxxxxxxxxxxxxxxx
     secret_access_key: xxxxxxxxxxxxxxxxxx
  region: ap-northeast-1
  lambda:
     bucket: hexaville-nearstations-pglda-bucket
     role: xxxxxxxxxxxxxxxxxxxxxxxxxx
#     vpc:
#       subnetIds:
#         - xxxxxx
#         - xxxxxx
#       securityGroupIds:
#         - xxxxxx
#         - xxxxxx
build:
  nocache: false
swift:
  version: 4.0
  build:
     configuration: release # default is debug
```

xxxxxxxxxxxxxxxxxx　はAWSで準備した値を設定してください。

## デプロイコマンド実行

``` hexaville deploy NearStations```

hexaville deploy < projectName > になります。  
叩いたら、しばらく待ちます。
コンソールにかなりログが表示されていきますが、じっと待ちましょう。
初回は結構時間がかかると思います。
デプロイが成功すると、このように表示されます。
![スクリーンショット 2017-12-16 21.04.46.png](https://qiita-image-store.s3.amazonaws.com/0/103548/a9c0523b-e09e-f4a7-0621-ec08e54a1aaa.png)

## AWSコンソールで確認

<img width="1194" alt="スクリーンショット 2017-12-16 21.14.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/103548/bcc8aa46-ad1e-0cae-6598-d4f6b99dde80.png">

関数が作られていますね。

## 動作確認

ニジボックスの入っているビルで試してみましょう。緯度：35.660944, 経度：139.775199

![スクリーンショット 2017-12-16 20.57.09.png](https://qiita-image-store.s3.amazonaws.com/0/103548/12d77350-7c10-351f-1597-26cca184c635.png)


無事、付近の駅が取得できました！ 簡単ですね。
https対応の駅探索APIの完成です！

ただ同様に実行しても、たまに以下のようなサーバーエラーが返ることがありました。これは原因不明です。
![スクリーンショット 2017-12-16 23.25.55.png](https://qiita-image-store.s3.amazonaws.com/0/103548/4d454c7c-6b96-9d68-6828-cf79d216325a.png)

## トラブルシューティング

ここまでだと簡単ですが、私が最初試した時は、上記のデプロイコマンド実行後に、コンソールに身に覚えのないエラーが表示され、大分苦労しました。
```
Uploading code to s3.....
fatal error: typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [SwiftAWSS3.S3.ListBucketsOutput.(CodingKeys in _32757E5A7EBE8A89819CEB17805ED919).buckets], debugDescription: "Expected to decode Dictionary<String, Any> but found a string/data instead.", underlyingError: nil)): file /Users/yuki/WorkingsPlace/program/oss/Hexaville/Sources/Hexaville/main.swift, line 206
Illegal instruction: 4
```

どうしたかというと、[Hexavilleのissue](https://github.com/noppoMan/Hexaville/issues)に表示されたエラーを貼り付けて質問しました。
これはHexavilleのバグでデプロイ失敗していたようで、作者の方に1日もかからず直して頂きました。
Hexavillefileを更新するには[github](https://github.com/noppoMan/Hexaville#how-to-update-hexaville-cli-version)に沿ってコマンド実行するだけです。

他、詰まった例として、
```
Uploading code to s3.....
Fatal error: AWSResponseError(errorCode: "InvalidLocationConstraint", message: Optional("The specified location-constraint is not valid")): file /Users/yuki/WorkingsPlace/program/oss/Hexaville/Sources/Hexaville/main.swift, line 206
Illegal instruction: 4
```
これはymlのregion部分での書き方を誤りました。

## 所感

手順がすんなりいけば、AWSの経験が浅くても、手軽にAWS Lambdaにデプロイできてすごいです。
Hexavillefileはバグへの対処も早いですね。
不満はコマンド実行後の待ち時間ぐらいです。

今回のソースコードはgithubに上がっています。[こちら](https://github.com/ochim/StationsAPI/tree/master)
ありがとうございました！