NOT A HOTEL でエンジニアインターンしてきた
どうして私が NOT A HOTEL に?
Google Meet の画面に映し出される青い空とヤシの木。
「あれ、入る Meet 間違えた?!」
2022年10月中旬、少しの緊張と沢山のワクワク感を持って NOT A HOTEL のインターンの面接に参加した僕はかなり動揺していました。今まで何十回とエンジニア面接は受けてきましたが、相手の背景が南国のリゾート(リアル)だったことは一度もありません。
どうやら面接していただく CTO の大久保さんは開業を控えた NOT A HOTEL AOSHIMA の現地に来ているようです。バックエンドエンジニアの北斗さんと共に面接が始まりました。
面接の内容としては形式ばった堅い雰囲気のものではなく、カジュアルに色々な情報を提供していただきましたし、インターンを通して何をやりたいかや何ができそうか等ヒアリングしてくださったのでインターン参加前にかなり解像度を上げることができました。
最後には絶賛工事中の部屋の中までカメラ越しに見せてくださり、終始楽しい面接。
そして無事参加させていただけることが決まり、年明けの1月からインターンスタート!
遅れましたが自己紹介を
初めまして表 陸人と申します。
筑波大学理工学群工学システム学類の3年生です。大学入学時からプログラミングを始め今まで何社か長期インターンや開発アルバイトを経験しました。
自分の好きなことの一つに「旅行」があります。大学生になってからは月一回くらいのペースで旅行しています。新型コロナウイルスの流行もあり、なかなか国外旅行には行けませんでしたが、その分日本中の色々な場所へ行くことができました。
奮発して良いホテルを予約してちょっとリッチな気分になってみたり、一日12時間以上運転しながら下道だけで茨城県から山口県に行って何もせずに帰ってきたり、一人で八丈島にトレッキングをしにいったり。
旅先で出会う場所や人はどれもかけがえのない思い出になっていて自分の人生を豊かなものにしてくれます。しかし旅行は旅行です。時間のある大学生だからこそ定期的に旅行できているものの、社会人になってしまうとどうしても自由な時間は減ってしまいます。
その現実にモヤモヤしていた自分にとって NOT A HOTEL の Vision やプロダクトは強く刺さりました。致命傷です。しかもソフトウェアエンジニアのインターンを募集しているとか。これに参加しない手はありません。
近年流行りの IT / DX 業界では自動化やコストカットを目的としている事業が多いです。それ自体はとても素晴らしいと思う一方、それにより生まれたリソースでユーザーの人生をより「ワクワク」させる事業はそう多くないのではと思います。
インターンで取り組んだタスク
今回は自分が興味のある SRE 業務を中心としてタスクを任せていただきました。初めて触る技術ばかりで頭を悩ませることも多かったですが、沢山の方にサポートを受けながら進めることができました。
grpc-gateway への OpenTelemetry 導入や Cloudflare への DNS サーバー移管、Cloudflare Workers によるレスポンスヘッダー管理など通常のインターンではなかなか経験できない開発を行うことができました。
ここでは特に印象に残っている3つのタスクについて説明したいと思います。
Low Code ツール Airplane の導入
Airplane は Low Code ツールであり、既存のデータベースに対するクエリの実行や API の呼び出しを行う Task (Jobのような概念)を作成したりそれらを組み合わせたワークフローを構築できます。
Airplane は Task の実行に対する承認依頼機能が提供されています。この特徴を活かして、アプリケーション内のお知らせの配信ツールを実装するのが今回の目的です。
実装自体はかなりシンプルでした。今後ちょっとした業務ツールを作る際はこういったLow Codeツールは大いに役に立ちそう。
実行結果に関しては良い感じにレイアウトしてくれます。ソート機能や絞り込み機能なんかも標準であります。
Cloudflare Workers によるメンテナンスモード切り替え
Cloudflare Workers は Cloudflareが提供するエッジロケーションでのサーバーレス実行環境です。
下記の Examples にあるように本来オリジンサーバーで行うような処理をエッジロケーションで行うことができます。
NOT A HOTEL の iOS アプリケーションはバックエンドが gRPC サーバーとなっており、サーバー側の環境変数を変更することによってクライアント側にメンテナンスモードにするよう Protobuf Message を返しメンテナンスモードへの切り替えを行っています。
しかしこれだとgRPC サーバーがダウンしてしまった時、肝心のメンテナンスモードにすることができません。
Cloudflare Workers を使用して gRPC サーバーがダウンしてもメンテナンスモードへ切り替えができるようにすることが今回の目的です。
しかし困ったことに、現時点で Worker は gRPC のリクエスト / レスポンス行う方法がないためひと工夫必要です。
最終的には以下の Worker を gRPC サーバーのエンドポイントに中継することで実現できました。
export default {
async fetch(request, env) {
if (env.MAINTENANCE_MODE === "true") {
const newResponse = new Response();
newResponse.headers.set("Grpc-Status-Details-Bin", env.ENCODED_PROTO_MESSAGE);
return newResponse;
}
return await fetch(request);
}
};
gRPC サーバーへのリクエストが行われた際、Worker の環境変数であるMAINTENANCE_MODEを参照、true だった場合レスポンスヘッダーの Grpc-Status-Details-Bin に base64 エンコードしたメンテナンス用のメッセージである環境変数の ENCODED_PROTO_MESSAGE をセットします。(この環境変数にはあらかじめ手元でエンコードしたメンテナンス用のProtobuf Messageを設定しておきます)
HTTP2 を使用する gRPC では Grpc-Status-Details-Bin ヘッダーに base64 エンコードした Protobuf Message を含めることで通信を行なっているためこれによって gRPC サーバーがメンテナンスページ用の Protobuf Message を受け取ることができるわけです。
こちらのアイデアはスーパーエンジニアである @codehex さんに教えていただきました!感謝…
Cloudflare の Terraform 化
Cloudflare のリソースも増えてきた段階で Terraform 化を行いました。
backend 機能によって state ファイルを Cloud Storage で管理するために
Local で Terraform import を使い既存のリソースを state ファイルに反映。
gsutil によって state ファイルを Cloud Storage にアップロード
上記を行いました。
CI/CD に関しては Cloud Build を使用。plan や apply の結果は tfcmt(https://github.com/suzuki-shunsuke/tfcmt) によって GitHub の Pull Request に通知されるようにしました。
state ファイルには API Key などのシークレット情報も入っているので GOOGLE_ENCRYPTION_KEY を指定することで暗号化しました。
Terraform の管理基盤を作れることはそうそうないので良い経験です。
インターンを通して
約1ヶ月半のインターンはあっという間でした。 技術的な成長はもちろんですが、NOT A HOTEL のカルチャーにも触れることができ大満足です。
インターンを通して僕がお世話になったプロダクトチームの「より良いプロダクトにしようとする姿勢」はインターンを通して強く印象に残っています。
ソフトウェアに関する定例ではバックエンドエンジニアの方からも
「もっとこういう UI の方がわかりやすいと思う」
というような意見がしょっちゅう出ますし
「そもそもこういう仕様であるべきなんじゃない?」
なんてこともよく目にしました。
それぞれが自律しつつもこういった姿勢を持ちつづけること。自分も見習わなければと思います。
また、今回自分がタスクを通して触れた Cloudflare を含めそれ以外にも GPT-3、NFT、Smart Home などエンジニアの好奇心がくすぐられるような技術や開発にはかなり積極的です。
エンジニアとしてこんなにワクワクする環境は少ないのでは?
自分自身もさらに成長してまた戻ってきたいと強く思いました。
最後に
ここまで読んでいただきありがとうございます。
2023年2月現在 NOT A HOTEL ではソフトウェアエンジニア並びにプロダクトマネージャーのインターンを募集しています。興味のある学生はぜひ応募してみて下さい!
この記事が気に入ったらサポートをしてみませんか?