2024.12.10
“放置系”なのにサイバー攻撃を監視・検知、「統合ログ管理ツール」とは 最先端のログ管理体制を実現する方法
リンクをコピー
記事をブックマーク
佐藤丈生氏:では、いよいよ第2章の「AWS AppConfig」でFeature Flagsの仕組みを整備したお話に入っていきたいと思います。
(スライドを示して)まずは「AWS AppConfigとは?」というところで、全体的なイメージとして、非常に簡易的な図を見てもらっています。
ものすごく直感的にイメージをしてもらうためにお話しすると、AWS AppConfigとは、設定ファイルの中身のようなデータを保存しておいて、それをアプリケーションから参照できるようにするようなサービスとイメージしてもらえればいいかなと思います。
ここで1点注意事項があるんですが、先ほどお話しした設定ファイルの中身のような設定データ、設定値をAWS AppConfigに保存しただけでは、アプリケーションから参照できるようにならないんですね。
(スライドを示して)じゃあアプリケーションから参照できるようにするためにはなにをすればいいのかというと、スライドの赤い線のデプロイというオペレーションが必要になります。
ここでいうデプロイですが、ちょっとややこしいんですが、先ほど紹介したデプロイとロールアウトの分離と言った時のデプロイとはまた別の概念で、AWS AppConfigにおけるデプロイ、ないしデプロイメントという概念になるので、ご了承ください。
ちなみにFeature Flagsにおいて、Feature Flagsの仕組みを実現する上でAWS AppConfigにどんなデータを格納するのかという話ですが、先ほども見てもらったように、機能のオン・オフを切り替えるためのユーザーの属性値のようなデータを格納していくイメージになります。
続いて、先ほど少し頭出しをしたAWS AppConfigにおけるデプロイがなんなのかについて、もう少し詳しく見ていきたいと思います。
先ほどもお話ししましたが、AWS AppConfigに保存した設定値をアプリケーションのほうから参照できるようにするためにやる必要のある、オペレーションです。
非常にざっくりとしたイメージで言うなら、ローリングアップデートみたいなことができるようにするためのものとイメージしてもらうことができます。
どういうことなのかと言うと、例えばコンテナが10個ぐらいあるとします。AWS AppConfig上の設定データが更新された時に、そのコンテナ10台に即時にその変更を反映することもできるわけなんですね。ただ、そうではなくて、例えば100分くらい時間をかけて、徐々に徐々に10台のコンテナに変更を反映させていくなんてことも設定次第ではできるわけです。
これをFeature Flagsの文脈で言うならば、時間をかけて、徐々に徐々にロールアウトしていっているというようなイメージを持つことができると思います。
さらに特徴的なのが、このデプロイメント、Deployment timeという尺を設けているんですが、徐々に徐々にロールアウトしている最中、設定の変更を反映している最中であれば、ロールバックできるんです。なので、システムのメトリックとかをロールアウト中に監視して、なにか怪しい挙動を示したら、それに応じてロールバックするなんてこともできるわけです。
ちなみに、徐々に徐々にロールアウトしていくとか、一気に設定の変更を反映するとか、こういったデプロイの仕方に関する設定のことをDeployment strategyといいます。
以上までの話を踏まえて、AWS AppConfigを使うとなにがうれしいのかに関して整理していこうと思います。4つ列挙しているんですが、ここから2つお話ししたいと思います。
1つが、AWS AppConfigで設定を保存したり更新したりする時に、バリデーションをかけられるというのが1つの大きな特徴かなと思います。設定値のフォーマットとかが間違っている時に、それを事前にバリデーションで検知できるみたいなことができるようになっています。
もう1つが先ほども紹介したDeployment strategyの話で、ローリングアップデートのようなことができたり、ロールアウト中になにかあった時にロールバックしたりができるのも、AWS AppConfigの大きな特徴かなと感じています。
我々が実装するアプリケーションの側からAWS AppConfigのデータを参照したい時に、どんな実装になるのかも補足的に説明しておきたいなと思います。
なにかアプリケーション上の処理から設定値を参照したい時に、参照したくなる度、AWS AppConfigのAPIコールを直接するモデルではないんです。
どういうものなのかというと、典型的にはバックグラウンドスレッドとかを立てて、そのバックグラウンドスレッド上でAWS AppConfigに対してポーリングをかけます。AWS AppConfigに対するアクセスの結果、設定の変更を検知したら、ローカルキャッシュを更新して、アプリケーションの設定を参照したい側、この図でいうと黒いやつなんですけど……。あっ、すみません。黒いやつが2つありますね。ちょっと大きい黒いほうです。
この大きい黒いやつがアプリケーションの処理のイメージなんですが、この設定を参照したい時にはローカルキャッシュを参照するといったモデルが、典型的なアプリケーション側の実装方法としてイメージされています。
では、弊社カミナシにおけるAWS AppConfigの利用例というかたちで紹介していきたいと思います。
こちらで紹介している内容は、弊社のテックブログにも詳しく紹介しているものなので、興味のある方はこちらも見ていただければと思います。このセッションではかなり要点をかいつまんで説明するかたちになります。
まず弊社のアプリケーションのアーキテクチャですが、まずフロントエンドとして、ブラウザ向けのReactのSPAと、タブレット向けのネイティブアプリ。大きく2つのフロントエンドがあります。
この2つのフロントエンドがAPIサーバーにアクセスしているような構造です。ちなみにAPIサーバーはAWS Fargate上で稼働しているコンテナになります。
AWS AppConfigを利用する前にどんな状態だったのかについて話します。どういう状態であったのかというと、Feature Flagsの仕組み自体を持っていなかったというか、作っていなかったということではないんですが。(スライドを示して)この図に「Hard Coding!」と書いているんですが、ソースコード上にToggle Configurationをハードコーディングしているような状態でした。
Toggle Configurationというのはスライドの赤枠のデータで、Feature Flagsでいうならば、要はAWS AppConfigに本来は保存するようなデータのことですね。
それをソースコード上にハードコーディングするような、簡易的な実装を行っていました。ハードコーディングされているので、当然ながらロールアウトしようと思うとデプロイが必要です。
さらに、ソースコード上にハードコーディングされている関係で、リポジトリごとに定義しなきゃいけないかたちになってしまうので、なにが制御されているのか把握するのに認知コストがかかったり、ロールアウト時に修正漏れのリスクがあったり、そういった課題を抱えていました。
そういったものを、AWS AppConfigを利用するかたちで仕組みを整備し直したというかたちになります。
(スライドを示して)整備した後の構成を紹介すると、ざっくりこういった感じの図になります。ポイントを2つほどピックアップして話したいなと思います。
まず1つ目がConfiguration ProfileというリソースのtypeにFeature Flagというタイプを選んだという話です。「これは何ぞや?」という話なんですが、要するにAWS AppConfig上に格納する設定値のフォーマットのことだと考えてください。
typeにFeature Flagを選ぶと、一定のフォーマットがある程度定まっていて、それを使うことがある種強制されるんですね。
なので、もうちょっと違う見方をすると、例えばTerraformとかで設定を更新したいとなって更新した時に、自動的に一定のJSONスキーマによるバリデーションがかかってくれるというものなんですね。これが1つ目のポイントになります。
2つ目のポイントがAWS AppConfig agentです。
こちらが図の真ん中らへんに書かれているもので、AWS AppConfigへのアクセスを一手に引き受けてくれるものになります。
これがなにかというと、AWSが提供しているサイドカーコンテナイメージです。先ほど紹介したAWS AppConfigへのポーリングとかローカルキャッシュの管理という、煩雑になってしまいがちな部分を担ってくれるサイドカーコンテナイメージというかたちになります。こちらも1つポイントかなと思っています。
以上がアプリケーション側のアーキテクチャというか設計の話になるんですが、インフラのコード化という観点でも1つ話したいと思います。
インフラのコード化の部分に関しては、Toggle ConfigurationをTerraformで定義してGitHubリポジトリで管理しているという話です。
Toggle Configurationは何度か出ているんですが、Feature Flagsの文脈ではAWS AppConfigに格納する設定値とかのことですね。ロールアウトする時に編集するようなデータのことです。これをTerraformで定義して、GitHubリポジトリで管理しています。
なぜそうしているのかというと、こういった設定値を変える時であっても、ちゃんと変更履歴を残して、レビューのプロセスを通したかったからというのが理由となります。
なので、当然ながらロールアウトしていきたい、ロールアウトする、例えば対象を増やす時にはプルリクエストを出す必要があるし、ロールアウトしたものをいったん切り戻す場合でも、プルリクエストを出していく必要があったりします。
あと1点補足ですが、先ほどDeployment strategyで「ローリングアップデートみたいなことができますよ」みたいな話をしたと思うんですが、現状弊社ではローリングアップデート的なことはしておらず、設定を変更すると、一度に全コンテナに反映されるような、そういった作りにしています。
(スライドを示して)こちら弊社の現在の利用方法で、AWS AppConfigの特徴のどこが活かせているかに関してチェックをつけてみたものになります。
例えばこれが設定値を保存する時のバリデーションとか、一元管理とか、言ってしまえばベーシックな部分に関してはけっこうAWS AppConfigの良さを活用できているのではないかなと思います。
先ほども触れていたとおり、Deployment strategyによってローリングアップデートをしていくみたいな、もしロールアウト中にトラブルが起きたらロールバックをするとか、そういったことに関しては、まだ取り組めていないというようなイメージになります。
では2章のまとめを行いたいと思います。まずはAWS AppConfigの特徴ということで、主に設定を更新する時にAWS AppConfig側でバリデーションをかけてくれるということがあって、それでエラーを低減できるというような趣旨の話とか、Deployment strategyによって、なにか設定を更新した時にローリングアップデートみたいなことができたりといったことを話しました。
次に、弊社カミナシでAWS AppConfigを利用した仕組みを整備して、ある程度AWS AppConfigのうまみは活かせたのかな、みたいなお話をしました。
では、最後。今回Feature Flagsの仕組みを運用してみての学びというか、所感のようなことをお話しできればと思います。
まずは良かったことで、運用という単語を出しておきながらぜんぜん運用じゃない話になっちゃうんですが、こちらも触れておきたくて。まず所感として、すごく導入しやすかったなと感じています。
どういうことかというと、先ほど紹介したAWS AppConfig agentのような、実装がすごく煩雑になってしまいがちな部分を引き受けてくれるような、良い感じのエコシステムがそろっていたので、けっこう手頃な作業ボリュームで実現できたのかなという感想を持っています。
続いて、導入した効果について話していきたいと思います。こちらの効果ですが、留意してほしいのが、Feature Flagsを使った効果じゃなくて、ハードコーディングなどのような簡易的なFeature Flagsの仕組みをAWS AppConfigを使った、ある程度しっかりと設計した仕組みにしたことによって感じた効果といった意味合いになります。
こちらのお話しをしていくと、Toggle Configurationが一元管理されているというところで。何度か出てきているんですが、Toggle Configurationは、Feature Flagsでいうと、AWS AppConfigに格納しておく設定値とかのことですね。
これが一元管理されているので、なにが制御されているのかを把握する上での認知コストが下がったり、ロールアウト時に一元管理されているので、仕組み上、修正漏れみたいなことは非常に起きづらくなっております。
さらに、ロールアウトがデプロイに依存しなくなったので、ロールアウトのスケジュールがすごく柔軟に設定できるようになったなという効果も感じています。
今後の課題に触れていきます。すみません、ちょっと時間が押してきちゃったので、3つある今後の課題のうち、1個だけピックアップしてお話ししますね。興味ある方は後からスライドを見てもらえるとうれしいです。
「Feature Flagsの濫用を防ぎ、技術負債を作らない仕組み」と題しているんですが、別に今弊社でFeature Flagsが濫用されまくって困っているという話ではなくて、「サービスが成長したり組織が大きくなってくると、こういうところもちょっとケアしていかなきゃいけないかな」というニュアンスで書いています。
Feature Flagsを必要以上に定義していろいろな機能を制御しちゃったり、定義したままずっと放置しちゃったりをしすぎると、それが技術負債となって生産性をかえって下げちゃうというようなことに陥りかねないので、一定の規制とか制限は必要かなと考えているところです。
では、第3章のまとめに入ってまいります。効果とかのお話しをしましたが、やはり総括として、AWS AppConfigでこういった仕組みを作ることによって、ロールアウトが非常に低リスクに行えるようになった実感があって。
かつ、そのあたりに関する開発者としてのストレスも低減されたイメージをすごく持っています。もちろん課題はあるにはあるんですが、現状けっこうハッピーになったなという感覚を持っています。
以上です。ご清聴ありがとうございました。
関連タグ:
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
2024.12.09
10点満点中7点の部下に言うべきこと 部下を育成できない上司の特徴トップ5
2024.12.09
国内の有名ホテルでは、マグロ丼がなんと1杯「24,000円」 「良いものをより安く」を追いすぎた日本にとって値上げが重要な理由
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.10
職場であえて「不機嫌」を出したほうがいいタイプ NOと言えない人のための人間関係をラクにするヒント
2024.12.12
今までとこれからで、エンジニアに求められる「スキル」の違い AI時代のエンジニアの未来と生存戦略のカギとは
PR | 2024.11.26
なぜ電話営業はなくならない?その要因は「属人化」 通話内容をデータ化するZoomのクラウドサービス活用術
PR | 2024.11.22
「闇雲なAI導入」から脱却せよ Zoom・パーソル・THE GUILD幹部が語る、従業員と顧客体験を高めるAI戦略の要諦
2024.12.11
大企業への転職前に感じた、「なんか違うかも」の違和感の正体 「親が喜ぶ」「モテそう」ではない、自分の判断基準を持つカギ