既存のWebサービスのシステムについて、アプリケーションの肥大化とか、この先のことをメンテナンスとか、後はまぁ単にやってみたかったというのもあって、機能の追加でAWSのAPI Gateway + LambdaでREST APIを作成することにした。APIを誰でもかれでも使えては困ってしまうので、APIの保護をしなくてはならないのだが、これが思ったよりもだいぶ手こずった。結局、プライベートAPIを利用することになったのだが…。
動機
既存のシステム(Webサービス)に機能を追加する必要があったのだが、そこで試験的に、AWSのサービスを使ったREST APIにより実装してみることにした。いろいろな経緯があった故に、アプリケーション側はけっこうゴチャゴチャしていて、アプリケーションから切り離せるところは切り離したかった。また、このFaaS的な取り組みは、組み込み的な分野との親和性も高いのではないかなぁなどと思うところもあり、使ってみたかったのだ。
認可でハマる
正直、まぁけっこうさっくりできるんでないかな、などと考えていたのだが、それが甘い見通しだったことをやり始めて思い知る。一歩歩く毎に落とし穴にハマるという感じで、これほどハマったのは久しぶりだった。Lambda、API Gateway、一緒に使ったCloudWatchにDynamoDB、綺麗に一歩一歩ハマった気がする。なるほど、違う業界に来たのだなぁと、自分の未熟さを痛感した。
さて、それぞれの落とし穴については本記事の主旨ではないので置いておくとして、ここで取り上げたいのは認可についてだ。最初、APIの試作はオープン、つまり誰でも叩けるパブリックな状態で作ったのだけれど、さすがに正式のWebサービスでそんなハイパー・ワールド・ワイド・ウェブ状態というわけにはいかない。何かしら、認可の仕組みが必要だ。
で、調べてみるとAWSにはAmazon Cognitoという認証・認可に使えるサービスがあるので(Cognito自体は認証基盤のシステムであるようだ)、それを利用したものが多いのだが、今回のWebサービスでは別に認証基盤があるので、ちょっと利用しがたい。連携させることは可能なのだろうけれど、なかなかわかりそうにない。
なので他の手段はないかと、色々調べることになったのだが、それにずいぶんと時間がかかってしまった。
プライベートAPIを使う
調べていると、Lambdaオーソライザーやらなにやら出てくるのだけれど、トークンを発行しなくてはいけないことには変わりない。これがサーバサイドの話ならどうとでもなりそうなものだが、JavaScriptでAPIを叩くシステムだから、ソースはクライアントなわけで、するとやはりトークンのやりとりが必要、ということになる。その結論に至るまで、かなり彷徨ってしまった。不勉強故に認証・認可の仕組みをよくよく理解していないがために、遠回りをしてしまった気がする。
結局、トークンを発行し、照合する仕組みを自分で組むことにした。スマートではないが、少なくとも道筋は見えているし、時間もなかった。トークンの発行には、特定のVPCを経由しないといけないプライベートAPIを用いることにした。
プライベートAPIはちょうど先月にリリースされた比較的新しい機能で(「Amazon API Gateway がプライベート API をサポートします」)、VPC内のプライベートサブネットにエンドポイントを置き、そこを経由するようにAPIのリソースポリシーを設定できる。このトークン発行のAPIだけは、ログイン時にサーバサイドから叩くような形だ。プライベートAPIの操作については、「API GatewayでプライベートAPIを作成する」の記事を参考にさせていただいた。
いったん決まってしまえば、そこからはまぁまぁ早くできた(それまでに一通りハマったからとも思う)。ついでにユーザの情報をもらえば、APIのユーザ名を改竄されても問題ない。
勉強しないといけない
正直、こんなに時間がかかると思っていなかった。今までと違う業界に来たのだなぁと痛感するばかり。しかし、このあたりの分野はそれなりにメジャーであるし、なんというか、技術をお金に換えやすい分野だと思うので、頑張りたい。学べば、自分の生活の基盤になりうるのではないか、と期待している。
それに、マイクロサービスとは今はまだとても言えないけれど、この小さな小さな関数を繋げていく感じは、なんだかとても親しみやすい。思想的に、どこかUnixっぽいからだろうか。自分が今までやってきた、電子工作的なところとも繋がるところがあるように思う。
自分のキャリアは特殊で、連続性がなく、その道一筋で歩んできた人に比べれば専門性ではどうやっても劣ってしまう(前職をせめてあと一年早く見切りをつけるべきだったと最近思う)。だから、なんとか点と点を繋げられないかと考える日々なのだが、まぁまずはWeb周りの技術を真面目にやりたい。
コメント