Serverless Tech Challengeに参加した

完全に個人の参加報告＆感想となります。

#Serverless Tech Challengeとは
サーバレス界隈としては国内最大級のイベントとなる Serverlessconf Tokyo 2017 の1日目に行われたワークショップの内のひとつです。
このワークショップでは参加者同士で1～3名のチームを割り振られ、そのメンバーで協力して出された課題に取り組むワークショップとなっています。

http://tokyo.serverlessconf.io/workshops.html

# 課題内容
## ルール
- 制限時間は17:00まで（開始は10:30ぐらい) 
- 原則としてAWSサービスのみで構築すること
- 出された4テーマから1つ選んで構築すること
- 下記の要素を必ず含むと
    - 認証機能（サインアップ/サインイン）
    - GUI（デザインは問いません）
    - 画像ファイルの取扱が可能（添付、共有など）

## 成果物として求められるもの
- アーキテクチャ図
- デモ
- プレゼンテーション資料（工夫した点など）

## 表彰
- AWS のソリューションアーキテクト（7名が当日来ていました）が独断でイケていると思ったチームを1チーム選出
- 選出の観点は以下
    - アーキテクチャ
    - ライフサイクル管理（ロギング、モニタリング、CI/CD)
    - コスト
    - 耐障害性
- 賞品は10万円分のAmazonギフトカード（チームに進呈）

## 選択するテーマ
下記から1つ選択して実装する
- 電子掲示板 (いわゆる電子掲示板、StackOverflowなどのスレッドがあるものをイメージ）
- SNS（Twitter、Facebook等のSNS）
- マッチングアプリ
- Chat（Slack等のチャットアプリ）

# 私のチーム
## チームメンバー＆選択テーマ
私は全13チームの中で#12のチームとして、2名1チームの1人として取り組みました。
\#12のもうひと方は、インフラエンジニアの方で、普段はオンプレミスからAWSへの
移行作業を順次行っているメンバーとのことでした。
役割分担として相方にフロントエンドの構築（HTML/JavaScript/CSSは書けるとのこと）、私がバックエンドの
構築（API設計/DB設計/サーバサイドコード（Lambda）/CI&CDパイプライン/サーバサイドリソースのデプロイ）といった
役割分担をして進めました。

選択したテーマは「Chat」です。
短時間で構築するためには一番想像がしやすく、比較的現実的な感じがしたという理由です。
とはいえ、賞味7時間（昼休憩もその中で）でこれを作り上げるのはかなり過酷です。

## 構築の進め方
下記のような流れで進めていきました。
ポイントとしては、時間がかなり限られた中で取り組むため、
出来る限りインクリメンタルにアジャイル開発的に進めていこうというものです。

1. 私のアカウントにIAMユーザを追加
2. Cognito User Pool＆Cognito Identity Pool（仮）をAWSコンソールから作成
3. Webページ配置用S3バケット（仮）をAWSコンソールから作成
4. フロントエンドからユーザ登録・認証フローを構築する
5. CI/CDパイプラインを構築
6. Cognito User Pool & Cognito Identity PoolをCloudFormationテンプレートで記述しCI/CDパイプラインに乗せてデプロイ
7. 6で作成したCognitoに向け直す
8. SwaggerにてAPI設計を行い、APIのデプロイを行う（もちろんCI/CDにて）
9. モックを応答するLambdaをデプロイ
10. メッセージ表示、投稿用のDynamoDBのデプロイとDynamoDBとのインテグレーションをするLambdaに修正
11. APIを使ってチャット画面を表示、投稿する機能を構築
12. 画像保存用S3バケットのデプロイ
13. APIを画像投稿に対応するよう修正しLambdaも修正
14. 画像投稿をできるようにUIを修正

ここまででタイムアップ
ちなみに、まだ時間があれば進めようとしていた流れは下記の通り、

15. メッセージ画面に画像表示
16. ルーム一覧を取得するためのAPIを追加
17. ルーム作成APIを追加
18. ルーム一覧を表示する
19. ルーム作成画面を追加
20. ルームに参加可能なユーザの制限等を行う

などです。

# プレゼンテーション
プレゼンテーションは各チーム3分間で行います。
プレゼンテーション中は公正を期すために全員クローズドデスクトップとして発表を聞くこと
私のチームは所々の関係上最後の発表となりました。

発表時に使用した資料は下記
http://k1nakayama-docs.s3.amazonaws.com/ChatApp12.pdf

画像の投稿機能を実装中にタイムアップとなってしまったため、投稿機能自体がうまく動かないままとなってしまいました。

# 結果発表
各チームのプレゼンテーションが終了し、20分間の休憩の間にAWSのSAによる審査が行われました。
その後、結果発表です。

なんと画面には ***#12*** と表示され私達のチームの優勝が決まりました！
これはめちゃくちゃ嬉しかったです。

優勝賞品としてチームに10万円分のAmazonギフト券が渡され、2人のチームだったので、
仲良く5万円分ずつ分けました。
![IMG_0618.jpg](https://qiita-image-store.s3.amazonaws.com/0/138161/339dbf00-301f-1512-8796-405ff422e844.jpeg)

評価としては、

- アーキテクチャとしては至ってオーソドックスではある
- 課題として出された条件を全て網羅している
- 完成度が平均的によい
- 全チームの中で唯一DynamoDBオートスケーリングなどを取り入れており、キャパシティマネジメントなどの点も考慮されている
- SAによる評価の全会一致で選出された

ということでした。

# 感想＆印象に残ったもの
今回のワークショップは、AWSではたまに見かけるGame Dayと似たような取り組みでしたが、
Game Dayも参加したことなかったため、とっても新鮮でした。
そして、普段からサーバレスに触れているものの、色々な発見がありとても参加した甲斐があったと思います。
（賞味7時間で死に物狂いで取り組めば、一応これぐらいはできるのかという気づきにもなりました(^_^;)）

まず、すごく気付かされたものは、チームワークというか、構成メンバーって本当に大事で、
今回の場合、私のチームは2人だったものの、ほぼほぼ経験の多い分野が分かれていたのもあり、
それぞれが取り組むべきところを自分で考えて取り組むことも出来たので、時間短縮に繋がったと思います。
また、この手の開発はやはりとにかく小さな目標を積み重ね、インクリメンタルに成果を積み上げていくことが良いということも再確認出来ました。

他のチームのアーキテクチャとして印象に残ったものは、
同じチャットアプリに取り組んでいたチームが、
メッセージ投稿のアーキテクチャについてAPI Gatewayを使わず、
JavaScript（フロントエンド）→ SNS → Lambda → S3
というものをベースに作っていました。
ある意味一昔前のアーキテクチャだと思いますが、ユニークな発想でこういう発想も普段から持っておくと
柔軟に取り組めるかもなぁと思いました。

その他、マッチングアプリのチームは、ほぼ必須でAmazon Rekognitionを使用して画像の中の写真に対する
プロパティによるマッチングを考えていました。
世の中本当にAIの時代だなぁと考えさせられました。
このあたりのAI系サービスはあまり知見が少ないので、今後はこのようなサービスも積極的に使っていきたいなぁと思います。