概要
最近LaravelでAPI実装案件を一通り要件定義から一通り経験することが出来ましたので学びを振り返ろうと思います。(理解が間違っていたらご指摘ください。あと、自分用振り返り記事なので読みにくいかもですがご容赦ください。)
案件概要の詳細は省きますが、ある特殊な条件で仕様される単純なCRUD機能が使えるAPIの作成でした。
リリースまではざっくりと下記の流れ
要件定義→キックオフ→設計書作成(API等)→実装→インフラ構築→リリース
何もかも初めての事だったので手探りで進めていきました。
仕様の自由度が高く自分でどの機能を実装するか決められたのですが、お客様に自分が考えた機能と仕様を説明する時に緊張した記憶があります。笑
案件を通して学んだ事一覧
- RESTful API
- JWT(認証) ACL(認可)
- クリーンアーキテクチャ
- AWSインフラ構築
上記項目についてこれからざっくり振り返ります。
RESTful API
- API
- REST
- OpenAPI
API
ある機能を公開しているソフトウェアとその機能を使いたいソフトウェアをつなげる窓口という理解です。
つまりソフトウェアにAPIという外部とやりとりする窓口を作り、その窓口を通して外部アプリと連携するとで便利な機能が仕様できる。という仕組み。
APIは開発者が好き勝手決めていいというものではなくRESTというお作法がある。
このお作法にそって作られたものがRESTful APIです。
REST
アドレス可能性(Addressability)
提供する情報がURIを通して表現できること。全ての情報はURIで表現される一意なアドレスを持っていること。ステートレス性(Stateless)
HTTPをベースにしたステートレスなクライアント/サーバプロトコルであること。セッション等の状態管理はせず、やり取りされる情報はそれ自体で完結して解釈できること。接続性(Connectability)
情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができること。統一インターフェース(Uniform Interface)
情報の操作(取得、作成、更新、削除)は全てHTTPメソッド(GET、POST、PUT、DELETE)を利用すること。
上記記事より引用
OpenAPI
RESTful APIを記述するためのフォーマットのことでJSONやyamlで書かれる。
LaravelでのAPI実装
APIにJSONでリクエストを送り、JSONでレスポンスを返す仕様にした。
以下参考
JSONで返す情報を加工したい場合はResourceを使う
JWT(認証) ACL(認可)
認証にはJWTを使用し、ACL(アクセスコントロール)にはLaravelの機能を使用
Laravel x JWT認証
Laravel認可
クリーンアーキテクチャ
- アーキテクチャ設計のお話
アーキテクチャではクリーンアーキテクチャ(一部)を採用して実装しました。
コントローラー(シングルアクション)←アクション←モデル(リポジトリ)
忠実に再現すると複雑になりすぎそうでしたので理解できる範囲で組み込んでみました。
シングルアクションコントローラー採用する事でAPIに対して一対一に対応できるので見通しが良くなったと思います。
インフラ
- EC2
- Nginx
- RDS
- 証明書
特に冗長化が必要と言うわけでも、アクセスが多くなるわけでもないのでVPCにパブリックサブネットを作成てEC2インスタンスを一つ立てる、プライベートサブネットを作成してRDSを立てるという最小構成でした。
ただ使いたい時だけEC2やRDSを起動したいという要件がありましてその部分の調整が難しかったです。
使わない時はEC2インスタンスはAWSマネジメントコンソールで停止すれば良いのですが、RDSは一度停止しても7日後に自動起動してしまうので。Lambdaで定期的に停止させる関数作るか、Aurora Serverless使ってみるのが良さそう。
手順は@ntm718 さんの記事が分かりやすかったです。
証明書はLet’s Encryptを使用しました。
割と最近仕様が変わったみたいでコマンドが使えないものがあり詰まりまくりました。
課題として今回の要件では使用しない時はEC2インスタンスを停止するので証明書の自動更新が走らない事...
AWSの証明書発行サービスであるACMを使いロードバランサーとともにSSL設定出来たら楽そうだけどお金結構かかるんですよね。
以上がざっくりとした学びになります。最後まで見ていただきありがとうございました。