はじめまして、岩崎です!「APN AWS Top Engineers/APN Ambassadors Week」の4日目の記事を書かせて頂くことになりました。この度、元々モバイルアプリしか作ってこなかった私が、「2021 APN AWS Top Engineers」になることができました。ちょうど良い機会でもあるので、NRIネットコムに入社してから取り組んだことをざっくりと整理していきたいと思います。
はじめに
昨今、一口にフロントエンドエンジニアと言ってもアプリを開発するだけではなく、プロジェクト規模によってはCI/CDの仕組みを構築・管理したり、アプリに機能やコンテンツを提供するためのバックエンドを構築したり、はたまたプロジェクト管理もしてみたりと、エンジニア一人に要求される専門性がますます多様化しているように感じます。おそらく、多方面で起こっている「技術の民主化」の流れが進んでいくにつれて、エンジニア以外の職種においてもこの状況は広がっていくんじゃないだろうかと個人的には思っています。
元々はモバイルアプリ開発者だった私も、例に漏れず小さなきっかけからAWSに触れるようになっていき、この度「2021 APN AWS Top Engineers」になることができました。そんな私が、どのようにAWSの開発経験を積んできて、そこでどんな技術を得たのかを共有することで、これからAWSの世界に足を踏み入れようとするフロントエンドエンジニアの皆さんにとって、少しでも参考になる情報がお伝えできればと思います。
注意ですが、下記に書く内容はかなり抽象化・省略したものになっており、実際の経験を正確に表しているものではありませんので、予めご認識ください。
自己紹介
私は元々なにかを作るという行為そのものが好きで、学生時代から趣味でアプリを作っているような人間でした。NRIネットコムには2016年に入社し、その後1~2年くらいはモバイルアプリを開発していて、2年目の途中からAWSに触れるようになっていったという感じです。それまでは、サーバーサイドの実装はほとんどやったことが無い状態でした。
サーバレスバックエンド構築
一番最初にAWSで構築したものは、下図のような最も基本的なサーバレスバックエンドでした。
確か、そのとき担当していたモバイルアプリ開発案件で、モックAPIを作るために構築したものだと思います。AWSはおろかクラウドに関する知識も全く無かった状態でしたが、やりたいことははっきりしていたので、それを実現するためにAWSのドキュメントや技術ブログなどから断片的に情報を得て構築していた段階だったと思います。
このような構成が作れるようになったことで、アプリの外の世界にロジックとデータを分離し、アプリからそれらを参照させるということができるようになりました。しっかりと勉強した訳ではなかったですが、AWSでモノを作る楽しさに気づけたのできっかけとしては十分だったと思います。
また、最初に取り組んだ領域がサーバレスというのも敷居が低くて入りやすかったと感じます。サーバレスであれば、やりたいこと(ビジネスロジック)の実装に集中することができるので、必要な知識を最小限に留めることができます。そのため、余計な学習コストがかからず、すぐに形にすることができたので達成感も得やすかったです。
次に上記の構成を少し発展させて、既存のシステムからデータ連携を行ったり、AWS Lambdaから外部のサービスを利用したりする構成を作りました。
クライアントアプリから見たときの挙動は変わっていないのですが、この構成を構築するなかでシステム設計の考え方であるマイクロサービスやイベントドリブンという実行方式について、しっかりと理解することができました。
このときからAWSをメインとした業務に携わるようになっていき、本格的に学習を始めていきました。NRIネットコムの場合は、研修を受けたり書籍を購入したりする際に会社が費用を負担してくれるので、それを活用して以下のように学習を進めていました。
● AWS公式トレーニング
それまでは断片的に情報を得るということしかやっていなかったので、以下の公式トレーニングを受けて体系的に学び直すということをしました。これらのトレーニングはハンズオン形式で、手に覚えさせながら学ぶことができ、受講後にそのまま活用することが可能だったので入門者には特にオススメです。
● 書籍
同時に以下のような書籍(Amazonで★が多かった本)も購入し、体系的に学ぶということは進めていきました。書籍は一字一句全部読むのではなく、知りたいことを中心に要点だけかいつまんで読んでいきました。
- イラスト図解式 この一冊で全部わかるWeb技術の基本
- イラスト図解式 この一冊で全部わかるサーバーの基本
- イラスト図解式 この一冊で全部わかるネットワークの基本
- Amazon Web Services パターン別構築・運用ガイド
- Amazon Web Services 業務システム設計・移行ガイド
- AWS Lambda実践ガイド
- AWSによるサーバーレスアーキテクチャ
● 業務に応用する
特にAWSを扱う業務を行っていないときでも、業務を効率化するような仕組みをAWSで作ってみたりして遊んでいました。例えば、Slackのようなチャットツール向けのボットや、定期的にBacklogなどのプロジェクト管理ツールにタスクチケットを起票するようなものを作っていました。学習したことはどんな形でも良いのでアウトプットすることで、その技術を定着させることができると思います。
データパイプライン構築
その後しばらくして、特定のデータを取得・整形して、特定の場所に出力するというバッチ処理を開発する機会がありました。当初はこれもサーバレスで実装しようと考えていたのですが、その当時のAWS Lambdaのタイムアウト制約の関係で仮想サーバを使った以下のような構成を作りました。
初めてサーバレスという世界から抜け出して仮想サーバで動くシステムを構築しました。ターミナルにもまだ不慣れで、そもそもLinuxに関する知識も全く無く、どうやって仮想サーバに置いたプログラムを自動的に動かすことができるのか?といった状態でした。このときも、やりたいこと自体ははっきりしていたので、それを実現するための情報だけを断片的に参照して作っていたかと思います。
何度もトライ&エラーを繰り返して苦労しながら作り上げた記憶がありますが、その分ここから一気に知識と技術の幅が広がったと思います。サーバレスのときは、システムのネットワークやセキュリティ、冗長性や拡張性などあらゆる観点でAWSが自動的にやってくれている部分が多く、自分で意識して取り組むことが少ないですが、仮想サーバを使った構成では自分で考えて構築していく必要があります。学習コストはサーバレスで作っていたものよりも当然大きかったですが、次のステップとして上記のような簡単なシステムを仮想サーバで作ってみるというのはちょうど良かったと思います。
上記をきっかけに、本格的にデータ分析に関連するシステム設計・構築を行う業務に携わるようになっていき、以下のような構成を各案件のなかで作っていきました。その中には、TB級で数百テーブルもありシビアなパフォーマンスが求められるようなプロジェクトもありました。
AWS Glueを使ったETLパイプライン
前述したバッチ処理の構成とは違い大規模なデータをさばける必要があったことと、PoC案件だったのでその当時まだリリースされたばかりのAWS Glueの検証目的でこの構成を作りました。やはり、ここからは体系的に基礎を学習していく必要があると感じて、以下のような書籍を繰り返し読んでいたと思います。
また、このときくらいからAWSの各サービスの公式ドキュメントやクラウド活用資料集、ホワイトペーパーなんかを通勤時間中に毎日読んでいたような気がします。
AWS LambdaとAmazon ECSを組み合わせたETLパイプライン
その後もデータ分析関連のプロジェクトが続き、この構成を作ったときに初めてコンテナという世界を知りました。Dockerは書籍で学習するというよりも、実際にいろいろ環境を立ててみて触りながら覚えたという感覚です。
モバイルアプリ向けのMLOps基盤
データ分析の文脈で機械学習の世界にも足を踏み入れるようになっていきました。かなり専門性の高い分野ですが、NRIグループでは外部講師を招いて機械学習・深層学習の基礎を学べる計10日間の研修が開催されているので、それを受講して基本的な知識は身につけることができました。ただ、それでも全然足りなかったので、書籍や技術ブログを読み漁ったり、Kaggleなどで適当な課題を見つけて実際に実装してみるということをやっていました。
トレーニング講座開発
上記のような経験を踏まえて、NRIグループへのAWSのトレーニング講座を開発するに至りました。これによって、新たな技術を得たりする訳ではありませんが、自分自身のこれまでの経験や理解を整理する良い機会になりました。
- 野村総合研究所様 事例紹介インタビュー | 事例紹介 | NRIネットコム
- 野村総合研究所様 ブロックチェーン講座 事例紹介 | 事例紹介 | NRIネットコム
- 野村総合研究所様 データ分析基盤構築講座 事例紹介 | 事例紹介 | NRIネットコム
おわり
とりとめもなくこれまでの経験を書いてきましたが、振り返ってみると以下のサイクルで新しい知識・技術を身につけていったことが、ここまでこれた理由かと思います。
1. まずは簡単な構成でトライする。このとき、できるかぎり学習はしない。
2. もう一段ステップアップした内容に取り組む。このとき、初めてちゃんと学習する。
3. アウトプットを続けることで知識と技術を定着させる。
あくまで私なりの方法論にはなりますが、最初に学習してから新しい領域に入ろうとすると、面白くなる前にモチベーションが保てず中途半端に終わるというのも多いかと思います。そういう意味では、クラウドという領域においても、サーバレス → 仮想サーバ → コンテナという順で取り組めたことは、私としては続けてこれた理由だと思います。
また、アウトプットすることに関しては、単に何かを実装してみるというアウトプットの仕方だけでなく、勉強会などを積極的に開催・参加するなどして、自分の理解を整理するタイミングを意識的に作っていくということも大事だと思います。
ということで、これからAWSの世界に入ってみようというフロントエンドエンジニアの皆さんが、どの領域から取り組むか、どういった方法で学習していくか、また取り組んだ先に何ができるようになるのか、それらについて少しでも具体性を持って想像できるようになっていれば幸いです。
今回はこれで終わりになりますが、これからもAWS・モバイルアプリ関連の記事を書いていこうかと思いますので、よろしくお願いします!