カップル向けのサービスをメンテフリーで有名なserverless構成で出した話


## **「Glance(グランス)」** ~カップルのためのYes/No枕アプリ~

2018/01/03より、**「Yes/No枕をアプリで」**というコンセプトの元に作られたアプリをリリースしましたー！

結構、謎仕様が多くて使い所も不明ですが、
9月ぐらいの「[八耐](http://www.daihachitai.com/index.php/about
)｜八時間耐久製作会」というイベントでアイデアから本日のリリースに至りました。

![itunes.apple.com_jp_app_glance-yes-no%E3%81%BE%E3%81%8F%E3%82%89_id1294641754_l=ja&ls=1&mt=8.png](https://qiita-image-store.s3.amazonaws.com/0/62822/d886a9af-aa65-59ca-5c38-d7f84d128afd.png)


https://itunes.apple.com/jp/app/glance-yes-no%E3%81%BE%E3%81%8F%E3%82%89/id1294641754?l=ja&ls=1&mt=8

## 機能
- アプリアイコンが動的に変わる、Yes/No枕アプリ

## 特徴
- iOS10.3からの機能で、アプリアイコンがYes/Noに動的に変わり、お互いにステータスが見れるというコンセプトです。
- サーバーサイドはserverless frameworkで
LambdaとDynamoDBを使っており、**メンテコストはほぼ0(ゼロ)**

## 構成
- アプリ Swift4.0
- サーバー　serverless framework
    - DynamoDB
    - Lambda
    - API Gateway 

## serverless frameworkとは
- 「AWS Lambda」と「AWS API Gateway」を利用したサーバレスなアプリケーションを構築するためのツールです。
- AWSコンソールからだとボタン操作の履歴が残らないですが、serverless frameworkだと全てコードベースで管理できます。

## サーバーレスのメリット
- 管理するサーバーが無いのでサーバーダウンの概念がありません。
- とにかく安い！
- 保守メンテが楽でセキュリテイパッチやサーバー管理などのメンテが不要
- 詳しくは[serverlessの魅力](https://qiita.com/okamu_/items/e246887cb6f2621ad40a)を御覧ください

## Lambda上でNode.js + Expressがおすすめ
- API Gatewayでpath管理できますが、serverless + expressのプラグインがあるのでそれに任せたほうが圧倒的に楽になります。

## serverless.ymlを晒しとく
- eventsはanyですべてnodeのExpressに投げます。

```serverless.yml
service: yesnoapp

custom:
  defaultStage: dev

provider:
  name: aws
  runtime: nodejs6.10
  profile: yesnoapp
  stage: ${opt:stage, self:custom.defaultStage}
  region: ap-northeast-1
  memorySize: 100
  timeout: 2
  iamRoleStatements:
      - Effect: Allow
        Action:
          - dynamodb:DescribeTable
          - dynamodb:Query
          - dynamodb:Scan
          - dynamodb:GetItem
          - dynamodb:PutItem
          - dynamodb:UpdateItem
          - dynamodb:DeleteItem
        Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/*"

package:
  exclude:
    - .serverless
    - .webpack
    - coverage
    - .babelrc
    - .eslintignore
    - .eslintrc
    - .gitignore
    - LICENSE
    - package.json
    - README.md
    - serverless.yml
    - webpack.config.js


functions:
  app:
    handler: handler.app
    events:
      - http: any {proxy+}

resources:
  Resources:
    YesNoAPPDynamoDbTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain
      Properties:
        AttributeDefinitions:
          -
            AttributeName: device_token
            AttributeType: S
        KeySchema:
          -
            AttributeName: device_token
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: "Users"

```

## とまあ、こんな感じでExpressが動く！
- メンテフリー！コストフリー！みんなハッピー！

## 良かったこと/悪かったこと
### **ハッカソンのような短期開発には向いている**
- 開発のスタートダッシュが早く、ハッカソンのような短期即本番には向いているといえます。

### **運用後も安心な価格とコスト**
- ハッカソンで作った作品なので、アクセスはほぼ見込まれません。t2インスタンスなどは、固定でどんどんお金がかかりますが、料金はアクセスが増えた分だけだし、無料枠も十分あるので運用後もずっと残して置けるでしょう。

### **バズってもなお安心**
- バズることはほぼないですが、もし万が一バズったとしても、サーバーレス設計なら理論上無限スケールで対応することができます。

### **中盤がきつい**
- スタートダッシュは早いものの、だんだんこだわって作り出すと、Railsだったらこうできるのに...や、DynamoDBだからテーブルわけなくちゃ...NoSQLの苦悩など、中盤のブラッシュアップ期間は忍耐が必要そうです。

## まとめ
- サーバーレス設計は、開発速度が早く安い。とくにハッカソンイベントでは効果を発揮するのでおすすめです！という話でした！

## 参考
- [serverless frameworkを使って本格的なAPIサーバーを構築（魅力編）](https://qiita.com/okamu_/items/e246887cb6f2621ad40a)
- [serverless frameworkを使って本格的なAPIサーバーを構築（ハンズオン編）](https://qiita.com/okamu_/items/0f1055e5c91ed99ebec6)
- [serverless frameworkを使って本格的なAPIサーバーを構築（Express編）](https://qiita.com/okamu_/items/c19e2a682afe41a47eb1)
- [serverless frameworkを使って本格的なAPIサーバーを構築（テストコード編）](https://qiita.com/okamu_/items/2967726eef27420e6c63)

## 今回参加した八耐の紹介
### **『八耐』**とは
- 『八耐：**八時間耐久作品制作会(仮)**』は、８時間でゲームやCG、映像を制作し、参加者全員で発表するイベントです。
- イベントの最後に発表と試遊会を通じて、新しい繋がりや見知らぬクリエーター同士の交流を深めるイベントにもなっています。
- 東京と福岡会場があります。私は毎月、東京会場で参加しておりますのでぜひ！
- http://www.daihachitai.com/index.php/about