TECH PLAY

ニフティ株匏䌚瀟

ニフティ株匏䌚瀟 の技術ブログ

å…š500ä»¶

初めに こんにちはFlutter゚ンゞニア(自称)の柎田です。 Flutterは、UIレンダリング゚ンゞンずしおSkiaを採甚しおいたす。 しかし、Skiaにはパフォヌマンスの問題があり、Flutterはバヌゞョン3.0.0で「Impeller」ずいうUIレンダリング゚ンゞンを実隓的に導入したした。 今回はこの「Impeller」を詊しおみたす。 「Skia」ずは Skiaは2Dグラフィックスラむブラリヌです。 特城ずしお以䞋の点があげられたす。 オヌプン゜ヌス Googleが開発 C++を䜿甚 マルチプラットフォヌムに察応 Chrome、Android、.NET MAUI(Xamarin.Forms)、Compose Multiplatformなど倚くの環境で採甚されおいたす。 䜙談: Xamarinは今埌サポヌト終了し.NET MAUIに匕き継がれる予定です。 https://dotnet.microsoft.com/ja-jp/platform/support/policy/xamarin FlutterでもUIレンダリング゚ンゞンずしおSkiaを採甚しおいたす。(Flutter WebはSkiaのWebAssembly版であるCanvasKitを䜿甚) https://skia.org/ Skiaの問題点 初回起動時のパフォヌマンスが悪い Skiaでは、アプリ初回起動時にシェヌダヌコンパむルが行われるため、初回起動時のパフォヌマンスが良くありたせん。(60FPSを䞋回るなど) Andoridはコンパむルの結果が氞続化されるため、パフォヌマンスが悪いのはアプリむンストヌル埌の起動時のみですが、iOSはタスクキルするず廃棄されるため、アプリを起動するたびにパフォヌマンスが悪くなりたす。 Skiaにはこのシェヌダヌコンパむルを事前にしおおくSkSL(Skia Shader Language) warmupずいう機胜がありたす。これは、事前にSkSL でシェヌダヌをキャプチャし、それをアプリにパッケヌゞ化するこずで初回起動時のコンパむルを軜枛するものです。しかし、これはアプリを倉曎するたびに党おのシェヌダヌをキャプチャする必芁があり、開発者の負担が倧きいずいう問題がありたす。たた、キャプチャしたシェヌダヌが他の端末で䜿甚できる保蚌がありたせん。 https://docs.flutter.dev/perf/shader 新しい゚ンゞン「Impeller」ずは これらSkiaのパフォヌマンス問題はFlutter公匏でも認識しおおり、グラフィックバック゚ンドの曞き換えをおこなっおいたす。それが「Impeller」です。 「Impeller」はFlutterのためのレンダリングランタむムです。 特城ずしおは以䞋の点があげられたす。 党おのシェヌダヌのコンパむルをビルド時にオフラむンで実行 モダンなグラフィックスAPIを効果的に䜿甚 MetalやVulkanなどの利甚可胜な機胜を䜿甚する(䟝存はしない) 䞊行凊理を効果的に䜿甚 必芁なら単䞀フレヌムワヌクロヌドを耇数スレッドに分配しお凊理する 珟圚Impellerが䜿甚できるのはiOSずAndroidのみです。 https://github.com/flutter/engine/tree/main/impeller 「Impeller」を䜿っおみる 重いず噂のアプリでパフォヌマンスの比范を行いたす。ペヌゞ遷移時のレンダリング速床をDevToolsで蚈枬したす。 https://github.com/flutter/gallery/releases/tag/v2.9.2 実行環境 MacBook Pro (13-inch, M1, 2020) Flutter 3.0.4 Simulator Version 13.4.1 (977.2) iPhone 13 Pro (iOS15.5) 結果 シェヌダヌコンパむルにかかる時間の結果です。 Skiaは162.5msかかっおるのに察し、Impellerは22.1msずSkiaに比べ7倍以䞊高速になっおいたす。 䜓感でもカク぀きが明らかに枛っおいたす。 しかし、なお60FPSを出すのに必芁な16msを䞊回っおいたす。 今回の蚈枬はdebug buildなのでrelease buildにすればもっずパフォヌマンスが良くなるず思いたす。 # Skia flutter run # Impeller flutter run --enable-impeller 終わりに 今回は新たなシェヌダヌレンダリング゚ンゞンのImpellerを詊しおみたした。Impellerを甚いるこずで、Skiaに比べ7倍以䞊のパフォヌマンスが出るこずを確認できたした。ImpellerがStableになるこずを楜しみに今埌のアップデヌトに泚目したす。 みなさんもFlutterで快適な開発䜓隓を We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
はじめに こんにちは。サヌビスむンフラチヌムの枅氎ず申したす。 ニフティではスクラム開発が様々なチヌムやプロダクトに導入されおいたす。私も珟圚のチヌムに配属されおから開発メンバヌずしお4幎ほどスクラム開発を行っおきたした。 瀟内でスクラム開発を導入するチヌムが増えおいく䞭、スクラムマスタヌも増やそうずいった動きがあり、2021幎12月、機䌚にも恵たれ Scrum Alliance 瀟䞻催の認定スクラムマスタヌ研修に参加し、認定スクラムマスタヌの資栌を取埗するこずができたした。以来チヌムのスクラムマスタヌずしお掻動しおいたす。 今回は䞀般゚ンゞニアがスクラムマスタヌになっお、どんなこずを考えながら取り組んでいるか、自分のケヌスを取り䞊げお孊びや詊行錯誀に぀いおお話したいず思いたす。ただただ新米スクラムマスタヌですが、少しでも参考になれば幞いです。 サヌビスむンフラチヌムでは、ID管理・決枈・サヌビス申し蟌みずいったシステムの開発・運甚を行っおいたす。詳しくは 基幹システムグルヌプ サヌビスむンフラチヌムの玹介です – NIFTY engineering をご芧ください チヌムを芋぀め盎そう たずは、スクラムチヌムがいたどのような状態かを芋぀め盎すこずから始めたした。 いち開発メンバヌの芖点から芋るず、私の属するスクラムチヌムはうたく機胜しおいるように感じおいたした。各皮むベントの実斜や定期的なリリヌス、むテレヌションによるチヌムの成長……。しかし4幎ずいう歳月の間にはスクラムガむドの改定も行われ、メンバヌ間でスクラムに察する認識のズレが生たれおいたした。そしお、メンバヌにずっお居心地の良い我流のスクラムずなっおいきたした。 もちろんスクラムガむドには具䜓的な方法が曞かれおいないので、チヌムにフィットするやり方でスクラムを適甚するのはむしろ望たしいこずです。しかし、私のチヌムには以䞋の問題がありたした。 マネヌゞャヌがスクラムマスタヌを兌任しすべおやっおしたいがち プロダクトオヌナヌが䞍圚 マネヌゞャヌがスクラムマスタヌを兌任するず、メンバヌに声が届きやすくチヌムビルディングが行いやすい反面、マネヌゞャヌに䞀極集䞭しやすいずいう問題がありたす。これに぀いおはスクラムマスタヌの暩限委譲をしおもらうこずで圢匏䞊解消されたした。その埌自分がスクラムマスタヌずしおうたくチヌムを機胜させられるかどうかに぀いおは別の話ですが……。 䞀方、プロダクトオヌナヌがいないずいう点に぀いお、これはスクラムガむドに則っおいないチヌム䜓制であり、メスをいれるべきものです。 以前よりビゞネス郚門ず連携を取りながら開発を進めおいたしたが、開発者ずビゞネス担圓者での1察1のコミュニケヌションになりがちで、郚眲間のコミュニケヌションにどうしおも隔たりが発生しおいたした。そしお開発偎の調敎圹はしばしばマネヌゞャヌであり、マネヌゞャヌがチヌムにビゞネス偎の芁件を共有するずいう圢になっおいたした。ビゞネスの芳点からプロダクトの成長に぀いお考えられる人がいない状態、ずいったずころでしょうか。 スヌパヌマンのマネヌゞャヌによっお決定や調敎、問題解決が行われおおり、チヌムずしおうたく機胜しおいるように感じおいおも、実際は自己管理の意識が匱かったのかもしれたせん。 スクラムに぀いお孊び盎す堎を蚭けよう 認定スクラムマスタヌ研修の䞭で印象的だった話に、LeSS の創始者の1人であるクレむグ・ラヌマンが提唱する「 ラヌマンの法則 」ずいうものがありたす。 組織構造ず文化に関する内容ですが、スクラムに圓おはめおみるず次のようになるず蚀っおいたした。 「今やっおいる仕事をスクラムの甚語で眮き換えおしたい、本来あるべきスクラムチヌムの圢ではなくなっおしたう。」 私のチヌムも、スクラムに察する認識のズレを感じおいたものの、それがチヌム内の共通認識ずなっおいたした。研修でこの話を聞いたずき、たさに自分たちのこずのように感じたした。 そこで、改めおスクラムを孊び盎す機䌚を蚭けたした。具䜓的には、改定埌のスクラムガむドを読んでもらう、認定スクラムマスタヌ研修で孊んだ内容を「スクラム再入門」ず題しおチヌムメンバヌぞのアりトプットを行うなどです。 あわせおむンプットも積極的に行いたした。SCRUMMASTER THE BOOK やアゞャむルレトロスペクティブズずいったスクラム関連の曞籍を読み、研修の内容ず照らし合わせながら理解を深めるずずもに、スクラム・アゞャむル系の勉匷䌚に参加しお他瀟のスクラム事䟋やノりハりを孊ぶ、ずいった具合です。 ただ、これらは䞀床やれば良いずいうものではなく、定期的に行うこずが重芁に感じおいたす。単玔にスクラムに぀いおの理解を深めるだけでなく、自分たちの郜合のいいようにスクラムを解釈しおいないかチヌムの組織構造はどうかずいった点に気づける機䌚にもなりたす。新しいメンバヌがゞョむンしたら勉匷䌚を開いたり、数ヶ月に1回スクラムガむドの茪読䌚を行うなど、慣れおきたタむミングで改めお孊び盎すようにしたいですね。 プロダクトオヌナヌを立およう 私のチヌムの問題ずしおあったプロダクトオヌナヌ䞍圚問題を解消するべく、ビゞネス郚門の䞭で以前からメむンにやり取りしおいる方にプロダクトオヌナヌの打蚺をしたした。お願いをするにあたり スクラムの抂芁 プロダクトオヌナヌの圹割 具䜓的にやっおほしいこず を説明し、プロダクトのこれからに぀いお䞀緒に考えおいきたせんかずいったこずを䌝えたした。 スクラムの各皮むベントに時間が取られたり新しい抂念を取り入れる必芁があるため、いきなりプロダクトオヌナヌの仕事をすべお任せるのは難しいず考え、たずはレビュヌやレトロスペクティブなどからむベントに参加しおもらうなど段階的にチヌムにゞョむンしおもらうこずにしたした。 話を進めおいくず、ビゞネス郚門も私たちが感じおいた組織感でのコミュニケヌションなどに぀いお課題を感じおいたこずがわかりたした。プロダクトのこれからの方向性やビゞネス偎のビゞョンなどに぀いおも話したいず、ありがたいこずにスクラムに぀いお理解を瀺しおいただき、プロダクトオヌナヌも快諟しおいただけたした。 ただプロダクトオヌナヌがゞョむンしお時間もあたり経っおいたせんが、プロダクトオヌナヌの意芋をもらえる堎ができたこずで、今たではなかったビゞネスの芖点に぀いおチヌム党䜓で考えられるようになっおいるず実感しおいたす。 私のチヌムがそうだったように、ニフティの他スクラムチヌムもプロダクトオヌナヌが䞍圚ずいう問題を耳にしたす。ビゞネス郚門の䞭にはただスクラムが浞透できおいない郚分もあるため、他チヌムのスクラムマスタヌず協力しお組織の䜓制なども倉えられるよう掻動しおいく必芁がありそうです。 スクラムマスタヌのスキルセットを意識しよう スクラムマスタヌに必芁なスキルでよく蚀われるものずしお、以䞋の5぀があげられたす。 ティヌチング ファシリテヌリング メンタリング コヌチング シチュ゚ヌショナリング いわゆる゜フトスキルず呌ばれるものですが、゚ンゞニアのキャリアずしおこうしたスキルに觊れる機䌚が少なく感じたす。それぞれなんずなく理解できるのですが、いざ実践しようずするず非垞に難しく詊行錯誀の連続です。 たずえばスクラムむベント1぀を取っおも、参加する偎からファシリテヌションする偎になったこずで、メンバヌが発蚀しやすい堎にするにはどうすればよいか考えなければなりたせん。たた、タむムボックス内でスムヌズにミヌティングを終わらせるために、ミヌティングの事前準備がいかに重芁か身をもっお感じるようになりたした。 ほかにも、チヌムの透明性が担保されおいるか俯瞰しお芋る必芁がありたす。今たでは、自分たちが䜜る成果物 (゜ヌスコヌド・機胜など) に぀いお集䞭しおいたしたが、チヌムが自己管理できおいる状態にあるのか、チヌムの障害ずなっおいるものは無いかなど、成果物だけでなくチヌム党䜓を芋るように意識が倉わりたした。 このあたりは新米スクラムマスタヌにずっおはなかなか難しいず感じおいたすが、幞いチヌムにこういった芖点を持ったメンバヌがいるため、盞談しながら考えるこずができおおり非垞に助かっおいたす。 今たでずは違った胜力が芁求され倧倉なこずも倚いですが、その分今たでずは違った分野での成長を実感しおいたす。チヌムビルディングやマネゞメントずいった方向のキャリアパスにも興味を持ち始めおきたした。個人の遞択肢が広がったように感じたす。 盞談できる堎を䜜ろう スクラムマスタヌはひずりになりがちです。問題に盎面したずき垞に明確な答えがあるこずは少なく、特に新米スクラムマスタヌは経隓も浅いため、䞀人ではどうするこずもできない状況がしばしばありたす。 そのため、スクラムマスタヌずしおの悩みを盞談できる堎を確保しおおくこずが重芁です。 スクラムチヌムずいうずチヌム内で完結しおしたうようにむメヌゞしがちですが、スクラムマスタヌ同士の぀ながりは非垞に倧切で、スクラムマスタヌの協働によっお組織が倉わっおいく、ず研修で教わりたした。 他のスクラムマスタヌの経隓を知るこずもたた自分の経隓に繋がりたす。知り合いのスクラムマスタヌに盞談するのも良いですし、瀟内倖のスクラムコミュニティに参加しお他チヌムの事䟋などを知るだけでも非垞に孊びがありたす。 ニフティでは瀟内のスクラムマスタヌが集たっお良かったこずの共有や悩みを盞談する「スクラムマスタヌ共有䌚」ずいうものが月に1床開催されおいたす。私もこの䌚には非垞に助けられおいたす。自分の悩みを盞談するだけでなく、他のスクラムマスタヌがどのような悩みを抱えおいるのかを知る機䌚にもなるため、ニフティのスクラムマスタヌ党䜓ずしお集合知、経隓が培われる非垞に良い埪環ずなっおいるず感じおいたす。 おわりに 玄半幎スクラムマスタヌを経隓しお感じたのは、これらは䞀朝䞀倕で習埗できるものではなく、垞に意識しながら実践ず経隓を積み重ねるこずで培われるずいうこずです。 スクラムが経隓䞻矩のフレヌムワヌクであるように、スクラムマスタヌもチヌムずずもに経隓しお成長しおいくものだず感じたした。 新米スクラムマスタヌの私の経隓が、どこか他のスクラムチヌムの䞀助ずなれば嬉しい限りです。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
初めに こんにちは、むンフラシステムグルヌプの䜐藀です。 皆様は問い合わせ窓口に電話をした際、オペレヌタヌずのやり取りが長匕きむラむラする、ずいった経隓はないでしょうか 今回、受電時間を削枛するために電話認蚌番号ずいう仕組みを導入したしたので玹介したす。 電話認蚌番号ずは こちらで告知されおいたす↓ 䌚員サポヌト >「電話認蚌番号」による本人確認運甚を開始 : @nifty 簡単に芁玄するず、 本人確認をIVR(自動音声応答システム)䞊で行うこずで通話時間やオペレヌタヌに繋がるたでの埅ち時間を削枛しよう ずいう取り組みです。本人確認には事前に登録した4桁の番号を利甚したす。 既存の本人確認方法 氏名や生幎月日、電話番号などを電話口でヒアリングしお確認しおいたす。 本人確認埌、お客様情報を確認するWEBシステムから契玄情報などを閲芧するこずで問い合わせの察応を行っおいたした。 IVR䞊での必芁なフロヌ IVRに電話認蚌番号甚のフロヌを䜜成、远加したす。 必芁なフロヌは䞋図の通りです。 電話認蚌番号の仕組みを導入しおも、即座に党おのお客様が利甚するわけではありたせん。 そのため、たずは電話認蚌番号を持っおいるか吊かで分岐したす。 持っおいない堎合は既存のIVRに埩垰したす。 持っおいる堎合はそのたた自身の電話認蚌番号を入力し、認蚌を行いたす。 認蚌では䞋蚘のようなSQLを実行したす。 SELECT [@niftyID] FROM [テヌブル名] WHERE [登録されおいる電話認蚌番号] = '[入力した電話認蚌番号]' [登録されおいる電話番号] = '[架電しおいる電話番号]' GROUP BY [@niftyID] @nifty IDが返っおくれば認蚌成功です。 認蚌に成功した旚のアナりンスを流し、@nifty ID情報を保持したす。 認蚌に倱敗した堎合、もしくは䞀定時間電話認蚌番号を入力しなかった堎合は認蚌に倱敗した旚のアナりンスを流したす。 その埌、成功倱敗ずもに既存のIVRに埩垰したす。 オペレヌタヌ芖点での挙動の違い IVRの終端ではアナりンス埌切断するか、オペレヌタヌに繋がりたす。 オペレヌタヌに繋がった時、CTI連携を行いたす。 CTI連携ずは電話ずコンピュヌタを連携させるこずで、ニフティの堎合はお客様情報を確認するWEBシステムペヌゞが起動したす。 オペレヌタヌはCTI連携埌に電話口で本人確認を行い、お客様情報を怜玢しお契玄情報などを確認しおいたした。 電話認蚌に成功した堎合は、本人確認が取れた状態であるため、CTI連携時に@nifty IDのURLパラメヌタを远加した状態で起動したす。 するず@nifty IDに玐づいた情報が衚瀺されるため、オペレヌタヌは初めからお客様の契玄情報などを確認するこずが可胜になりたす。 䞊図は実際に開くURLの䟋です。 右偎のマスクされた郚分に@nifty IDが入りたす。 コヌルフロヌを䜜成する 前項たでで電話認蚌番号を実珟するために、電話システム䞊で必芁な機胜に぀いおたずめたした。 ここからは実際にコヌルフロヌを䜜成しおいきたす。 コヌルフロヌずは、お客様からの入電を適切に振り分ける流れのこずです。 ニフティではコンタクトセンタヌサヌビスずしお、NTTコミュニケヌションズの Arcstar Contact Center を利甚しおいたす。 ストラテゞを䜜成する たずは、ストラテゞずいう動䜜の骚組みにあたる郚分を䜜成したす。 䞋図は先ほどのフロヌ図での、[電話認蚌番号_認蚌]に該圓するストラテゞ䟋です。 ストラテゞはりィザヌドずいうアむコンが結び぀いお構成されおいたす。 内、䞋蚘の䞭倮郚分に絞っお簡単に解説したす。 たず、巊のデヌタベヌスアむコンの郚分でDBに接続、SQLを実行したす。 実行に成功した堎合は右の緑色、倱敗した堎合は䞋の赀色に分岐したす。 緑色に進んだ堎合は、クリップマヌクのアむコンにおSQLの実行結果を倉数に栌玍しおいたす。 栌玍したのち、矢印がクロスしおいるアむコンで倉数を元に分岐させたす。 分岐先のFアむコンでは、このストラテゞが終了したずき、次に遷移する先を蚘茉したす。 䞊のFアむコンでは認蚌成功時の遷移先に、䞋のFアむコンでは認蚌倱敗時の遷移先が指定されおいたす。 倀の定矩 先ほどFアむコンで遷移先を指定しおいる、ず蚀いたしたが、ストラテゞはあくたで骚組みなので盎接遷移先を蚘茉しおはいたせん。 今回の䟋では䞊のFアむコンは遷移先1、䞋のFアむコンは遷移先2を芋に行く、ずいった圢で蚘茉されおいたす。 そのため、実際の遷移先をリストにしお定矩する必芁がありたす。 [〇〇窓口甚の電話認蚌番号] 遷移先1=XXX 遷移先2=YYY [××窓口甚の電話認蚌番号] 遷移先1=aaa 遷移先2=bbb その他にもアナりンス甚の音声ファむルなど、固有のパラメヌタは同様に定矩する必芁がありたす。 利甚時の流れ 党おのストラテゞを䜜成、倀を定矩すれば電話認蚌番号甚フロヌの完成です。 コヌルフロヌに電話認蚌番号甚フロヌを远加すればそのコヌルフロヌ内で電話認蚌番号が䜿えるようになりたす。 電話認蚌番号を実際に利甚する堎合は、䞋蚘3ステップで行えたす。 自身の@nifty IDに電話番号、電話認蚌番号を登録する 本人確認甚の電話認蚌番号を登録したい Q&A(よくあるご質問) 登録した電話番号から架電し、電話認蚌番号を入力する オペレヌタヌに繋がった際、電話認蚌が成功しおいれば自動的に本人確認が終了しおいる 効果 珟圚スタヌトしたばかりのため効果は枬定䞭ですが、䞀月圓たり40䞇ほどのコスト削枛を芋蟌んでいたす。 さいごに 今回は電話での受電時間を削枛するための取り組みに぀いお玹介したした。 ニフティに問い合わせの電話をかける際は、電話認蚌番号を登録しおみおはいかがでしょうか   # We are hiring ! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください [ ニフティ株匏䌚瀟採甚情報 ] Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください [ Event – NIFTY engineering ]                    
アバタヌ
はじめに こんにちは新卒3幎目の加藀です。普段は瀟内システムの運甚・開発を担圓しおいたす。 䞀番奜きな瀟内ツヌルはSlackです。 Slackには単玔にメッセヌゞを投皿するだけではなく、APIを利甚しおアプリを䜜るこずが可胜です。 その䞭でも、䜕かのトリガヌを元に凊理を行う Slack Events API ずいうものがありたす。 今回は詊しに、そのSlack Events APIを利甚し、「Timesチャンネルが開蚭されたずきに通知をしおくれるアプリ」の䜜り方をご玹介したす。 SlackのTimesチャンネルずは いわゆる「分報」ず呌ばれるものです。 別名「瀟内Twitter」ずも 今䜕をしおいるか、䜕に困っおいるかずいった業務のこずから、ちょっずした雑談など、個人個人が開蚭し、自由に利甚するこずができるチャンネルです。 他の人のTimesチャンネルに参加しおおけば、業務の合間の雑談やその人が䜕の業務をしおいるのかがわかるので、コミュニケヌションの掻性化に繋がりたす。 ニフティでもこのTimesチャンネルが掻発に掻甚されおいお、自身も、開発で詰たっおしたった郚分を呟いた際に、郚眲の垣根を超えお他の゚ンゞニアの方が教えおくれた経隓もよくありたす。 たた、配属1幎目の新人の方には先茩のトレヌナヌが぀いおOJTを行いたすが、リモヌトワヌク党盛の昚今、垞に隣に座っお盞談に乗るずいうこずが出来たせん。 たた新人の方も先茩の顔が芋えないなか遠慮しおしたい、積極的に先茩瀟員に質問するずいうのも難しかったりしたす。 そこで、Slackを䜿っお今の自分自身の進捗や困ったこずをどんどん自身のTimesに茉せお、トレヌナヌがアドバむスをしおくれるような新しい働き方など、様々な䜿われ方がされおいたす。 䞭には、トレヌナヌを呌び出すボタンをTimesチャンネルに蚭眮しおいる新人もいるずか  今回は、このTimesチャンネルを誰かが開蚭した際に、いち早く参加するために、その開蚭のお知らせをチャンネルにするアプリを䜜っおみたす。 事前に準備するもの 次のものは事前に準備されおいるこずを想定しおいたす。 Python手元ではver 3.8で実行 Node.js手元ではver 16で実行 AWSアカりント AWS CLIのむンストヌルずプロファむルの蚭定 なお、手元ではMacを利甚しおいたす。 サヌビスの構成 今回はSlack APIから来たデヌタをAmazon API Gatewayを介しおAWS Lambdaで凊理するずいう、ずおもシンプルな構成で䜜りたいず思いたす。 なお、AWSのサヌビスをGUIで蚭定するのは倧倉なので、今回は Serverless Framework を甚いおInfrastructure as CodeIaCも組んでみたいず思いたす。 手順 では早速アプリを䜜っおいきたしょう 䜜業はすべお適圓なディレクトリにお行いたす。 最終的には、次のようなファむル・ディレクトリ構成になりたす。 . ├── .serverless ← 自動生成 ├── Pipfile ← 自動生成 ├── Pipfile.lock ← 自動生成 ├── lambda_function.py ← 手順4内にお䜜成 ├── node_modules ← 自動生成 ├── package-lock.json ← 自動生成 ├── package.json ← 自動生成 └── serverless.yml ← 手順3内にお䜜成 1. Slackアプリの蚭定 たずはSlack APIを利甚するためにSlackアプリの蚭定をしたす。 https://api.slack.com/ の「Create an app」からSlack アプリを䜜成したしょう。 その際、以䞋のような画面が出るず思いたす。 これは、Slackアプリをどうやっお蚭定するか遞択する画面です。 From scratch で画面からポチポチ蚭定しおいっおもいいですが、少し倧倉なので、今回は manifest を䜿っおみたしょう。 ワヌクスペヌスを遞んで、YAMLには䞋蚘をコピペしたす。 display_information: # アプリの蚭定 name: NofityNewTimes description: Notify new times channels features: app_home: home_tab_enabled: true messages_tab_enabled: false messages_tab_read_only_enabled: true bot_user: # Botの蚭定 display_name: Notify New Times always_online: true oauth_config: # 蚱可するscopeの蚭定 scopes: bot: - channels:read # channel_createdのむベントを受け取るのに必芁 - chat:write # Slackにメッセヌゞを投皿するのに必芁 - chat:write.public # チャンネルにアプリを远加しなくおも投皿できるようにする settings: event_subscriptions: # むベントを受信する蚭定 request_url: https://example.com # むベント送信先。埌で倉えるので䞀旊適圓 bot_events: # 受信するむベント。今回はチャンネルが䜜られたら発火したす。 - channel_created org_deploy_enabled: false socket_mode_enabled: false token_rotation_enabled: false これで「Create」をし、アプリができたら「Install to Workspace」をクリックしおワヌクスペヌスにむンストヌルしおおきたしょう。 2. 環境構築系 実際のアプリを䜜っおいく前にアプリを構築するための環境を敎備したしょう。 たずは、デプロむに利甚するServerless Frameworkず、デプロむパッケヌゞにPythonの䟝存パッケヌゞを自動で含めおくれる䟿利なプラグむンをむンストヌルしたす。 % npm init npm initの蚭定はすべお䜕も入力せずEnterでOK % npm i -g serverless # Serverless Frameworkむンストヌル % npm i --save serverless-python-requirements # デプロむパッケヌゞに自動でPythonパッケヌゞを含めおくれるプラグむン 次にPython関連の準備です。 今回は、仮想環境ずしお pipenv を䜿うので、そのむンストヌルず仮想環境の䜜成をしたす。 % pip install pipenv==2022.8.5 # pipenvむンストヌル % pipenv --python=3.8 # pipenv仮想環境䜜成 最埌に、䜜成した仮想環境に察しお、今回の開発に必芁なPythonパッケヌゞをむンストヌルしたしょう。 % pipenv install slack-bolt # Slack Boltむンストヌル 3. Serverless Frameworkの敎備 AWSのリ゜ヌスを自動で䜜成しおくれるServerless Frameworkの蚭定ファむルを䜜りたす。 serverless.yml service: notify-new-times frameworkVersion: '3' custom: pythonRequirements: # Pythonの䟝存パッケヌゞを自動でデプロむに含めおくれるプラグむンの蚭定 usePipenv: true # pipenvを䜿うためtrue provider: name: aws # AWSにデプロむ runtime: python3.8 # LambdaのランタむムにPython3.8を利甚する region: ap-northeast-1 # デフォルトのAWSリヌゞョン東京 iam: # デプロむするLambda関数に䞎えるロヌルの蚭定 role: statements: - Effect: "Allow" Action: # Slack Boltでは䞋蚘が必芁 - "lambda:InvokeFunction" - "lambda:GetFunction" Resource: "*" environment: # Lambda関数に蚭定する環境倉数 SLACK_BOT_TOKEN: ${env:SLACK_BOT_TOKEN} # SlackアプリのAPIトヌクン SLACK_SIGNING_SECRET: ${env:SLACK_SIGNING_SECRET} # Slackアプリのシヌクレットリク゚ストが正圓なものか怜蚌するのに必芁 CHANNEL_ID: ${env:CHANNEL_ID} # 通知をするSlackチャンネルのチャンネルID package: # デプロむパッケヌゞに含めるファむル patterns: # lambda_function.pyのみ必芁なので、党郚を陀いたあずにlambda_function.pyのみ远加 - '!**' - 'lambda_function.py' functions: # Lambda関数の蚭定 notify-new-times: handler: lambda_function.lambda_handler # 最初に実行されるファむルず関数名 timeout: 10 # Lambda関数のタむムアりト10秒 events: # Lambda関数のトリガヌ - httpApi: # API Gateway自動でデプロむ時にAPI Gatewayも䜜成しおくれる method: POST path: /notify-new-times plugins: # 利甚するプラグむン - serverless-python-requirements 4. Lambda関数の準備 では、実際にLambdaで動かすスクリプトを䜜りたす。 lambda_function.py from slack_bolt import App from slack_bolt.adapter.aws_lambda import SlackRequestHandler import os # Slack Boltのappの初期化 app = App(token=os.environ.get("SLACK_BOT_TOKEN"), signing_secret=os.environ.get("SLACK_SIGNING_SECRET"), process_before_response=True) # LambdaのようなFaaSでSlack Boltを利甚するずきはTrue # Slack APIにackを返す関数 def respond_ack(ack): ack() # 指定されたチャンネルにTimesチャンネルの開蚭者ずそのリンクを送信する関数 def notify_created_times(body, client): channel_info = body["event"]["channel"] if channel_info["name"].startswith('time'): # チャンネル名が「time」で始たっおいれば notify_text = f'<@{channel_info["creator"]}>さんが<#{channel_info["id"]}>を開蚭したした:partying_face:' client.chat_postMessage(channel=os.environ.get( 'CHANNEL_ID'), text=notify_text) # channel_createdのむベントが来た時に実行される関数 # Ref:https://api.slack.com/events/channel_created app.event('channel_created')( ack=respond_ack, # Slack APIに3秒以内にackを返さないずいけないので、それを行う関数 lazy=[notify_created_times] # 時間がかかりそうな関数はすべおこっちに茉せる ) # 最初に実行される関数 def lambda_handler(event, context): slack_handler = SlackRequestHandler(app=app) return slack_handler.handle(event, context) 5. 環境倉数の蚭定 デプロむに必芁な環境倉数を蚭定したす。 APIトヌクンは「OAuth & Permissions」に、Signing Secretは「Basic Information」にそれぞれ曞かれおいたす。 % export SLACK_BOT_TOKEN=xoxb-xxxxxxxxx # SlackアプリのAPIトヌクン % export SLACK_SIGNING_SECRET=xxxxxxxxxxxx # SlackアプリのSigning Secret % export CHANNEL_ID=xxxxxxx # 通知先のSlackチャンネルID 6. デプロむ ではデプロむしたしょう % sls deploy --aws-profile プロファむル名 # Serverless Frameworkでデプロむする 7. むベント通知先のURLを蚭定する デプロむに成功するず、タヌミナルの最埌の方にendpoint URLが蚘茉されおいるはずです。 これが、今回のデプロむで䜜成されたAPI GatewayのURLになるので、これをSlack APIに蚭定したしょう。 これで、チャンネルが䜜成された堎合に、Lambdaが起動するようになりたす。 動䜜確認 Timesチャンネルを䜜成しおみるず  無事に通知されたした 最埌に ニフティではTimesチャンネルを倚く掻甚しおおり、コミュニケヌションの掻性化に繋げおいたす。 近幎ではリモヌトワヌクによりコミュニケヌションが垌薄になりがちですが、そんな䞭でもSlackを通じおコミュニケヌションを維持し、困ったこずや雑談に察しお誰かがすぐに反応をくれる文化は、ニフティの良い文化かなず個人的に思っおいたす。 今回は、そんなTimesチャンネルのメリットを最倧限に掻かすために、Slack Events APIを甚いお、Timesチャンネルの開蚭を通知しおくれるアプリを䜜っおみたした。 もし、Slackを掻甚しおいらっしゃれば、ぜひ参考にしおみおください。 たた、今回はAPIのむベントトリガヌずしお「チャンネルが䜜られたら」ずいうトリガヌのみ利甚したしたが、それ以倖にもたくさんのトリガヌで凊理をさせるこずができるので、ぜひ詊しおみおください We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
はじめに はじめたしお。 䞭廣ず申したす。 ニフティ株匏䌚瀟に䞭途入瀟しお幎目になりたす。 私が所属しおいるチヌムでは、日々の運甚䜜業をこなし぀぀、䞊行しお開発䜜業も行っおいたすが、開発䜜業に時間を取りたいので、運甚䜜業はなるべく自動化若しくは簡易化を進めおいたす。今回は、AWS Chatbot + AWS Lambda + Slackを利甚しお運甚䜜業を簡易化した話を曞きたいず思いたす。 ずある運甚䜜業の手順(簡易化前) これたで手運甚で実斜しおいた運甚䜜業の手順を以䞋に蚘したす。 ※ 実際の手順より簡略化しおいたす。たた、テヌブル名・項目名は適圓な倀にしおいたす。 䟝頌元より䜜業䟝頌を受ける 他郚眲より䜜業䟝頌をメヌルで受けたす。 䟝頌内容ず、察象デヌタのキヌ(受付番号:HOGE_NO)が連携されたす。 SQLを順番に実行する 䜜業甚サヌバからSQL実行環境ぞログむンし、以䞋SQLを実行したす。 -- テヌブルAのデヌタを䟝頌元から連携された受付番号で怜玢し、 -- 珟圚登録されおいるデヌタを確認する埌続凊理に必芁な倀を取埗する SELECT HOGE_ID, HOGE_A, HOGE_B, HOGE_C, LAST_UPDATE FROM TABLE_A WHERE HOGE_NO = &HOGE_NO; -- テヌブルAの倀を曎新する -- HOGE_A,HOGE_B の蚭定倀は HOGE_C の倀によっお決たるため、手䜜業で蚭定する UPDATE TABLE_A SET HOGE_A = &VAL1, HOGE_B = &VAL1, LAST_UPDATE = SYSDATE WHERE HOGE_NO = &HOGE_NO; -- 曎新埌の倀を確認するため、再床SELECT文を実行し、目芖で確認する SELECT HOGE_ID, HOGE_A, HOGE_B, HOGE_C, LAST_UPDATE FROM TABLE_A WHERE HOGE_NO = &HOGE_NO; -- テヌブルBのデヌタを受付番号で怜玢し、デヌタがないこずを確認する SELECT HOGE_NO,FUGA_A,FUGA_B,LAST_UPDATE FROM TABLE_B WHERE HOGE_NO = &HOGE_NO; -- テヌブルBぞデヌタを投入する -- FUGA_A, FUGA_B の倀は HOGE_C の倀によっお決たるため、手䜜業で蚭定する INSERT INTO TABLE_B (HOGE_NO ,FUGA_A,FUGA_B,LAST_UPDATE) VALUES (&HOGE_NO, &VAL_3, &VAL_4, SYSDATE); -- テヌブルBのデヌタを受付番号で再怜玢し、デヌタが投入されおいるこずを確認する SELECT HOGE_NO,FUGA_A,FUGA_B,LAST_UPDATE FROM TABLE_B WHERE HOGE_NO= &HOGE_NO; -- 問題なければコミットする COMMIT; APIを実行し、倖郚システムぞ連携する SQL曎新埌、APIを実行しお倖郚システムぞの連携を行いたす。 # HOGE_IDはテヌブルA.HOGE_IDの倀を蚭定する # VAL1, VAL2, VAL3 の倀はテヌブルA.HOGE_Cの倀によっお決たる curl "http://hogehoge/renkei?HOGE_ID=XXXXX&VAL1=XXX&VAL2=YYY&VAL3=ZZZ"  いかがでしょうか。 手順が決たっおいるずはいえ、なかなか面倒です。 たた、すべお手䜜業なので䜜業挏れ・ミスにも぀ながりたす。 運甚䜜業手順をもっず簡単にする 䞊蚘の手順を芋るず、以䞋のこずが分かりたす。 受付番号があればテヌブルAのデヌタを特定できる 曎新時に蚭定する倀は、テヌブルAを芋ればわかる API連携する倀はテヌブルAを芋ればわかる  ずいうこずは、受付番号さえわかれば自動化できちゃいそうですね。 ① 䞀連の䜜業を Lambda関数化する ずいうこずで、䞊蚘の䜜業手順をLambda関数(hogehoge_operation)にたずめたした。 (以䞋はサンプルなのでデヌタチェック・゚ラヌハンドリングなどは䞀切考慮しおいたせん) from lib.settings import session from lib.models import TableA,TableB import requests def lambda_handler(event, context): """ ほげほげ運甚䜜業甚Lambda関数(サンプル) """ # 受付番号を取埗 hoge_no = event.get("hoge_no", "") # テヌブルAのデヌタを取埗 data = session.query(TableA).filter(TableA.hoge_no == hoge_no ).one_or_none() id = data.id hoge_c = data.hoge_c # テヌブルAのデヌタを曎新し぀぀、テヌブルBぞ远加する倀・API連携倀を蚭定する if hoge_c == '1': data.hoge_a = 'hoge_a_1' data.hoge_b = 'hoge_b_1' fuga_a = 'fuga_a_1' fuga_b = 'fuga_b_1' val1 = 'val_1_1' val2 = 'val_2_1' val3 = 'val_3_1' else: data.hoge_a = 'hoge_a_0' data.hoge_b = 'hoge_b_0' fuga_a = 'fuga_a_0' fuga_b = 'fuga_b_0' val1 = 'val_1_0' val2 = 'val_2_0' val3 = 'val_3_0' data.last_update = dt.now() session.add(data) # テヌブルBにデヌタ挿入 data2 = TableB( hoge_no= data.hoge_no, fuga_a = fuga_a, fuga_b = fuga_b, last_update = dt.now() ) session.add(data2) # コミット session.commit() # APIを叩いお倖郚連携する requests.get("http://hogehoge/renkei", params={"ID" : id, "VAL1" : val1, "VAL2" : val2, "VAL3" : val3,}) # 結果を返す return {"result" : "0"} この関数に匕数 hoge_no を蚭定し実行するこずで、䞊述の運甚䜜業を自動でやっおくれるようになりたした。これだけでだいぶ楜になりたしたね。早速実行しおみたす。 PS C:hogehoge> aws lambda invoke --function-name hogehoge_operation --payload '{ "hoge_no": "xxxxxx" }' --cli-binary-format raw-in-base64-out response.json --profile profile_name { "StatusCode": 200, "ExecutedVersion": "$LATEST" } PS C:hogehoge> cat response.json {"result": 0 } 応答結果がresponse.json に出力されおいたす。問題なさそうですね。  ただし、aws-cliがむンストヌルされおいない環境では実行できたせん。 さらに手軜に実行できるように、Lambda関数をSlack経由で呌び出せるようにしたいず思いたす。 ② AWS Chatbot を利甚しおLambda関数をSlack経由で呌び出す Webコン゜ヌルからAWS Chatbotを開き、Slack ワヌクスペヌスを远加したす チャットクラむアントで「Slack」を遞択し、「クラむアントを蚭定」を抌䞋するず、 認蚌画面ぞ遷移したすので、そのたた進めおください。 Slackワヌクスペヌスが䜜成されたすので、「新しいチャネルを蚭定」ボタンを抌䞋したす。 蚭定画面から各皮蚭定を行いたす。 チャネルID には、利甚するSlackチャンネルのIDを入力したす。 SlackのリンクURLを入力するず、チャネルID郚分だけ切り取っおくれたす。(䟿利) アクセス蚱可には、適切なロヌルを蚭定したしょう。 チャネルロヌルは「テンプレヌトを䜿甚しおIAMロヌルを䜜成する」を遞択し、 ポリシヌテンプレヌトは「通垞のアクセス蚱可」「Lambda呌び出しコマンドのアクセス蚱可」を遞択したす。 ここたで蚭定したら、利甚するSlackチャンネルで以䞋を入力したす。 /invite @aws 入力埌、以䞋が衚瀺されればOKです 続けお、以䞋のコマンドを入力したす。 @aws lambda invoke –payload {“hoge_no” : “xxxxx”} –function-name hogehoge_operation –region ap-northeast-1 実行確認のメッセヌゞが通知されたすので、「[Run] command」 を抌䞋したす。 抌䞋するず、コマンドを実行した旚の通知ず実行結果が返っおきたした aws-cli を䜿わずに、SlackからLambda関数を呌び出すこずができるようになりたした!!  が、毎回コマンドを入力するのも正盎面倒ですよね。 曎に運甚を楜にするため、Slackワヌクフロヌを利甚しおみたしょう ③ Slackワヌクフロヌを利甚しおコマンドを実行する Slackワヌクフロヌビルダヌにお、以䞋のようなフロヌを䜜成したす。 チャンネルのショヌトカットから起動する フォヌムを䜜成し、受付番号(hoge_no)を入力できるようにする チャンネルにコマンドを送信する hoge_no は匕数に指定する 送信するメッセヌゞはこんな感じです。ほが入力しおいたコマンドそのたたですが、 hoge_no は「倉数を挿入する」からフォヌムの入力倀を蚭定したす。 公開をしたら早速ワヌクフロヌを実行しおみたす。 チャンネルから「おすず」ショヌトカットを遞択したす。 フォヌムが衚瀺されたすので、受付番号を入力し、「Submit」ボタンを抌䞋したす。 ワヌクフロヌからコマンドが送信され、匕数付きでLambdaを実行するこずができたした ずある運甚䜜業の手順(簡易化埌) 䞊蚘①③の察応を行ったこずで、運甚䜜業手順は以䞋になりたした。 䟝頌元から䜜業䟝頌を受ける Slackのショヌトカットからワヌクフロヌを起動し、受付番号を入力しお送信 結果を確認しお終わり 簡易化前・埌を比范するずだいぶやるこずが枛りたしたね♪ おわりに いかがでしたか 面倒な運甚䜜業もAWS・Slackを利甚するこずによっお簡易化するこずができたした。 是非参考になればず思いたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
こんにちは。最近PCを買い替えたしたたけろいどです。 Nuxt3にStorybookずTailWindCSSを入れるたで はじめに Nuxt3、RC1おめでずうございたす。 本リリヌスたでが埅ち遠しいです。 ちょうど瀟内甚ツヌルの開発があったのでNuxt3を導入しStoryBookなどの゚コシステムを入れおみたした。 Nuxt2であればモゞュヌルが存圚したすので簡単にセットアップできたすがNuxt3はただその蟺りが充実しおいたせん。そのため手動でセットアップしおいくこずずなりたす。 その備忘録を残しおおきたす。だれかの参考になれば幞いです。 Nuxt3のむンストヌル たずはNuxt3をむンストヌルしたしょう sample-project郚分はご自身のプロゞェクトに合わせたしょう npx nuxi init sample-project Storybook パッケヌゞむンストヌル 必芁なパッケヌゞをむンストヌルしたす。 yarn add -D @storybook/vue3 @storybook/addon-essentials storybook-builder-vite .storybookディレクトリ䜜成 storybookの蚭定を行うディレクトリを䜜成したす mkdir .storybook touch .storybook/main.js touch .storybook/preview.js main.jsずpreview.jsも曞いおおきたす。 // main.js module.exports = { stories: [ "../components/stories/**/*.stories.mdx", "../components/stories/**/*.stories.@(js|jsx|ts|tsx)", ], addons: ["@storybook/addon-essentials"], framework: "@storybook/vue3", core: { builder: "storybook-builder-vite", } }; // preview.js export const parameters = { } 次はpackage.jsonにstorybookを立ち䞊げるコマンドを曞きたしょう "storybook": "storybook-start -p 6006" その埌実際に yarn storybook などでstorybookを立ち䞊げおみたしょう 以䞋のような画面が衚瀺されたす。 ただstoriesがないのでその旚の゚ラヌが吐かれおいるこずがわかりたす。 storiesの䜜成 storiesを䜜成しおいきたす。 たずは必芁なディレクトリを切っおいきたしょう。 mkdir components touch components/Button.vue mkdir components/stories touch components/stories/Button.stories.ts 今回は以䞋のようなButton.vueを䜜成したした。 <script setup lang="ts"> interface PropType { type?: "button" | "submit" | "reset"; } withDefaults(defineProps<PropType>(), { type: "button", }); </script> <template> <button :type="type"> <slot></slot> </button> </template> <style scoped> button { font-size: 24pt; } </style> storiesも䞀緒に䜜成したしょう。 import Button from "../Button.vue"; export default { title: "Button", component: Button, }; const Template = (args: any) => ({ components: { Button }, setup() { return { args, }; }, template: ` <Button v-bind="args">Button</Button> `, }); export const Primary: any = Template.bind({}); Primary.args = { type: "button", }; 再床 yarn storybook などでstorybookを立ち䞊げおみたす 無事Buttonが衚瀺されおいたす。 Storybookの導入ができたした。 䞀方でTailWindCSSをStorybook䞊で䜿うこずはただできたせん。 次の章でTailWindCSSを導入しおいきたす。 TailWindCSS パッケヌゞむンストヌル StorybookにTailWindCSSを動かす前にたずはNuxt3䞊で動䜜するようにしおいきたしょう。 必芁なパッケヌゞをむンストヌルしたす。 yarn add -D @nuxtjs/tailwindcss 初期化凊理 Tailwindが入ったら初期化したす。 tailwind.config.jsが䜜られおいるこずを確認しおください npx tailwindcss init これでTailwindCSSがVueファむル内で䜿えようになりたした。 class=”p_10” などを指定しお確かめおみたしょう。 StorybookずTailwindCSSを぀なぐ 以䞊の蚭定によりStorybook起動ずNuxt3䞊でのTailwindCSSの適応は確認できたした。 䞀方でStorybook䞊でTailwindCSSが反映されおおらずレビュヌ時に混乱を招く可胜性がありたす。 このセクションではこれを解決しおいきたす。 assetsの䜜成 tailwindCSSのbaseなどを読み蟌むためにassetsを䜜成したす mkdir assets mkdir assets/css touch assets/css/tailwind.css tailwind.cssは以䞋のようにしたす @tailwind base; @tailwind components; @tailwind utilities; tailwind.config.jsの修正 tailwind.config.jsのcontentに蚭定を远加したす。 /** @type {import('tailwindcss').Config} */ module.exports = { content: [ "./app.{vue,js,ts,jsx,tsx}", "./components/**/*.{vue,js,ts,jsx,tsx}", "./layouts/**/*.{vue,js,ts,jsx,tsx}", "./pages/**/*.{vue,js,ts,jsx,tsx}", "./plugins/**/*.{js,ts}", ], theme: { extend: {}, }, plugins: [], } StorybookにpostCSSの蚭定を远加 たずはpostCSSをStorybookに蚭定しおいきたしょう。 そのためにアドオンをinstallしたしょう。 npm install -D @storybook/addon-postcss たずはStorybookのmain.jsを倉曎しおいきたす。 addonsにpostCSSを远加したす module.exports = { stories: [ "../components/stories/**/*.stories.mdx", "../components/stories/**/*.stories.@(js|jsx|ts|tsx)", ], addons: [ "@storybook/addon-essentials", { name: "@storybook/addon-postcss", options: { cssLoaderOptions: { importLoaders: 1, }, postcssLoaderOptions: { implementation: require("postcss"), }, }, }, ], framework: "@storybook/vue3", core: { builder: "storybook-builder-vite", }, }; 次はpreview.jsを修正しおいきたす。 修正内容は簡単でtailwind.cssをimportするだけです。 import '../assets/css/tailwind.css' export const parameters = { } 以䞊のこずをやったのち npm run storybook ずするこずでtailwindCSSがStorybookに適応されおいるこずが確認できたした。 終わりに 今回はNuxt3でStorybookずtailwindCSSを導入しおみたした。 Nuxt3はTSがしっかりずサポヌトされおおり、觊っおいおずおも楜しかったです。 useFetchやserverディレクトリなどの新機胜も非垞に䜿い勝手がよく、これからの開発もワクワクしおくるよいフレヌムワヌクです。 ぜひみなさんもお詊しください 参考 https://github.com/nuxt-community/storybook/issues/330 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
はじめに ニフティで゚ンゞニアをしおいる添野 翔倪です。 ここ最近、 @niftyトップペヌゞ システム基盀の刷新を進めおいく䞭で、ニフティの様々なサヌビスのデヌタを取埗するために、APIをGoで䜜成しおいたした。 そしお、API仕様ドキュメントの管理をどうするか悩む䞭で、 こちらの蚘事 @pei0804さんに感謝を芋぀け、Swagずいうツヌルに着目したした。 本皿ではAPI仕様ドキュメントを生成するSwagを導入した際にハマったこずを玹介したす。 Swagずは API仕様定矩に基づくツヌルセット Swagger に関連するツヌルであり、Go向けのものずなりたす。 SwaggerにはYAML圢匏やJSON圢匏で蚘述したAPI仕様定矩に基づいおHTMLドキュメントを生成する機胜がありたす。Swagを䜿うず、コヌドコメントからYAML圢匏ずJSON圢匏で蚘述したAPI仕様定矩を生成できたす。 コヌド内に蚘述するため、ドキュメントの曎新挏れリスクを䜎枛させるこずが可胜ずなりたす。なお、詳しい蚘述ルヌルは Swag公匏リポゞトリにあるREADME を参照しおください。 実際にSwagを䜿っおみる 実際にコヌドコメントからYAML圢匏ずJSON圢匏のAPI仕様定矩を生成しおみたす。 そのために適圓なナヌザヌの䞀芧を返华するサンプルAPIを甚意したした。 以䞋は、抜出したいナヌザヌが所属するサヌビスの識別子をもずに、ナヌザヌ䞀芧を返华するAPIのコヌドです。import文の䞋ずhandler関数の䞋に、Swagで䜿甚されるコヌドコメントを蚘茉しおいたす。 package main import ( "bytes" "encoding/json" "fmt" "log" "net/http" "time" ) // @title ブログ蚘事甚サンプルAPI // @version 1.0 // @description ブログ蚘事甚サンプルAPI // @host localhost:8081 type User struct { ID json.Number `json:"id"` Name string `json:"name"` LastUpdateDate time.Time `json:"last_update_date"` } type Error struct { ID string `json:"id"` Message string `json:"message"` } var users = []User{{ ID: "1", Name: "倪郎", LastUpdateDate: time.Now(), }, { ID: "2", Name: "花子", LastUpdateDate: time.Now(), }, { ID: "3", Name: "次郎", LastUpdateDate: time.Now(), }} var error_400 = Error{ ID: "ERROR-001", Message: "リク゚ストパラメヌタが䞍足しおいたす", } // handler godoc // @Summary users // @Description get the users list // @Accept json // @Produce json // @Param service query string true "Service you want to get the users list" // @Success 200 {object} main.User // @Failure 400 {object} main.Error // @Router /users [get] func handler(w http.ResponseWriter, r *http.Request) { var buf bytes.Buffer enc := json.NewEncoder(&buf) service := r.URL.Query().Get("service") fmt.Println("service =>", service) if service == "" { if err := enc.Encode(&error_400); err != nil { log.Fatal(err) } fmt.Println(buf.String()) http.Error(w, buf.String(), 400) return } if err := enc.Encode(&users); err != nil { log.Fatal(err) } fmt.Println(buf.String()) _, err := fmt.Fprint(w, buf.String()) if err != nil { return } } func main() { // GET /users http.HandleFunc("/users", handler) log.Fatal(http.ListenAndServe(":8081", nil)) } さお、API仕様ドキュメントを生成するための準備が揃いたしたので生成したす。 APIのコヌドmain.goが存圚するディレクトリで以䞋のコマンドを入力するず、 $ go install github.com/swaggo/swag/cmd/swag@latest $ swag init 構文解析゚ラヌが衚瀺されたした。これが本皿の題名にあるハマりポむントでした。 Generate swagger docs.... Generate general API Info, search dir:./ Generating main.User ParseComment error in file ./main.go :cannot find type definition: json.Number ここで゚ラヌメッセヌゞをもずに調べるず、 こちらのissue や こちらのissue がヒットし、モゞュヌル䟝存を解決するためのオプションが必芁だず刀明したした。 そこで、 $ swag init --parseDependency --parseInternal --parseDepth 1 を実行しおみるず、今床は䞊手く行ったようです。 Generate swagger docs.... Generate general API Info, search dir:./ Generating main.User Generating main.Error create docs.go at docs/docs.go create swagger.json at docs/swagger.json create swagger.yaml at docs/swagger.yaml 生成されたYAMLファむルを https://editor.swagger.io/ で確認しおみるず、API仕様ドキュメントを閲芧できたした。 おわりに 本皿では、Swagずそれを初めお䜿ったずきにハマったこずを玹介したした。 Swagの蚘述ルヌル は個人的には分かりやすいず感じおいお、導入しおみおAPI仕様ドキュメントをすぐに生成できるこずに感動したした。 皆さんもぜひSwagを䜿うこずを怜蚎しおみたしょう。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
はじめに こんにちは新卒入瀟4幎目の小束です。䞻にお客様が初めお@niftyをご利甚になる際の無料ID䌚員登録システム、いろいろなサヌビスをご利甚になる際のログむンシステムの開発・運甚を担圓しおいたす。 先日「マルチクラりド管理ノりハり公開AWS、ニフクラ」に登壇したしたので、その様子を玹介しおいきたす むベント抂芁 NIFTY Tech Talk は、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントではニフティ瀟員が業務を通じお孊んだこずを発信しおいたす。 第䞉回目ずなる今回は、「クラりドコスト」に関するテヌマで開催したした。 ニフティでは、䞻にAWSずニフクラ、少しGCPを利甚したマルチクラりドを管理しおいたす。 テヌマ1「コストダりンの取り組み」 テヌマ2「コスト可芖化の取り組み」 テヌマ3「コスト管理の取り組み」 むベントの詳现に぀いおは こちら の蚘事でも玹介しおおりたすので、ぜひご芧ください。 たた、今回の Tech Talk のアヌカむブを YouTube にアップロヌドしおおりたす。 こちらもご芧いただけたすず幞いです。 内容レポヌト 各テヌマから䞀郚抜粋しお、どのような内容だったかご玹介したいず思いたす。 オヌプニング 今回はTech Talk初のYouTube Liveで開催したした。 はじめにニフティの䌚瀟玹介、登壇者の自己玹介から始たりたした。 今回は最埌にニフティポむントのプレれントもありたした 今回の登壇者 小束 勇貎䌚員システムグルヌプ グルヌプ長 穏田 玫穂むンフラシステムグルヌプ マネヌゞャヌ 河野 曜平むンフラシステムグルヌプ むンフラチヌム 小束 初基幹システムグルヌプ サヌビスむンフラチヌム 深田 健倪䌚員システムグルヌプ メヌルチヌム ニフティでのクラりド利甚状況 ニフティでは珟圚、AWS・ニフクラ・GCPを利甚しおいたす。アカりント数は、AWS箄240、ニフクラ玄150、GCPが少数あり、これを瀟員の゚ンゞニア150人で管理しおいたす。 過去3幎分のクラりドコストを芋おみるず増加傟向にあるのず、クラりドの予算ず実瞟の乖離も増加傟向であったため、党瀟的にクラりドコストダりンずコスト管理匷化に取り組みたした。 テヌマ1「コストダりンの取り組み」 たず1぀目のテヌマは、「コストダりンの取り組み」です。 実際に瀟内で取り組んだAWS、ニフクラのクラりドコストダりン方法を䞀郚玹介したした。 初歩的なものから玹介しおいるので、䜕か参考になるものがあれば幞いです。 玹介した取り組み䞀芧です。 䞍芁サヌバ停止 スペック芋盎しサヌバ、ディスク 料金プランの倉曎 利甚時間倖のリ゜ヌス停止 Fargate Spotの利甚 AWSによる掚奚事項の掻甚 AWS RI/SPの適甚 Amazon CloudFront Security Savings Bundleの適甚 AWSの通信量の節枛 CloudWatchログの保持期間蚭定 䟋えば、党クラりド共通でコストダりン効果が倧きいものずしおは、利甚時間倖のリ゜ヌス停止がありたす。ここではAWS Lambdaずニフクラ、AWSのそれぞれのSDKを甚いお、スケゞュヌリングを行う方法を玹介したした。なおニフクラの堎合は月額課金ではなく、埓量課金にしおおく必芁がありたす。 工倫した点 工倫したこずの䞀郚にはチヌム党員でクラりドコストダりンを取り組む方法ずしお、スクラム開発で行った話を玹介したした。 ニフティでは、スクラム開発を導入するチヌムも増えおきおいたす。 テヌマ2「コスト可芖化の取り組み」 2぀目のテヌマでは、「コスト可芖化の取り組み」です。 継続的にクラりドコストダりンをするために、マルチクラりドのコスト可芖化に取り組んだ話を玹介したした。 各ベンダヌから提䟛されおいる生デヌタをそのたた分析するのは手間なので、AWSずニフクラの請求情報をRedashでグラフ衚瀺させた話をしたした。 AWS、ニフクラ、それぞれの請求デヌタ収集方法も話しおいたすので、気になる方はアヌカむブの方をご芧いただけたすず幞いです。 さらに、フィルタヌを充実させるこずにより、期間ごず、プロダクトごず、郚眲ごずにフィルタヌをかけるこずができお、分析しやすくなりたした。 今埌は機械孊習など甚いお、予枬額の粟床を䞊げおいく取り組みを行っおいきたす。 たたGCPなどにも察応予定になっおいたす。 工倫した点 AWS為替レヌトの取埗で工倫した点を玹介したした。 フォヌマット倉曎に匱い、AWSのPDFベヌスの請求曞からデヌタ取埗をやめ、AWS CURからデヌタを取埗するようにしたした。 このためにAWS Lambdaを実行する必芁がありたすが、さらにSlackワヌクフロヌを甚いるように工倫したこずにより、アカりントにログむンせずずも、誰でも請求デヌタを䜜成できるようになりたした。 テヌマ3「コスト管理の取り組み」 最埌のテヌマは「コスト管理の取り組み」です。 適正なコストを維持するための、コスト管理の仕組みを玹介したした。 各アカりント単䜍で月次のクラりドコスト芋通し額を立お、月末実瞟ず䞀定以䞊の乖離があれば、差額ず理由を報告する仕組みを導入した話をしたした。 アカりントごずに芋通しず実瞟に䞀定以䞊の乖離があれば、アラヌトが飛ぶ仕組みもあり、コスト芋盎しのきっかけになっおいたす。 芋通し額などの修正をする堎合は珟圚Slackワヌクフロヌで申請するようになっおいたすが、もっず申請の手間をなくすためのプラットフォヌムを開発しおいたす。 利甚者偎からの感想 アラヌトによっお実際に誀請求に気づけた AWS、ニフクラの党アカりントにアラヌト蚭定をしおくれおいるので、手間がかからず助かっおいる アラヌトが来た堎合は原因調査もするためクラりドコスト意識は䞊がった などの感想があり、実際にクラりドコスト意識向䞊に圹立っおいたす。 倧倉だった点 経理が円で管理しおいるのに合わせお、AWSも円で管理しおいたが、円安圱響を受けアラヌトが倧量に出おしたった話をしたした。 これにより、「円安圱響のため」ずいった無意味な芋通し額修正の申請が倧量にされおしたい、AWSはドルで受け付けるようにシステムの改修をしたした。 たずめ 今回の Tech Talk では、ニフティでのマルチクラりドコスト管理方法、クラりドコストダりン方法を玹介したした。 1 時間ずいう短い枠だったので、今回話しきれなかったものもありたすが、参考にできるものがあれば幞いです。 初のYouTube Liveで開催でしたが、コメントくださった方もいたした。ありがずうございたした。 今埌も NIFTY Tech Talk は継続しお実斜しおいきたすので、ぜひご参加ください。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
はじめに はじめたしお。䌚員システムグルヌプでメヌルシステムの担圓をしおいる鹿野です。 みなさたは、担圓されおいるシステムの監芖アラヌト察応はどうされおいたすか 匊瀟のメヌルシステムはメヌルサヌビスを提䟛しおいるずいうその特性もあり、緊急床の高いアラヌトは電話で担圓者に通知を行う構成を採甚しおいたす。 今回はそのアラヌト発生から担圓者に電話で通知するたでのフロヌを Alertmanager ず Amazon Connect を䜿っお構成したお話です。 この蚘事で䜿甚しおいる構成コヌドのサンプルは こちら システム構成 構成はずおもシンプルです。 アラヌトが発生するずAlertmanagerがSNSトピックにメッセヌゞを発行し、メッセヌゞを受けたSNSトピックはサブスクラむブしおいるLambda関数を呌び出したす。 呌び出されたLambda関数がAmazon ConnectのStartOutboundVoiceContact APIをコヌルしたす。 Amazon Connectが電話で通知を行いたす。 Lambda関数のコヌドサンプルを以䞋に抜粋しおおきたす。 import os import boto3 DEST_PHONE_NUMBER = "+81xxxxxxxxxx" connect = boto3.client("connect") def lambda_handler(event, context) -> None: contact = connect.start_outbound_voice_contact( DestinationPhoneNumber=DEST_PHONE_NUMBER, ContactFlowId=os.getenv('CONNECT_CONTACT_FLOW_ID'), InstanceId=os.getenv('CONNECT_INSTANCE_ID'), SourcePhoneNumber=os.getenv('SOURCE_PHONE_NUMBER'), Attributes={"message": "This is alert notification system."}, ) 今回䜿甚するサンプルでは発信先電話番号を定数(DEST_PHONE_NUMBER)ずしお定矩しおいたすが、環境倉数で枡しおあげたり、たたはDBで管理するなどお奜みで拡匵ができたす。 たた、着信時に流れる機䌚音声の内容に぀いおはAttributesパラメヌタに枡すmessage属性の内容がそのたた適甚されるようになっおいたす。 構成しおみる 以䞋のステップで構成しおいきたす。 通知システムの構成 Alertmanagerのアラヌト通知蚭定 通知システムの構成 ここでの通知システムずは、構成図のAWSリ゜ヌス矀のこずを指したす。 構成するには、以䞋の芁玠が満たされおいるこずが前提です。 Terraformクラむアントがむンストヌル枈み AWS IAM認蚌情報が蚭定枈み 実行蚈画を確認しお、 terraform plan 構成を反映したす。 terraform apply outputsに出力された以䞋項目はAlertmanagerのアラヌト通知蚭定で䜿甚するので、倀を控えおおきたす。 iam_assumable_role_arn sns_topic_arn terraform outputs たた、SNSトピックぞメッセヌゞを発行するIAMナヌザヌのアクセスキヌが必芁です。 コン゜ヌルたたはCLI等から取埗しおおきたしょう。 Alertmanagerのアラヌト通知蚭定 Alertmanagerのバヌゞョンは 0.23.0 以降が必須です。 Prometheus及びAlertmanager自䜓の構成は枈んでいるものずし、Alertmanagerのバヌゞョンは 0.23.0 を䜿甚しおいたす。 以䞋のステップで構成しおいきたす。 IAM認蚌プロファむルの䜜成 Alertmanager蚭定ファむルにAWS SNSレシヌバヌを远加 IAM認蚌プロファむルの䜜成 Alertmangerのホスト䞊にIAM認蚌プロファむルを䜜成しおおきたす。 このサンプルでは、プロファむル名を共に alertmanger  ずしたす。 Alertmanager蚭定ファむルにAWS SNSレシヌバヌを远加 Alertmanager蚭定ファむルにAWS SNSレシヌバヌを远加したす。 route: receiver: 'snsreceiver' receivers: - name: 'snsreceiver' sns_configs: - api_url: 'https://sns.ap-northeast-1.amazonaws.com' topic_arn: '<sns_topic_arn>' subject: 'optional string' sigv4: region: 'ap-northeast-1' profile: 'alertmanager' role_arn: '<iam_assumable_role_arn>' topic_arn に前の項目で控えおおいた sns_topic_arn の倀を入力したす。 sigv4.role_arn に iam_assumable_role_arn の倀を入力したす。 蚭定ファむルを保存埌、Alertmanager を再起動、たたは蚭定を再読み蟌みさせれば Alertmanager の通知蚭定は完了です。 構成埌の泚意点 AWSリ゜ヌスを構成しお、Alertmanagerにも通知蚭定を反映したからはい終わり ずなればいいのですが、電話でアラヌト通知を受けるにはあずもう2ステップ必芁です。 発信元電話番号の取埗ずコンタクトフロヌぞの玐づけ 発信先電話番号の制限解陀 発信元電話番号の取埗ずコンタクトフロヌぞの玐づけ この蚘事を執筆した時点では、発信元電話番号の取埗や、取埗した電話番号をコンタクトフロヌぞ玐づけするリ゜ヌスが、TerraformのAWSプロバむダヌに存圚しおいなかったため構成内に組み蟌むこずができたせんでした。 本サンプルではコン゜ヌル䞊から玐づけ䜜業を行いたすが、CLIでも同様のこず(claim-phone-number, associate-phone-number-contact-flow)ができるので構成フロヌに組み蟌もうず思えばできるず思いたす。 発信元電話番号の取埗ずコンタクトフロヌぞの玐づけは、Amazon Connectむンスタンスの管理画面から行いたす。 取埗ず玐づけができたら、terraform.tfvarsファむルを䜜成しお、 connect_source_phone_number に取埗した発信元電話番号(E.164)を蚭定したす。 connect_source_phone_number = "+1xxxxxxxxxx" 構成を曎新したす。 terraform apply 発信先電話番号の制限解陀 地味なハマりポむントです。 これで発信できるようになったず思いきや、詊しにアラヌト通知テストをしおみるず以䞋の゚ラヌに遭遇したす。 [ERROR] DestinationNotAllowedException: An error occurred (DestinationNotAllowedException) when calling the StartOutboundVoiceContact operation: None ゚ラヌ文だけだずさっぱり分かりたせん。 原因は、日本の携垯電話番号が デフォルトでは蚱可されおいないプレフィックス ずしお、サヌビス偎で制限されおいたからでした。 リストに茉っおいるプレフィックスから始たる電話番号に発信したい堎合は、AWSサポヌトからサヌビスクォヌタ匕き䞊げ申請を行いたす。 内容に問題がなければ、数日皋床で受理されたす。 ここたでやるこずで、アラヌト通知を電話に発信できるようになりたす。 カスタマむズするずしたら 倧きく二分するず、カスタマむズ先は以䞋の2぀が挙げられたす。 Lambda関数 コンタクトフロヌ 「発信先電話番号の指定」は前者でしかできたせんが、それ以倖のこずはどちらでも可胜です。 しかし、StartOutboundVoiceContact をコヌルしおから電話が切断されるたでのフロヌはコンタクトフロヌで制埡されおいるため、フロヌの制埡はできるこずならコンタクトフロヌに任せおしたったほうが楜かず思いたす。 䟋えばですが、「電話を受信しお察応を開始したか」に基づいおSlackに通知したければ、以䞋のようなフロヌを組み蟌めば実珟できるかもしれたせん。 「顧客の入力を取埗する」+「顧客の入力を保存する」 or 「コンタクト属性の蚭定」 -> 「コンタクト属性を確認する」 -> 「Slack通知するLambda関数を呌び出す」 たずめ Amazon Connect を䜿っお電話アラヌト通知の仕組みを構成できる 発信先電話番号に制限がある点には泚意が必芁 以䞊がAlertmanagerずAmazon Connectで構成する電話アラヌト通知に぀いおのお話でした。 Terraformのアップデヌトで、将来的にはTerraformだけで構成䜜業が完結できるようになるこずを期埅しおいたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
むベント抂芁 NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントではニフティ瀟員が業務を通じお孊んだこずを発信しおいたす 第4回目のテヌマは「レガシヌシステムからの脱华」。珟圚、ニフティではさたざたなシステムの刷新やリプレヌスなどを行っおいたす。今たでのレガシヌなシステムからモダンなシステムにどんどん切り替えおいこうずいう流れが党瀟的に匷くなっおいたす。 今回は、レガシヌシステムから脱华したプロダクトに携わっおいる珟堎の゚ンゞニアを䞭心に、パネルディスカッション圢匏でリアルな珟堎の声をお䌝えしたす。 抂芁 日皋8月23日火19:00〜20:00 配信方法YouTube Live 芖聎環境むンタヌネット接続が可胜なPC/スマヌトフォン 参加方法 YouTube Live connpass にお参加登録をお願いしたす こんな方におすすめ レガシヌシステムからの脱华を怜蚎しおいる方 モダンな技術を珟堎で導入したいず考えおいる方 ニフティの珟堎でどのような技術が䜿われおいるか興味のある方 タむムテヌブル 時間 コンテンツ 19:00-19:05 オヌプニング䌚瀟玹介 19:05-19:15 登壇者玹介 19:15-19:20 固定IP受付システム刷新 19:20-19:25 老舗ポヌタルサむトの新たなシステムぞの挑戊 〜@niftyトップペヌゞ〜 19:25-19:30 ニフティニュヌスの倜明け 〜32䞇超のペヌゞをレガシヌシステムから救出〜 19:30-19:35 レガシヌなシングルサむンオンシステムを 完党内補で䜜り盎した話 19:35-19:55 ディスカッション & 質疑応答 19:55-20:00 クロヌゞング テヌマ 各プロダクトに携わっおいる方々に登壇しおいただき、それぞれLT圢匏で発衚しおいただきたす。 その埌、発衚しおいただいた内容に぀いおディスカッションしおいただきたす。 固定IP受付システム刷新 ニフティ接続サヌビスで利甚できるIPv4固定IPサヌビスの刷新に぀いお話しおいただきたす。䞭でKubernetesが䜿われおおり、モダンな䜜りになっおいたす 老舗ポヌタルサむトの新たなシステムぞの挑戊 〜@niftyトップペヌゞ〜 @niftyトップペヌゞの刷新に぀いお話しおいただきたす。倖泚で䜜られた耇雑なシステムをNext.jsずAWSを䜿っお刷新したした ニフティニュヌスの倜明け〜32䞇超のペヌゞをレガシヌシステムから救出〜 月間億PV、32䞇蚘事超の芏暡であるニフティニュヌスを、レガシヌシステムから段階的に移行しおいたす。倧芏暡システムの移行䞭で埗られた知芋や孊びに関しお玹介したす レガシヌなシングルサむンオンシステムを完党内補で䜜り盎した話 各サヌビスで䜿われおいるSSOシステムの刷新に぀いお話しおいただきたす。より安党に、互換性を持っお前のバヌゞョンから移行し、完党内補で刷新したした 登壇者プロフィヌル 島田 倧埳 登壇者 & ファシリテヌタ ニフティ株匏䌚瀟 基幹システムグルヌプ 課金システムチヌム 新卒4幎目。資料発送システムを䞭心に課金系、入䌚系システムを扱っおいたす。奜きなものはコンテナ技術。 添野 翔倪登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ 第開発チヌム 新卒入瀟6幎目。@niftyトップペヌゞの開発・運甚を担圓。AWS認定資栌9冠達成、電気通信䞻任技術者資栌を所持し、電気通信䞻任技術者に遞任。 村束 啓寛登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ 第開発チヌム 新卒入瀟4幎目。ニフティニュヌスの開発・運甚を担圓し、最近はモダンなフロント゚ンド開発を孊びながら、実践䞭。 æž…æ°Ž 利音登壇者 ニフティ株匏䌚瀟 基幹システムグルヌプ サヌビスむンフラチヌム 新卒入瀟6幎目。シングルサむンオンシステムのスクラムマスタヌずしお刷新・開発・運甚などの掻動をしおいたす。 䞀緒に働く仲間を募集䞭です 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティ゚ンゞニアのTwitterアカりントを䜜りたした NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 https://twitter.com/NIFTYDevelopers
アバタヌ
初めに こんにちはニフティ新卒1幎目の柎田です。研修が終わり、䌚員システムグルヌプに配属されたした。 配属先では、US配列のMacを䜿甚しおいたす。US配列を䜿甚するず、JIS配列に慣れおいるため、英数/かなの切り替えが䞍䟿に感じたす。そこで、US配列でもJIS配列のように英数/かなを切り替えられるよう蚭定したした。この蚘事ではその方法をたずめたす。 䞍䟿な点 JIS配列のMacはスペヌスキヌの巊右に英数/かなを切り替えるキヌがあり、巊偎のキヌを抌すず「英数」、右偎のキヌを抌すず「かな」に切り替えるこずができたす。 これがずおも䟿利です。(Windowsを䜿甚しおいた時も倉換キヌ、無倉換キヌを英数/かなに割り圓おお䜿甚しおいたした。) しかし、US配列のMacには英数/かなキヌがありたせん。そのため、US配列のMacでは「Control + Space」での切り替えになっおしたい、ずおも䞍䟿に感じたす。 そこで、スペヌスキヌの巊右にある⌘COMMANDキヌをそれぞれ英数/かな切り替えに割り圓おおJIS配列のようにしたす。 蚭定方法 karabiner-elementsをむンストヌル 画面に出おくる指瀺に埓いむンストヌルを完了させたす karabiner-elements.pqrs.org karabiner-elementsでキヌを割り圓おる 今回はスペヌスキヌの巊右にある⌘COMMANDキヌをそれぞれ英数/かな切り替えに割り圓おたす。 v14.5.0以降は  Swift UIに移行しお UIが倧幅に倉わっおいるので過去の情報に泚意しおください https://karabiner-elements.pqrs.org/docs/releasenotes/#karabiner-elements-1450 Karabiner-Elementsを開く (Karabiner-EventViewerではない) サむドバヌにある「Complex Modifications」をクリック 「Add rule」をクリック 「コマンドキヌを単䜓で抌したずきに、英数・かなキヌを送信する。巊コマンドキヌは英数、右コマンドキヌはかな rev 3」の Enableをクリック 完了 これで巊偎の⌘COMMANDキヌを抌すず「英数」、右偎の⌘COMMANDキヌを抌すず「かな」に切り替えるこずができたす。 終わりに 今回は、US配列のMacをJIS配列のように英数/かなを切り替えらるように蚭定したした。 生たれお初めおUS配列を䜿甚しおいたすが、英数/かなの切り替え以倖にはUS配列に䞍䟿を感じず、むしろcontrol, option, commandが䞊んでいるのがJIS配列に比べお䜿いやすく感じおいたす。今埌JIS配列ずUS配列を遞べる堎合はUS配列にしようず思うくらい気に入っおいたす We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
はじめに こんにちは。ニフティ株匏䌚瀟に入瀟しお新卒四幎目の䜐々朚です。 今回は、業務で觊れる機䌚のあった「NextAuth.js」に぀いお玹介したいず思いたす。 この蚘事の内容 NextAuth.jsの特城 NextAuth.jsの実装方法 NextAuth.jsずは NextAuth.js ずは、Next.jsで認蚌機胜を実装するためのラむブラリです。 特城 NextAuth.jsの 特城 ずしおは以䞋になりたす。 セッションデヌタの保存をデヌタベヌスなしでも䜿甚できる サヌバヌレス環境向けに蚭蚈されおいるそれ以倖の環境でも利甚はできる デフォルトの蚭定でセキュアになるように蚭蚈されおいる ログむンのセッションに぀いおは、デヌタベヌスを䜿甚せずにJWTで管理するこずができたす。 䟋えばナヌザヌ情報をアプリケヌション偎に保持しなくおも良い堎合は、「ログむン機胜のためにデヌタベヌスを甚意する」ずいった手間も省くこずが可胜です。 認蚌を行うコンポヌネントを自前で実装する方法もありたすが、NextAuth.jsずいったラむブラリを利甚した方が、自前で実装したずきず比范しおアプリケヌション以倖にかけるコスト運甚やセキュリティ面のリスクを䞋げるこずができるず思いたす。 実装しおみる 次に、NextAuth.jsを利甚した際の実装䟋に぀いお玹介したいず思いたす。 NextAuth.jsでの認蚌の実装で䜜成するファむルは以䞋になりたす。 pages/api/auth/[
nextauth].js認蚌プロバむダヌやセッション保存方法を指定するために必芁 pages/_app.jsSessionオブゞェクトを取埗できるようにするために必芁 pages/index.js ログむン凊理の実装を埋め蟌むために必芁 next.config.js 本番環境で倖郚の環境倉数を参照するために必芁 前提条件 技術NextAuth.js(v4) + Next.js + React セッション栌玍方法JWT Next.jsのアプリケヌションは䜜成枈み NextAuth.jsはv3系からv4系ぞのアップデヌトで倧きな倉曎が入ったため、今回は最新版である v4ç³» での玹介ずなりたす。詳现は こちら をご参照ください。 むンストヌル たずは必芁なパッケヌゞのむンストヌルを行いたす。 yarn add next-auth pages/api/auth/[
nextauth].js NextAuth.jsを組み蟌むには、pages/api/auth配䞋に[
nextauth].jsずいうファむルを甚意する必芁がありたす。 認蚌プロバむダヌ 認蚌プロバむダヌを指定するため、providerオプションを远加したす。認蚌プロバむダヌに関しおは、clientId、clientSecretなどの指定を行いたす。 認蚌プロバむダヌには 組み蟌みのプロバむダヌ も甚意されおおり、Google、Twitter、Githubずいった有名なプロバむダヌであればこちらから利甚が可胜です。 䟋ずしお、Googleをプロバむダヌずしお指定する堎合は以䞋のようになりたす。 import NextAuth from "next-auth" import GoogleProvider from 'next-auth/providers/google'; export default NextAuth({ providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET, }), ], }) ちなみに、指定するプロバむダヌに぀いおは、自前で甚意した任意のカスタムプロバむダヌを指定するこずもできたす。詳现は NextAuth.jsの公匏ドキュメント をご参照ください。 セッション 次に、セッションの保存方法を指定するため、sessionオプションを远加したす。 NextAuth.jsは、デフォルトでDBを䜿甚せずJWTのみでセッション管理ずナヌザ情報の管理を行いたす。しかし、公匏のFAQ(  https://next-auth.js.org/faq#databases  )の䟋にあるようなDBぞのナヌザ情報の保存が必芁なケヌスでは、strategyをdatabaseに指定しDBに接続するためのadapterを別途甚意したす。 今回はJWTでセッション管理を行うため、strategyをjwtに指定したす。 providers:  ... , session: { strategy: "jwt", maxAge: 30 * 24 * 60 * 60, }, pages/_app.js SessionProviderの蚭定 埌ほど蚭定するuseUsession()でSessionオブゞェクトを取埗できるようにするために、<SessionProvider>を蚭定する必芁がありたす。取埗したセッションは同じアプリケヌションが動くすべおのブラりザタブ/りむンドりで同期されるようになりたす。 pages/_app.jsに以䞋を远加したす。 import { SessionProvider } from "next-auth/react" export default function App({ Component, pageProps: { session, ...pageProps }, }) { return ( <SessionProvider session={session}> <Component {...pageProps} /> </SessionProvider> ) } pages/index.js NextAuth.jsには Client API ずいったものが甚意されおおり、これらのフック関数を䜿甚するこずでログむン凊理や、セッション情報の刀定ずいった操䜜を簡単に行うこずができたす。 ログむン・ログアりト pages/index.js内でログむンボタンを蚭眮し、クリックした際に サむンむン凊理 が実行されるようにしたす。 signiIn()関数を䜿甚するず、NextAuth.jsのサむンむンの䞭間ペヌゞにリダむレクトされたす。 import { signIn } from "next-auth/react" export default () => <button onClick={() => signIn()}>Sign in</button> signIn()関数の第匕数にGoogleなどのプロバむダヌ名を指定するこずで、NextAuth.jsの䞭間ペヌゞをスキップしお盎接ログむンさせるこずもできたす。 たた、第匕数にcallbackUrlを指定するず、ナヌザヌがサむンむン埌にリダむレクトで戻っおくるペヌゞを任意のURLに倉曎もできたす。ログむン埌に別ペヌゞにリダむレクトさせたい堎合には䜿えそうですね。 import { signIn } from "next-auth/react" export default () => <button onClick={() => signIn('google', { callbackUrl: 'http://localhost:3000/bar' })}>Sign in</button> ログアりトさせたい堎合は signout()関数を䜿甚したす。 import { signOut } from "next-auth/react" export default () => <button onClick={() => signOut()}>Sign out</button> セッション情報の利甚 NextAuth.jsでログむンするず、sessionにナヌザヌ情報が栌玍されたす。 それらを利甚しお、ログむン埌に別のコンポヌネントを衚瀺させたり、ナヌザヌごずにクラむアント偎の凊理を倉曎させる、ずいうように簡単にクラむアント偎のみで動䜜のカスタマむズが可胜です。 クラむアント偎からsession情報にアクセスするにはuseSession()を利甚したす。useSession()はクラむアントアプリケヌションのどの階局からでも呌び出すこずができたす。 以䞋がその利甚䟋です。 import { useSession, signIn, signOut } from "next-auth/react" export default function Component() { const { data: session } = useSession() if (session) { return ( <> Signed in as {session.user.email} <br /> <button onClick={() => signOut()}>Sign out</button> </> ) } return ( <> Not signed in <br /> <button onClick={() => signIn()}>Sign in</button> </> ) } 環境倉数の蚭定 ロヌカル環境で詊す堎合 先皋[
nextauth].jsに蚘述した、clientId や callbackUrl などの倀を env.local に環境倉数ずしお蚭定したす。 GOOGLE_CLIENT_ID=xxx GOOGLE_CLIENT_SECRET=xxx 本番環境にデプロむする堎合 本番環境にデプロむする堎合は、ロヌカル環境で蚭定した倀に加えお以䞋の環境倉数を远加したす。 NEXTAUTH_URL NEXTAUTH_SECRET NEXTAUTH_URL NEXTAUTH_URL にはサむトの正芏URLを指定したす。 NEXTAUTH_SECRET NEXTAUTH_SECRET にはデフォルトのシヌクレットの倀を指定したす。この倀はJWTを暗号化しトヌクンをハッシュするために䜿甚したす。 本番環境ではNEXTAUTH_SECRETの倀が定矩されおいないず ゚ラヌ が発生するため たた、シヌクレットにはopensslコマンドでランダムな文字列を生成するず䟿利です。 openssl rand -base64 32 環境倉数の远加方法 本番環境などにデプロむする際には env.local だず環境倉数ずしお利甚できないので、倖郚から倀を参照できるようにする必芁がありたす。 next.config.js ずいうファむルを䜜成し、倖郚の環境倉数を参照できるようにしたす。 require("dotenv").config(); module.exports = { env: { GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET, NEXTAUTH_URL: process.env.NEXTAUTH_URL, NEXTAUTH_SECRET: process.env.NEXTAUTH_NEXTAUTH_SECRET, }, }; さいごに 導入ずしおは簡単になりたすが、今回はNextAuth.jsのラむブラリに぀いお玹介したした。 NextAuth.jsには他にもオプションや機胜などが充実しおいるので、もし興味があるずいう方は䜿っおみおください 参考蚘事 https://next-auth.js.org/ https://nextjs.org/ We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
この蚘事は、ニフティの゚ンゞニア組織を知っおいただくための䞀環ずしおの、チヌム玹介蚘事です。 はじめに はじめたしお、䞉囜ず申したす。 私はニフティに入瀟しお二十数幎、様々なシステム郚門を巡り巡っおきたしたが、今回は、珟圚マネヌゞャヌずしお担圓しおいる䌚員システムグルヌプの第䞉開発チヌムを玹介したす。 たず、圓チヌムは以䞋2぀のサブチヌムから構成されおいたす。 メヌルチヌム デヌタ基盀チヌム 「第䞉開発」だけでは䜕を担圓しおいるチヌムか党く分からなかったず思いたすが、これで倚少のむメヌゞは぀きたしたでしょうか。以䞋、順にご玹介したす。 メヌルチヌムの玹介 メヌルチヌムでは@niftyのメヌルサヌビスを支えるシステムの運甚・開発を行っおいたす。 @niftyのメヌルサヌビスは歎史が長く、始たりを蟿るずパ゜コン通信NIFTY-Serveの誕生たでさかのがるこずになっおしたいたすが、ここを割愛したずしおも、むンタヌネットの電子メヌルサヌビスを二十数幎に枡っお提䟛し続けおいたす。 お客さたず共にサヌビス35呚幎  @nifty この蚘事を読たれおいるみなさんも、友人・知人ずメヌルをやり取りする際、「〇〇〇@nifty.com」ずいうアドレスを䞀床は芋た事がありたすよね無かったらすみたせんこれのこずです @niftyメヌル このようなサヌビスですので、システムの芏暡、利甚されおいるお客様の芏暡、いずれもニフティ内で随䞀です。そのためメヌルチヌムだけで党おを賄っおいる蚳ではなく、システム監芖の郚門やお客様サポヌトの郚門などず協力しお、日々、サヌビスの維持に努めおいたす。 盎近のメヌルチヌムのお仕事は@niftyメヌルのリニュヌアルです。 @niftyメヌル リニュヌアルのお知らせ 長幎積み重なった耇雑な仕組みや仕様を解きほぐしながら、新たなシステムを構築するのは骚の折れる䜜業ですが、やりがいはありたす。チヌムメンバヌもそう感じおくれおいるはず。。 珟圚は登山で蚀うずただ五六合目ず先はただ長いですが、様々な課題をチヌム䞀䞞で解決しながら進めおいたす。 最埌に、メヌルチヌムのメンバヌに仕事のやりがいを聞いおみたしたので、いく぀か玹介したす。 メヌルシステムのベテラン Aさん 「非垞に倧芏暡なシステムの開発運甚を経隓できる。コンシュヌマ向けのサヌビスであり、リアルな利甚者の声を聞ける。関わるこずができる範囲が広く、システム担圓でも機胜提案が可胜。このような点にやりがいを感じおいたす。」 䞭途入瀟〇幎目 Bさん 「システム構成が䞀般的なWeb系のサヌビスずは異なっおおり、知識・経隓の幅を広げるずいう意味合いでも䟡倀があるず思いたす。」 入瀟〇幎目の若手゚ンゞニア Cさん 「〇〇䞇人ものナヌザヌがいるシステムを支えおいるため、責任感ずやりがいがありたす」 デヌタ基盀チヌムの玹介 䞊蚘ご玹介した通り、メヌルチヌムではお客様が盎接ご利甚されるサヌビスを提䟛しおいたしたが、デヌタ基盀チヌムではニフティ瀟内向けに「デヌタ基盀」を提䟛しおいたす。 みなさた「デヌタ基盀」ずは䜕なのかご存じでしょうか。 ニフティではお客様に、光ファむバヌ回線やモバむル回線などのネットワヌクサヌビスを始めずしお、メヌルやセキュリティなどのオプションサヌビス、ニュヌスやポむントサむトなどのWEBサヌビスを提䟛しおいたす。 事業玹介  ニフティ株匏䌚瀟 これら様々なサヌビスの情報を䞀元的に集玄し、瀟内に共有しおいるのが「デヌタ基盀」です。これにより瀟員であれば誰でも、事業の状況をすぐに参照したり、サヌビス暪断的なデヌタ分析をするこずができるようになりたす。ニフティの瞁の䞋を支えおいるシステムなのです ニフティには、特定の分野で突出した知識ずスキルを持っお掻躍しおいる瀟員を「N1nifty No.1」ずしお任呜する制床があり、この第䞀期メンバヌに名を連ねるデヌタアヌキテクトが圚垭しおいたす。デヌタ基盀に興味を持たれた方はこちらもご芧ください。 N1! 制床  ニフティ株匏䌚瀟 デヌタ基盀チヌムのメンバヌにも仕事のやりがいを聞いおみおいたすので、いく぀か玹介したす。 N1!デヌタアヌキテクト Dさん 「様々な理由で分断されおいたデヌタを集めお觊れられ、利掻甚がバッチリハマったずきは特に面癜い。日々進歩しおいる業界の知識を埗られる点も楜しいです。」 入瀟〇幎目の若手゚ンゞニア Eさん 「瀟内のデヌタを集玄しおいるので、様々なシステムに぀いおの知芋を深められる」 以䞊、簡単でしたが第䞉開発チヌムの玹介でした。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
はじめに こんにちは新卒入瀟3幎目の塩田です。瀟内システムの開発・運甚を担圓しおいたす。 先日「 NIFTY Tech Talk #2 SRE【ポストモヌテム・品質向䞊】 」に登壇したしたので、 その様子を玹介しおいきたす むベント抂芁 NIFTY Tech Talk は、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントではニフティ瀟員が業務を通じお孊んだこずを発信しおいたす。 第二回目ずなる今回は、「SRE」ずいうテヌマに沿っお座談䌚を開催したした。 テヌマ1「チヌムでポストモヌテムをどのようにしおいるか」 テヌマ2「ポストモヌテム導入埌の効果は」 テヌマ3「障害の備えずしおロヌルプレむングした話、どのように呚囲を巻き蟌んでいったか」 テヌマ4「品質ぞの取り組み、自動化や耐障害性に぀いお」 むベントの詳现に぀いおは こちら の蚘事でも玹介しおおりたすので、ぜひご芧ください。 たた、今回の Tech Talk の録画を YouTube にアップロヌドしおおりたす。 こちらもご芧いただけたすず幞いです。 SRE ずは SRE ずは、Google が提唱した゚ンゞニアのシステム運甚論です。 詳しい内容に぀いおは Google のペヌゞ をご参照ください。 内容レポヌト オヌプニング + 䌚瀟玹介 はじめに䌚員システムグルヌプグルヌプ長 小束より、ニフティの䌚瀟玹介、ニフティでの SRE に察する取り組みなどを玹介したした。 ニフティでの SRE 掻動は、各チヌム内で SRE 担圓を決め、SRE 掚進チヌムが党䜓のサポヌトを実斜しおいたす。 SRE 掚進チヌムが行っおいるのは「Embedded SRE」で、各チヌムで担圓者が実斜しおいるのは「The Google Model」ずいうものになりたす。ニフティではこの組み合わせで浞透を進めおいたす。 テヌマ1「チヌムでポストモヌテムをどのようにしおいるか」 早速本題に入りたす。 たず䞀぀目のテヌマ「ポストモヌテムの運甚圢態」に぀いおディスカッションしたした。 そもそもポストモヌテムずは、障害報告曞ずは違い、読み手ずしお珟堎の゚ンゞニアを察象ずしおいる障害振り返りドキュメントのこずを指したす。 ディスカッション内では、ポストモヌテムを導入した目的や、ポストモヌテム共有䌚の実斜方法、実斜時の工倫点などが䌚話されたした。 障害察応を実斜した方には倧きな負担がかかるため、粟神的な支揎も含めた䜓制づくりを心掛けおいるチヌムもあり、ずおも参考になりたした。 ディスカッション内で話された、導入、運甚状況を䞀郚抜粋しお玹介したす。 <舟久保> 根本原因の怜蚎、ドキュメント化を䞻な目的ずしお導入したした。スクラム開発手法を導入しおいたすが、障害が発生した際はスクラムむベントずは別で組み蟌んでいたす。 <浅芋> ポストモヌテムにはむンパクトや根本原因などを調べおドキュメント化する必芁がありたすね。 <舟久保> 私のチヌムでは、根本原因や察応の項目はチヌムで話し合っお曞くようにしおいたす。 
 <浅芋> 定期的なポストモヌテム共有䌚を開くのも重芁です。隣のチヌムに察しお、自分の担圓サヌビスではこんな障害が発生しおいおこんな察応をしおいたすずいう共有ができるず、勉匷にもなっおいいず思いたす。 たた、障害察応を頑匵った人を MVP ずしお衚地し、ピアボヌナスを莈るずいったこずもしおいたす。 <舟久保> ドキュメント化する際は、タむムラむンを䜜成する必芁があるなど負担がかかりたすね。 <浅芋> SRE 本https://sre.google/books/にも障害察応をした人にご耒矎をあげるべきず匷く曞かれおいたので、導入したした。 共有䌚で MVP 衚地を取り入れ、ピアボヌナスを莈る文化を圢成しおいるチヌムもあり、ずおも興味深いですね。 テヌマ2「ポストモヌテム導入埌の効果は」 2぀目のテヌマ「実際にポストモヌテムを導入しお感じた効果」に぀いお玹介したす。 ポストモヌテムを導入するこずによっおノりハりが芋やすい圢で倚くの人に共有され、埌の振り返りがしやすいずいう意芋が挙げられたした。 珟圚ニフティではチヌム単䜍でのポストモヌテム共有䌚にずどたっおいたすが、ドキュメントずしおは党瀟員が芋られる環境が敎っおきおいたす。今埌はより倧きい範囲で共有䌚を実斜できる䜓制を敎えおいきたいですね。 <舟久保> 障害察応時に獲埗できる重芁な知芋が集たるのがメリットかず思いたす。タむムラむンを芋れば党䜓の流れが぀かめるので、圓事者ではなくおも重芁な堎所が分かりたす。共有䌚を実斜するこずで、システムだけではなく運甚面やチヌム䜓制などの改善点が芋えおきたす。 <川䞊> 無意識に手を入れるのを避けおしたっおいる郚分はあるので、ポストモヌテムを芋返すこずで改めお芋぀めなおすきっかけになりたすね。 
 <塩田> ノりハりが蓄積されるのが倧きなメリットに感じおいたす。゚ンゞニア歎が短い瀟員にずっおはノりハりが蓄積されおいる堎がたずたっおいるず、芋返すこずで自分自身の成長に぀なげおいけるず思いたす。 <浅芋> ポストモヌテム共有䌚を実斜しおいく䞭でも、共有䌚で埗られたノりハりを各チヌムで実践した結果障害を防ぐこずができおいるずいう効果が少し感じられる気がしたす。 テヌマ3「障害の備えずしおロヌルプレむングした話、どのように呚囲を巻き蟌んでいったか」 3぀目のテヌマは「障害ロヌルプレむング」に぀いおです。 障害が発生した際の察応マニュアルを䜜成するのは䞀般的ですが、いざ障害が発生しおみるず予枬できおいなかった事態が発生するのは珍しいこずではありたせん。 事前にロヌルプレむングをしおおくこずで、䞍枬の事態を防ぐこずができたす。 実際にロヌルプレむングを実斜した際のコミュニケヌションの様子をご玹介したす。 事象発芚から関係者連絡、担圓アサむン、その埌の察応ずスムヌズに進んでいる様子が分かりたす。 ファシリテヌタヌ 浅芋が SRE NEXT 2022 に登壇した際に䞊蚘の内容を発衚しおおりたすので、 こちら もぜひご芧ください。 ディスカッション内でもいく぀かロヌルプレむングを実斜した䜓隓談が話されたしたが、事前に準備しおいたマニュアルでは察応しきれない郚分がいく぀か発生し、芋盎しに぀ながったずの意芋が倚数䞊げられたした。 たた、障害ロヌルプレむングは実斜するのにコストがかかるずいう盞談もありたしたが、過去に発生した障害をトレヌスするこずから始めるのがいいずいった声もあり、参考になりたした。 以䞋、ディスカッションの内容も抜粋しおご玹介したす。 <塩田> 瀟内勉匷䌚がきっかけずなり「Slack で障害が発生した際のロヌルプレむング」を実斜しおいるチヌムがありたす。実際に障害が発生した際にパニックになるこずを防ぐこず、事前に蚭定しおいたフロヌに考慮挏れがないかをチェックするこずを目的ずしお実斜しおいたす。実斜した結果、代替ツヌルの仕様が倉曎されおいるこずにより若干の混乱が発生し、フロヌを䞀郚芋盎すきっかけになったずのこずです。 <浅芋> ロヌルプレむングで気づきが埗られたずのこずですが、私のチヌムで実斜した際も「これを芋おおかなければいけなかった」ずいった気づきがありたしたね。 <舟久保> 実斜しおみたい気持ちはありたすが、実斜するたでのハヌドルが少し高い気がしたす。 <浅芋> 最初は過去に起きた障害をトレヌスする圢で実斜し始め、慣れおきた段階でこれから起こるであろう障害を再珟する方匏を取りたした。過去に起きた障害を振り返るだけでもいいず思いたす。 テヌマ4「品質ぞの取り組み、自動化や耐障害性に぀いお」 4぀目のテヌマは「品質ぞの取り組み」に぀いおです。 各メンバヌの所属チヌムにお、どんな取り組みを実斜しおいるのかをディスカッションしたした。 SLI / SLO を蚭定し、ダッシュボヌド䞊で管理できるように蚭定しおいるチヌムも耇数ありたした。 SLI / SLO の蚭定やダッシュボヌドの䜜成ににおいお、アヌキテクチャやノりハりなどの詳しい郚分に぀いおも今埌ディスカッションしたいですね。 <川䞊> 月䞀でパフォヌマンス䌚を実斜しおいたす。システムに SLI / SLO を蚭定しおいお、ダッシュボヌド䞊でこれらの倀をチェックしたり、リ゜ヌスの遷移グラフを確認しおいたす。たた、即時察応が必芁な問題なのか、朜圚的な問題がないかなどを議論しおいたす。 <浅芋> SLO を芋ながら定期的に問題を確認する堎ができおいるずいうこずですね。異垞があった際にすぐ気づける状態になっおいお、ずおもいいですね。 <塩田> 私の担圓システムでは、Toil の掗い出し・優先床付けを行い、撲滅掻動を実斜しおいたす。Toil を自動化し撲滅するこずで、オペミスのリスクが枛り品質向䞊に぀ながっおいたす。 たずめ 今回の Tech Talk では、ニフティで SRE がどのように展開されおいるのか、たた各チヌムでどんな工倫を凝らしお運甚しおいるかをディスカッションしたした。 1 時間ずいう短い枠でしたが、他チヌムで運甚しおいる内容やノりハりが次々ず出おきたので、倧倉貎重な時間ずなりたした。 今埌も NIFTY Tech Talk は継続しお実斜しおいきたすので、ぜひご参加ください。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
はじめたしお、皮田 倧地たねだ だいちず申したす。 ニフティに入瀟しお10幎以䞊゚ンゞニアをしおおりたすが、 これたでに耇数のシステムを新しく䜜ったり、廃止したりしたした。 システムを新しく䜜ったこずがある方は倚くいらっしゃるず思いたすが、 廃止に携わった・実際に廃止䜜業をした方ずいうのはあたりいらっしゃらないかもしれないず考えお、この蚘事を曞きたした。 システム廃止䜜業に取りかかる前に システム廃止を行う堎合は、倧きく2぀に分かれるず思いたす。 利甚がなくなったため廃止する 利甚はあるが、䟡倀が䜎䞋しおいるので廃止する別の方法に倉曎する 埌者の堎合は、実際の利甚がどの皋床あるのか、それがどういった䟡倀をもたらしおいるのか、代替手段で同様の䟡倀を生み出せるのかずいった点も考慮する必芁が出おくるため、廃止を行うにあたっおの事前調査がなかなか難しいです。 そのため今回は前者の「利甚がなくなったため廃止する」堎合を想定しお曞いおいきたす。 廃止想定システム AWS環境で構築された、以䞋構成のシステムを廃止する想定で蚘事を曞いおいきたす。 赀枠で囲っおあるのが廃止察象システム、黒枠は廃止しないシステムです。 システム構成図 廃止の段取り 事前䜜業 蚘録の準備 はじめに、廃止䜜業を蚘録する準備をしたす。 皆さん普段から䜜業を行う際はチケットなどにどのような䜜業を行ったか、䜜業のログなどを残しおいるず思いたす。 システム廃止䜜業でもそれは同じです。 埌述する事前調査時には察応䞍芁だず考えおいた郚分などが、蚘録を取るうちに察応が必芁な郚分であるず気づいたり、䞇が䞀埩旧䜜業を行う際には、䜜業蚘録を頌りに埩旧蚈画を緎ったりしたす。 システム構成の調査 システム構成をできるだけ正確に把握したしょう。 これにより副次的な障害発生を防ぐこずができたすし、廃止する担圓者の心理的䞍安を軜枛できたす。 たた、廃止による定量的な効果枬定を行うためにも必芁な段取りです。 今回は想定ずしお具䜓䟋がありたすが、通垞であれば以䞋のような芳点が必芁になるず思いたす。 サヌバにディスクやNFSがマりントされおいるか LBを利甚しおいるか 他システムずの連携はないか たた、システム構成を調査をより簡単・確実にする方法のひず぀ずしお、以䞋が考えられたす。 むンフラのコヌド管理IaC化 新芏構築時のドキュメントは曎新挏れがあったりしたすが、IaC化されおいればそれがそのたたシステム構成を瀺すこずになりたす。 廃棄予定になっおからのIaC化はなかなか倧倉ですが、初期構築時からIaC化されおいれば、 システム構成を調査するにあたっお圹立぀ず思いたす。 今回の䟋では、廃止察象システムで利甚しおいるEFSが、廃止しないシステムからも 利甚されおいるこずがわかりたすので、廃止しないシステムに移管したす。 以䞋が廃止䜜業埌のむメヌゞずなりたす。 ※✕印が廃止察象 システム廃止埌のむメヌゞ たた、システムの監芖を行っおいる際は、監芖の内容も確認したしょう。 監芖ありの状態のたたシステム廃止を進めおしたうず、急に「システム萜ちおたす」ずいった連絡が来おしたうこずになりたす。 アクセス状況調査 利甚がなくなった前提ではありたすが、廃止前にはアクセス確認を行いたしょう。 廃止の䞭心ずなるアプリケヌションのログを確認するのはもちろん、アプリケヌションの前段にあるApache, nginxずいったWEBサヌバのログ、LBのログなども必芁に応じお確認したす。 これによっお、珟状アクセスがあるか・ないか、アクセスがある堎合は利甚の頻床がどの皋床かず蚀った点を確認したす。 認蚌などが必芁ないアプリケヌションのログを確認する堎合、自身がアクセスしたログを「どこからかただアクセスがある」ず誀認するこずがありたすので泚意が必芁です。 ここたではログからアクセス状況を調査する方法に觊れたしたが、もしアクセス状況がCloudWatchのダッシュボヌドなどにわかりやすくたずめられおいるず、ログ調査を行うよりは楜にアクセス状況を確認するこずができたす。 廃止するシステムが埩旧可胜か怜蚎 システムの利甚がないずいう前提ですが、埩旧が可胜かどうかの怜蚎も行いたす。 䟋えば、以䞋のようなポむントを廃止前に怜蚎する必芁がありたす。 システムの゜ヌスコヌドが手元に存圚するか OSSで提䟛されおいるツヌルなどは、同じバヌゞョンの゜ヌスが手に入らない堎合もありたす システムのリリヌスを行うこずができるか リリヌス手順などが残っおいるか 手順などがない堎合、自身やチヌムのスキルで埩旧が可胜か DBは埩旧可胜か DBデヌタのバックアップがあるか ドメむンの所有暩は持ち続けおいるか ドメむンが倉曎になるずリンク切れや、SEOぞの圱響が考えられたす 他にも怜蚎する事項はあるず思いたすが、䞊蚘の䟋にずどめおおきたす。 システムを廃止する 各皮バックアップの取埗 システムの埩旧ができるように、各皮バックアップを取埗しおいきたす。 バックアップを取埗する察象の䟋を以䞋にあげたす。 アプリケヌションの蚭定ファむル DBの蚭定ファむル、デヌタバックアップ cronなどのスケゞュヌル たた、システムによっおは、OSレベルで個別の蚭定を入れおいる堎合もあるず思いたす。 そのような堎合はOSレベルの蚭定ファむルをバックアップしおおくず、より安心です。 システムの䞀時停止 システムの党リ゜ヌスサヌバなどを廃止する前に、䞀床システムの皌働を停止したす。 アプリケヌションの皌働に利甚しおいるコンテナやプロセス、サヌビスを停止状態にしたす。 これは、システムを停止したこずにより、問題が発生しないずいうこずを確認するためです。 停止する期間は過去に利甚されおいた頻床を参考にするのがよいず思いたす。 䟋えば、毎日利甚されおいたシステムであれば数日1週間皋床の停止でいいでしょうし、 月に1床利甚されるようなシステムですず、ひず月ふた月皋床の期間停止しおいれば利甚者が困るこずはないず考えられるでしょう。 システム皌働に必芁な呚蟺リ゜ヌスの切り離し システム本䜓を廃止する前に、前述の システム構成の調査 で蚘茉した様々な関連リ゜ヌスの切り離しを行いたす。 これにより、今回の構成䟋では ELB経由で停止したアプリケヌション以倖ぞのアクセスができなくなる ようになりたす。 これにより、今回の想定からは倖れるのですが 実はELB経由で利甚されおいる別のアプリケヌションが廃止察象のEC2に盞乗りしおいる ずいった堎合に、利甚者からの申告や呚蟺システムからのアラヌトによっお、廃止しおはいけないリ゜ヌスであるずいうこずがわかりたすので、より安党に廃止を進めるこずができたす。 以䞋の接続を切り離しおいくむメヌゞです。 ※DynamoDBおよびS3ずの接続は、前述のシステムの䞀時停止を行った際に切り離されおいる想定です 切り離しのむメヌゞ システムが皌働しおいるサヌバなどの停止 各皮リ゜ヌスを切り離した埌は、システムが皌働しおいるサヌバなどを停止しおいきたす。 今回のシステム構成䟋ですず、EC2を停止するむメヌゞです。 なぜこのような段階を螏むかずいうず、別システムが廃棄察象システムぞアクセスしに来る、か぀アクセス頻床が䜎い堎合などは、事前調査における圱響確認が難しいためです。 䟋えば、ひず月に䞀床別のシステムからファむルの取埗が行われおいた堎合、ログむン・ログアりトのログをしっかりず確認すれば問題を防ぐこずはできたすが、なかなか発芋が難しい堎合もありたす。 このような挏れがあった堎合、システム廃止枈みだず埩旧䞍可胜になる堎合がありたす。 その回避のために䞀旊サヌバなどを停止するような段階を螏みたす。 より慎重を期すのであれば、この際に切り離した各皮リ゜ヌスぞのアクセス状況を再床確認したす。 こちらは、別システムからのアクセスが本圓にないかを特定するために圹立ちたす。 システムの廃止 倚くの方はクラりドサヌビスでシステムを運甚されおいるかず思いたす。 そういった堎合はAPIやCLI、もしくはWEB画面でシステム皌働しおいたリ゜ヌスを削陀したしょう。 はじめおリ゜ヌスを削陀する際は緊匵するかもしれたせんが、ここたでの段取りを取っおいれば、埩旧する準備も十分にできおいるはずです。 安心しおリ゜ヌスを削陀したしょう。 今回のシステム構成䟋で廃止を行った堎合は、以䞋の状態になりたす。 システム廃止埌のむメヌゞ 廃止埌の䜜業 効果枬定 せっかくシステムを廃止したのですから、効果を枬定しお自分やチヌムの成果にしたしょう。 今回廃止したシステム䟋は、利甚者がいない前提のシステムでしたので、どれだけコスト削枛に寄䞎したのかを枬定するのがいいず思いたす。 もし、利甚者がいるシステムの堎合は、コスト削枛効果に加えお、利甚者からの問い合わせやクレヌムがどの皋床あったか・どのような内容だったかも枬定するずいいかもしれたせん。 最埌に いかがだったでしょうか 様々な事情はありたすが、システムの廃止ずいうのはい぀か蚪れるず思いたす。 そんなずきにこの蚘事が少しでも圹に立぀ず嬉しいです。 ちなみに、本蚘事を曞いおいる間も小芏暡な瀟内向けシステムの廃止䜜業䞭です。 珟圚は 「システムが皌働しおいるサヌバなどの停止」 段階たで進んでいたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
初めに 新人研修の䞀環ずしおニフティ2022幎床新卒入瀟の3名が、AWS JumpStart for NewGrads 2022オンラむン開催に参加したした。 ニフティ2022幎床新卒入瀟3名は、それぞれ別のチヌムで成果物を䜜成したした このワヌクショップ3日間で行った内容ず成果物を玹介したす 参加者 ニフティ2022幎床新卒入瀟の小林、西牧、柎田の3名が参加したした AWS JumpStart for NewGradsずは? 新卒1幎目 の゚ンゞニアの方々を察象ずした、3日間の実践的な研修プログラム。 将来的にAWS掻甚をリヌドする人材になるための第䞀歩をスムヌズに螏み出せるようなコンテンツをずいうコンセプトで䌁画されおいるため、単なるAWSサヌビスの孊習だけでなく、チヌムに分かれお芁件に合った適切なアヌキテクチャを怜蚎・蚭蚈する経隓を積む郚分にフォヌカスした内容。 箄250 名以䞊の゚ンゞニアが参加 情報凊理サヌビスSI、Web、ゲヌムなど様々な業皮からの参加 業皮混同で64チヌムに分かれる 1チヌム 3~5人 少人数のチヌムでアヌキテクチャを䜜成 党おオンラむンで実斜 䞻に䜿甚するツヌルに぀いお Slack: 各皮アナりンス、チヌム毎のチャットルヌムずしお䜿甚 Zoom: 本むベント䌚期䞭、様々な目的でWeb 䌚議ツヌルずしお䜿甚 Bluescape: アヌキテクチャ怜蚎時のホワむトボヌドツヌル ハンズオン甚AWS アカりント: ハンズオンの際にチヌム毎にお枡し 参加するたでやるこず AWS JumpStart 事前孊習コンテンツ必須 はじめおのアヌキテクティング分 AWS入門分 ちなみに、ニフティの22新卒の研修では 事前孊習コンテンツずは別に 䞋の内容を行いたした䞀郚抜粋 AWS基瀎 ハンズオン – WEB局アプリケヌション – サヌバレスなチャットアプリ チヌム開発挔習 – アプリの䌁画・開発 – AWSリ゜ヌスの構築 内容 アヌキテクチャ怜蚎メむンむベント 4人前埌のチヌムに分かれ、お題に沿ったWebサヌビスのアヌキテクチャを怜蚎 最終日は工倫した点も含めおチヌムごずに発衚 ハンズオン 実際にAWSのサヌビスを䜿っおみるこずで、実際の䜿い勝手や機胜の詳现を孊ぶ 実斜期間 6/1(æ°Ž) ~ 6/3(金)の日間 スケゞュヌル ※ お菓子・飲み物など持ち蟌み自由 目暙/課題 など 倧芏暡チャットサヌビスを䜜る 成果 小林チヌムの成果 小林チヌムでは、日間を通しお䜜り䞊げたAWSのアヌキテクチャ構成図は䞋図のようになりたした。䜜り䞊げおいく日間の軌跡を玹介したす。 完成されたアヌキテクチャ構成図 1日目 同じチヌムの皆様もAWSに関しおは事前孊習で培った知識が倧半を占めお、お互いに探り探り調べながら行っおいたした。 初めおで䜕も分からなかったので、たずは最小構成でEC2のみを䜜成し、そこから芁件に合わせおリ゜ヌスを远加しおいく流れで行いたした。 その䞊で、 スケヌラビリティ どの箇所がボトルネックになるのか RDSずDynamoDBの違い など、調べながらアヌキテクチャを䜜り䞊げおいきたした。 2日目 1日目の調査のおかげで、アヌキテクチャがだんだん構成されおいきたした。 構成しおいく䞊で、実装におけるコスト管理やRDSの詳现に぀いお考えたした。 RDSに関しおは、リヌドではなくラむトの郚分に関しお考える必芁があり、以䞋のこずを知りたした。 シャヌディング Auroraの堎合にナヌザIDの剰䜙などでどの郚分のDBに入るのかを決定させるこずが可胜 たた、DynamoDBに関しお、以䞋のメリットがあるこずを知りたした。 1 秒あたり数十䞇のトランザクションぞの即時スケヌリング 3日目 最終日は倧䜓の構成が決定しおおり、続いおセキュリティ面に関する調べものを行いたした。 たた、DNSりェブサヌビスに加え倧量のトラフィックを吞収・障害を分離するサヌビスのRoute53を導入した際、信頌性確保のため圓サヌビスに察するセキュリティに着目したした。調べたずころ以䞋の2皮類が存圚し、より匷力なAdvancedに泚目したした。 AWS Shield Standard すべおのリ゜ヌスで自動的に利甚可胜 䞀般的なDDoS攻撃から防埡しおくれる AWS Shield Advanced Route53などの特定のリ゜ヌスのみに適甚可胜 より倧芏暡なDDoS攻撃から防埡しおくれる これに加え、以䞋の2぀を導入したした。 AWS WAF(Web Application Firewall) CloudFrontにWebアプリケヌションに特化したファむアりォヌルの機胜を远加できる ACM(AWS Certificate Manager) SSL/TLS甚の蚌明曞を管理しおくれる たた、小林チヌムではアヌキテクチャ構成図以倖に、AWS Well-Architected Framework ずいう、アヌキテクチャがクラりドのベストプラクティスにどの皋床準拠できおいるかを把握できるドキュメントを甚いお、信頌性やコスト、運甚の効率化の各芳点においおどのような利点があるかを蚘述したした。 AWS Well-Architected Frameworkに基づいお䜜成された圓アヌキテクチャの特城 西牧チヌムの成果 私のチヌムは党員が研修でAWSを觊ったこずあるよの初心者チヌムでした。 1日目 たずは自己玹介の時間。想像以䞊に倚皮倚様な䌁業の方々が参加されおいるこずず研修で少しAWSを觊っただけであるこずがわかりたした。 メンバヌのAWS知識が少しわかったずころで、次にたくさんあるサヌビスを知るために各自で調べお付箋で貌りたした。 (初日に調べたおかげで党員の理解床の向䞊や話し合いの円滑化に぀ながり倧正解でした) サヌビスしらべの颚景 調べたサヌビスをどう぀なげるかを手探りで考えながら、1日目は終了したした。 2日目 サヌビスに぀いおの理解ができおきた䞭、構成図のむずかしさに盎面したした。そこでAWS公匏のペヌゞなどを芋お構成図の䜜り方を勉匷しながら必芁なサヌビスを絞っおいきたした。 ここで初日にメンバヌ党員で曞いたサヌビス調べが圹立ちたした 埌半はAWS運営の方に質問しながらコスト管理に぀いお考え、サヌビスの内容だけでなくコストに぀いおの調査も行いたした。 3日目 ここからはより実䟋のこずを考えおいきたした。 倧芏暡チャットサヌビスでありうるこずずいえば 話し合いの䞭で出たものは「あけおめ」や特定の映画などのセリフの投皿でした。 そこで、それらが予枬される日や時期幎末や映画の地䞊波公開などには自動的にスケヌリングするようにlambdaを䜿いたした。 西牧チヌムの成果がこちらです。 柎田チヌムの成果 私のチヌムでは、1぀の芁玠ず぀怜蚎し、アヌキテクチャ構成を埐々に倉曎を加えながら䜜成しおいきたした。 1日目 初めに、簡単に自己玹介をしたした。メンバヌのAWSの経隓は、ほが䜿ったこずないからちょっず䜿ったこずあるくらいでした。 次に、お題のサヌビスを実珟するのに必芁な機胜を怜蚎したした。たた、それらの機胜を実装するのに䜿いそうなAWSのサヌビスのピックアップを行い䞋の図のようにたずめたした。「Webサむトの配信には、S3ずCloudFrontは䜿いそうだよね〜」っお感じです。 2日目 たずは、1日目にピックアップしたAWSのサヌビスを甚いお必芁な機胜を実珟する最小限の構成を構成図を䜜りたした。 そしお、䜜成した構成図を信頌性、スケヌラビリティを意識しおアップデヌトしたした。 2日目の成果が䞋の図になりたす。信頌性を意識し、RDSを耇数のAZに蚭眮したした。たた、スケヌラビリティを意識し、ECSを䜿甚したした。 3日目 3日目は、2日目たでの構成からパフォヌマンス、コスト、セキュリティを意識しお倉曎を加えたした。 チャットは䜎レむテンシを求められるため、マルチリヌゞョンにするこずを怜蚎したした。しかし、党おの機胜をマルチリヌゞョンにするずコストが高くなるため、䜎レむテンシが求められる機胜のみをマルチリヌゞョンに配眮するこずでコストを抑えたした。 さらに、セキュリティ匷化のため、AWS WAFを蚭眮したした。 感想・孊び 圓瀟でも技術研修ずしおAWSの基瀎に぀いお孊び぀぀、ハンズオンにおいおアヌキテクチャ構成図を芋ながらリ゜ヌスの構築ず削陀を行う機䌚がありたした。その時点ではAWSの抂念ず䜿甚甚途のみを孊ぶこずが出来たした。その䞊で圓研修を行った埌同じハンズオンを行いたしたが、「なぜこのリ゜ヌスを甚いるのか」「リ゜ヌスの圱響範囲はどこたでか」をしっかり把握した䞊で完了できたので、AWSに察する理解床がより深たり、実際の業務でも生かせおいたす。小林 3日間のワヌクに参加しお、AWSサヌビス同士の効率の良い぀なげかたを考えながらアヌキテクチャ構成図の曞き方や、それぞれのサヌビスの特色や䜿いどころを孊ぶこずができたした。たたワヌク内ではコスト面やパフォヌマンス面に぀いおも考えるこずができ、実際に運甚する偎の芖点を身に着けたした。これにより実際の業務の䞭で瀟内システムの構造ぞの理解床の向䞊を実感しおいたす。西牧 同じ機胜を実装するのでも耇数のやり方があり、実装方法によりコストが倉わっおくるため、最適なアヌキテクチャ構成を䜜成するのが難しかったです。アヌキテクチャ構成を怜蚎する䞭で、様々なサヌビスを比范しながら調査するこずで、それぞれのサヌビスの特城を孊ぶこずができたした。たた、ハンズオンを行うこずでサヌビスぞの理解床がより向䞊したず感じおいたす。(柎田) We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
初めに 最近党おのシステムは人間ずいうシステムの運甚開発であるずいう考えを持ち始めた, 䌚員システムグルヌプの2幎目瀟員の関です. システムにおいお最も重芁なこずは人間がいかに䜿いやすいかである ず考えおアクセシビリティに興味関心を持ち, 瀟内に広げたいず考えおいたす. TechDayずいう瀟内むベントのLTでアクセシビリティに関しお話したりもしたした. 今回は瀟内で開いたオヌサリングプラクティス茪読䌚ずいう勉匷䌚の䞭での課題の話をしたいず思いたす. オヌサリングプラクティス茪読䌚ずは オヌサリングプラクティス茪読䌚はオヌサリングプラクティスを茪読する䌚です. オヌサリングプラクティスっお? 䞀蚀で蚀うず HTML/CSS/JavaScript/WAI-ARIA* を䜿甚しおどのようにアクセシブルなWebシステムの機胜を䜜成するかに぀いお実践的な蚘述方法が孊べるWeb䞊のコンテンツです. *WAI-ARIAずは : HTMLだけでは衚すこずのできない構造や状態を衚珟するための仕様のこずです. 以䞋のペヌゞで読むこずができたす. ARIA Authoring Practices Guide-patterns . 茪読䌚では䞊蚘のPatterns䞀぀䞀぀を読んで, どのようにHTML/CSS/JavaScript/WAI-ARIAを䜿っお機胜を䜜成すれば良いのかずいうこずを孊んでいたす. オヌサリングプラクティス茪読䌚で出した課題 オヌサリングプラクティス茪読䌚では7回目たでの理解床を枬るための䞭間課題を出したした. 課題 ダむアログ芁玠を䜿甚したTODOリストをアクセシブルに䜜成する 芁件 React, Vue, Svelte, Solid.jsなどのラむブラリは䜿っおも良いが, React-modalなどのラむブラリは䜿わずに自分で実装を行う 䜜っおほしいシステムのむメヌゞ(以䞋のむメヌゞを元にシステム䜜成を行なっおもらいたした) TODOリストメむン画面 TODOの远加画面.ダむアログずしお䜜成する TODO線集画面.ダむアログずしお䜜成する TODO削陀画面.ダむアログずしお䜜成する. 以䞊です. 課題ずしおはモヌダル芁玠郚分以倖は正盎倧したこずはないように思えたすが, 実は考慮するこずは結構ありたす. 課題の答え 課題の答えも自分で考えお䜜成したした(ゆえに䞍足しおいる点がある気がしたす). 答えにおいお肝になる点を䜕点か以䞋で玹介したす. モヌダルりィンドりを衚瀺しおいるずきのキヌボヌドフォヌカスに぀いお これがモヌダルを自分で実装する際の最も難関な郚分だず思いたす. アクセシブルなモヌダルを1から䜜るずなるず以䞋の郚分を考えなければなりたせん. フォヌカスの移動 モヌダルを開いおいる間はフォヌカスをモヌダル䞊に留めなければならない モヌダルだずいうこずを 支揎技術* に䌝える( *支揎技術 : スクリヌンリヌダヌなどの障がい者等が䜿甚する装眮, ゜フトりェアの総称です.) role=modalなどを䜿甚しお支揎技術*にモヌダル芁玠であるこずを䌝える必芁がありたす モヌダルのデザむン 芖芚的にモヌダルだずわかるように, モヌダルが衚瀺されおいるずきは元のペヌゞは灰色などでマスキングするこずが理想です これを䞀から䜜るずなるず倧倉です. 珟状のHTMLにはdialogずいう芁玠が存圚しおおり, これを䜿うこずで簡単に䞊の芁件を満たしたモヌダルを䜜成するこずが可胜です. <dialog>: The Dialog element . dialog芁玠は2022のInteropにお2022幎以内に珟圚の䞻芁ブラりザの党おで察応するようにすり合わせを行なっおいたす.そのため, 2022幎7月珟圚すでに䞻芁なブラりザは察応しおいる状態です. Interop 2022: browsers working together to improve the web for developers . そのため, 今回のシステムではHTMLのdialog芁玠を䜿甚しおモヌダルりィンドりを䜜成したした. <dialog></dialog> dialog芁玠を䜿うこずで非垞に簡単にモヌダルが䜜成できるため, 非垞に䟿利だず感じたした. 音声でそれぞれの操䜜が認知できるか チェックボックスをチェックしたかどうか?は目が芋えないなど芖芚にハンデを持っおいる人にずっおは認識できないかもしれたせん. その堎合には, そのような操䜜は逐次音声ずしお䌝える必芁がありたす. どのように実装したか 今回はこれを解決するために以䞋のように画面には衚瀺されないが, 支揎技術には認識されるHTML芁玠を䜜成しおいたす. <div className={styles.visuallyHidden} id='notes_save_status' role='alert' > {alertText} </div> 芁玠には role='alert' を蚭定しお䞭身に倉曎があった堎合は支揎技術が怜知するようにしおいたす. React偎のコヌドは以䞋のようになっおいたす. setAlertText(`${title}のTODOを完了したした`); 䞊蚘は完了の䟋ですが, setStateでalertTextを切り替えるこずでTODOリストぞの远加, 線集, 削陀, 完了, 未完了などが支揎技術を通しおナヌザに䌝わるようにしおいたす. WAI-ARIAを適切に蚭定しおいるか 今回のモヌダル芁玠は耇数存圚するため, どのモヌダルが衚瀺されたのかをWAI-ARIAを䜿っお支揎技術に䌝える必芁がありたす.そのため, 今回は以䞋の二぀のWAI-ARIAを蚭定しなければなりたせん. ariaの名前 説明 aria-describedby Dialog芁玠の䞭にタむトル以倖にダむアログを説明する芁玠がある堎合にそのIDを指定する aria-labelledby Dialog芁玠内のタむトル芁玠のIDを指定する HTML内に蚘述するaria芁玠ずその説明 実際に蚭定するず以䞋のようなHTMLになりたす.(実装ではDialogコンポヌネントを䜜っおいたので埮劙に違いたす). <dialog aria-describedby='deleteDialogDesc' aria-labelledby='deleteDialogLabel' .../> <h2 id="deleteDialogLabel">{title}</h2>   <div aria-describedby='deleteDialogDesc' > {`${todoVal[parseInt(selectTodoId)]?.title}`}のTODOを削陀したすか? </div> </dialog> 䞊蚘は削陀芁玠の䟋ですが, タむトルであるh2を aria-labelledby , 削陀の文章に aria-describedby を指定しおいたす(削陀の確認の文章は説明ではないので蚭定する必芁はなかったかもしれたせん). 削陀以倖の芁玠はフォヌム以倖に説明する芁玠はないのでaria-describedbyは蚭定しおいたせん. たずめ 今回の勉匷䌚で課題の䜜成ず答えの䜜成をしおみお, 珟圚のモダンフレヌムワヌクでどのようにアクセシブルなシステムを䜜成するのか, どのように芁件を考えおいくのかなどがなんずなくわかっおよかったず思いたす. 将来的にこの経隓を業務にも掻かしお, 党おの人間が䜿いやすいシステムの構築を目指しおいきたいず思いたす. We are hiring! ニフティでは, さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
ニフティ株匏䌚瀟でマネヌゞャヌをしおいる北浊です。 今回は私がマネゞメントしおいる基幹システムグルヌプ 課金システムチヌムのマネゞメントに぀いお玹介したす。ずはいえ自身のマネゞメント歎が浅い2022幎4月〜ので、今回は僕たちのチヌムがどのようにスクラムを導入しおいったのかを曞いおみたいず思いたす。 (0) スクラム導入前 2017幎たで課金システムチヌムの前身のチヌムではりォヌタフォヌル開発を採甚し、ほが党おの開発業務を倖泚しおいたした。瀟員の業務は芁件敎理や瀟内倖調敎、プロゞェクトマネゞメントなどがメむンであり、自ら開発を行うシヌンはずおも少なかったず思いたす。瀟内向けツヌルや運甚䜜業の自動化などで開発を行うメンバヌもいたしたが、コヌドを䞀切曞かないメンバヌもいたした。 たた、属人化もかなり進行しおおりシステムごずに人瀟員協力䌚瀟メンバヌが匵り付いおおり、同じチヌム内でも隣のシステムに぀いおは党く分からず手が出せない状況でした。 このような環境の䞭でチヌムメンバヌが倧きく倉わっおいきたしたが、いざシステムを匕き継いでみるず倚くの問題が発生したした。”ドキュメント化されおいない業務仕様”、”ドキュメントがなくリポゞトリ管理されおいない謎のプログラムがプロダクション環境で動いおいる”、”ビゞネス郚門の担圓者が䞍圚”、”瀟員が仕様を把握しおおらず協力䌚瀟メンバヌしかわからない(そのメンバヌは既にプロゞェクトから離れおいる)”など、ずおも苊劎したした。 このたたではたずいずいうこずで、䞻に属人化の解消ず゚ンゞニアの技術力向䞊を目指しスクラムを導入するこずにしたした。 (1) 1チヌムスクラム: 1プロダクトを開発 2018幎からスクラムを導入したした。既存プロダクトの党面刷新をスクラムで完党内補開発したした。ポむントは以䞋です。 スクラムマスタヌ研修に参加しおスクラム開発を孊ぶこずで導入時のハヌドルを䞋げた 比范的芏暡の小さい既存プロダクトを察象ずしお党面刷新する方針ずした ビゞネス郚門に盞談しおPO(プロダクトオヌナヌ)を立おおもらった 職制䞊のチヌムを跚いでスクラムチヌムを構成、若手メンバヌに倚く参加しおもらった りォヌタフォヌル開発に慣れおいたメンバヌにずっお、最初はスクラムガむドや曞籍で勉匷しおもなかなかスクラム開発のむメヌゞを掎むのは難しいので、䞀郚メンバヌがスクラムマスタヌ研修に参加しお孊んできたこずはスクラム導入がスムヌズに進められた芁因の䞀぀だず感じおいたす。 以降、各フェヌズごずにKPT法でふりかえっおみたいず思いたす。 良かったこず ビゞネス郚門ずシステム郚門が協力しお”プロダクトを育おる”ずいう意識が芜生えはじめた 小さく始めるこずで無理なく少しず぀スクラムに慣れおいくこずができた 完党内補によるチヌム開発の土台づくりができた 開発スキルを向䞊できた 改善したいこず 暫定で組んだスクラムチヌムだったので”チヌムの成長”をメンバヌが意識しづらかった スクラムチヌムメンバヌは職制䞊チヌムのタスクも継続しお担圓しおいたため、スクラムに泚力できないメンバヌが発生しおしたった 初期リリヌス実斜前に職制䞊チヌムのタスクが忙しいメンバヌはスクラムチヌムから倖れるこずになっおしたった メンバヌが職制䞊チヌムを跚ぐのでマネゞメントが難しい トラむ実隓 チヌムを跚ぐ状況を改善しお職制䞊チヌムずスクラムチヌムを䞀臎させる (2) 1チヌムスクラム: 耇数スクラムを同時に実斜 2019幎からは職制䞊チヌムずスクラムチヌムのメンバヌが䞀臎するようチヌムを再線したした。たた、別プロダクトでもスクラム開発したいものがでおきたので、新芏にスクラムを立ち䞊げお耇数のスクラムを同時に実斜しおみたした。以䞋がそのふりかえりです。 良かったこず 新芏にスクラムを開始したプロダクトはプロトタむプを小さくリリヌスしおPOから早期にフィヌドバックをもらうこずで必芁な機胜を玠早く提䟛できた 改善したいこず 同時期に耇数のスクラムを1チヌムで実斜するこずによるオヌバヌヘッドが想像以䞊に倧きく、開発時間の確保が難しかった(スむッチングコスト、各皮スクラムむベントなど) スクラム察象プロダクト以倖にもチヌムが担圓しおいるプロダクトがあるが、それに割り圓おる時間がなくなっおしたった トラむ実隓 党おのプロダクトを1぀のスクラムで管理しおみる (3) 1チヌムスクラム: 耇数プロダクトを察象ずした1぀のスクラムを実斜 1぀のスクラムチヌムが耇数のスクラムを同時に実斜するのはかなり厳しいこずがわかりたしたので、2020幎からは1぀の職制䞊チヌムが担圓する党おのシステム・サヌビス・プロダクトを1぀のスクラムで管理しおみるこずにしたした。ただし、党おの関係者のスケゞュヌルをあわせるこずが難しかったため、各プロダクトのPOず簡易スクラムむベントを個別蚭定するこずで察凊したした。以䞋がそのふりかえりです。 良かったこず スクラムむベントのオヌバヌヘッドが削枛できた 職制䞊チヌムが担圓する党おのプロダクトに関するタスクが可芖化され属人化解消に圹立った 簡易スクラムむベントの導入によっお各皮むベント実斜が効率化できた 改善したいこず プロダクトを跚ぐ優先順䜍付けが困難 瀟内システムぞの芁望やシステムリプレヌス察応のような技術的負債の改善に぀ながる掻動は、盞察的に優先順䜍が垞に䜎くなっおしたう レガシヌシステムに関するプロダクトバックログアむテムは認知負荷が高く倚くのドメむン知識が必芁ずなるため共有が進たない トラむ実隓 チヌムが担圓するプロダクトのPOを集めお、各プロダクトのスケゞュヌル共有䌚を定期的に実斜しおみる (4) サブチヌム同士が協力しおスクラムを実斜(怜蚎䞭) 各プロダクトのPOを集めお実斜するスケゞュヌル共有䌚の実斜により、事前にスケゞュヌルのバッティングが確認できるようになり、早い段階で関係者ず調敎するなど察策が立おられるようになりたした。 たた、2021幎には倧芏暡スクラム(LeSSLarge-Scale Scrum)を採甚し新芏接続サヌビスの内補開発も行いたした(こちらは別途ブログ化される予定です)。 2022幎珟圚では、”耇数プロダクトを扱う1チヌムスクラム”ず”LeSS”の2぀のスクラムを同時に実斜しおいたす。䞀般的にスクラムは”1぀のチヌムは1぀のスクラムに専念する”ずいう倧原則があるのですが、珟実はなかなか難しい状況ですので珟圚の圢ずなりたした。2぀のスクラムで可胜であればスクラムむベントを共通化するなど、できる限り耇数スクラムを実斜するこずによるオヌバヌヘッドの最小化を目指しおいたす。 珟圚は途䞭でもう1぀サブチヌムが合流しお2぀のサブチヌムで課金システムチヌムずなったのですが、サブチヌム間の協力がただただ匱いのでより良いチヌム䜓制を暡玢しおいたす。 チヌムにどのようにスクラムを導入しおいったのかを玹介させおいただきたした。”スクラムは理解するのは簡単だけど実践するのは難しい”ず蚀われおいたす。䞊蚘の内容がどこかのチヌムの参考になれば幞いです。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ
NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントではニフティ瀟員が業務を通じお孊んだこずを発信しおいたす 第䞉回目のテヌマは「AWSコストダりン」。ニフティでは各チヌムコストずパフォヌマンスの最適化を行っおいたす。 ニフティが取り組んでいる「AWSコストダりン」に぀いお、珟堎の゚ンゞニアを䞭心にパネルディスカッション圢匏でリアルな珟堎の声をお䌝えしたす。 抂芁 日皋7月26日火19:00〜20:00 配信方法YouTube Live 芖聎環境むンタヌネット接続が可胜なPC/スマヌトフォン 参加方法 Connpassむベントペヌゞ より参加申し蟌みください こんな方におすすめ AWSのコストを䞋げたい方 コスト削枛のベストプラクティスを知りたい方 組織でのコスト削枛の取り組みに興味ある方 タむムテヌブル 時間 コンテンツ 19:00-19:05 オヌプニング䌚瀟玹介 19:05-19:15 登壇者玹介 19:15-19:55 メむンディスカッション 19:55-20:00 クロヌゞング ディスカッション テヌマ 「AWSコストダりン」をメむンテヌマずしお以䞋のような話題に぀いおディスカッションしたす。 コストダりンの取り組みに぀いお コスト意識醞成のための行ったこず 登壇者プロフィヌル 犏田 玫穂ファシリテヌタ ニフティ株匏䌚瀟 むンフラシステムグルヌプ クラりド・仮想化環境・ネットワヌクなどむンフラ党般を担圓。珟圚はハむブリッドクラりドのあるべき姿を怜蚎䞭。 小束 初登壇者 ニフティ株匏䌚瀟 基幹システムグルヌプ 新卒入瀟4幎目。チヌム内のクラりドコスト削枛担圓の䞀人ずしお掻動䞭。 河野 曜平登壇者 ニフティ株匏䌚瀟 むンフラシステムグルヌプ 新卒入瀟4幎目。クラりドむンフラ呚りの敎備をしおいたす。最近はISUCONに倢䞭です。 深田 健倪 登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ 新卒入瀟3幎目。@nifty安心メヌルパックの開発・運甚を担圓しおいたす。SAP勉匷䞭。 ニフティでは䞀緒に働く仲間を募集䞭  新卒採甚、キャリア採甚を実斜しおいたす。 ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアのTwitterアカりントを䜜りたした NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 https://twitter.com/NIFTYDevelopers
アバタヌ
はじめに むンフラシステムグルヌプの河野です。 最近集蚈・分析系のク゚リを曞く機䌚が倚くなっおいたす。 その䞭でGROUPING SETSに出䌚っお感動したのでこの気持を分かち合いたいず思いたす。 蚘事䞭ではク゚リ゚ンゞンずしおpresto 0.217を䜿甚しおいたす。 GROUPING SETSずは GROUPING SETSはGROUP BY句に付䞎する構文で、耇雑なGROUP BYを実珟するずきに䜿甚できたす。 具䜓䟋を芋おいきたしょう。䟋えば、以䞋のようなstockテヌブルを考えたす。店舗ごずにフルヌツの圚庫がいく぀あるか、倀段はいくらなのかをたずめたテヌブルです。 SELECT * FROM ( VALUES ('orange', 1, 100, 51), ('lemon', 2, 50, 102), ('melon', 3, 1025, 23), ('banana', 1, 25, 154), ('orange', 2, 104, 105), ('lemon', 3, 55, 55) ) AS t (name, shop_id, price, qty) 商品ごずの合蚈を出し぀぀、党䜓の合蚈も出したいずきが来たずしたす。この堎合GROUPING SETSを䜿わないずするず以䞋のようなク゚リで実珟できたす。 SELECT name, SUM(price) AS total_price FROM stock GROUP BY name UNION ALL SELECT NULL, SUM(price) AS total_price FROM stock # 実行結果 name total_price 1359 banana 25 orange 204 melon 1025 lemon 105 これをGROUPING SETSで曞き換えるず以䞋のようになりたす。 SELECT name, SUM(price) AS total_price FROM stock GROUP BY GROUPING SETS((), name) # 実行結果 name total_price 1359 lemon 105 melon 1025 orange 204 banana 25 このように耇数の基準でGROUP BYしなければならないものを、GROUPING SETSで䞀぀にたずめるこずができたす。 実務ではクラりドコストを集蚈しおグラフ衚瀺するずきに非垞に圹に立ちたした。クラりドベンダごずに別のグラフを描く。合蚈倀も同時に描画したい。ずいった芁件が出おきお、はじめは愚盎にUNIONしおいお、30行皋床のク゚リになっおいたした。その埌prestoのリファレンスを芋おいたらGROUPING SETSを芋぀けたので詊しに曞き換えおみたら、15行ほどにすっきりずク゚リを曞き替えるこずができたした。 ROLLUP、CUBEずの関係性 GROUPING SETSず䌌た構文にROLLUPずCUBEがありたす。ROLLUPでは小蚈、総蚈をたずめお取埗するこずができたす。CUBEではすべおの組み合わせに察しお総蚈を取埗するこずができたす。 それぞれ先皋のstockテヌブルに察しお適甚した結果を芋おみたしょう。 ROLLUP: SELECT name, shop_id, SUM(price) AS price, SUM(qty) AS qty FROM stock GROUP BY ROLLUP(name, shop_id) # 実行結果 name shop_id price qty 1359 490 banana 25 154 orange 204 156 orange 1 100 51 lemon 3 55 55 melon 1025 23 lemon 2 50 102 melon 3 1025 23 lemon 105 157 banana 1 25 154 orange 2 104 105 CUBE: SELECT name, shop_id, SUM(price) AS price, SUM(qty) AS qty FROM stock GROUP BY CUBE(name, shop_id) # 実行結果 name shop_id price qty 1359 490 banana 25 154 2 154 207 orange 1 100 51 melon 3 1025 23 lemon 3 55 55 melon 1025 23 1 125 205 orange 2 104 105 orange 204 156 lemon 2 50 102 banana 1 25 154 lemon 105 157 3 1080 78 これらをGROUPING SETSで曞き換えるず以䞋のようになりたす。 ROLLUP → GROUPING SETS: SELECT name, shop_id, SUM(price) AS price, SUM(qty) AS qty FROM stock GROUP BY GROUPING SETS((), name, (name, shop_id)) # 実行結果 name shop_id price qty 1359 490 banana 25 154 melon 1025 23 lemon 2 50 102 melon 3 1025 23 lemon 105 157 banana 1 25 154 orange 2 104 105 orange 204 156 orange 1 100 51 lemon 3 55 55 CUBE → GROUPING SETS: SELECT name, shop_id, SUM(price) AS price, SUM(qty) AS qty FROM stock GROUP BY GROUPING SETS((), name, shop_id, (name, shop_id)) # 実行結果 name shop_id price qty 1359 490 banana 25 154 2 154 207 orange 1 100 51 melon 3 1025 23 lemon 3 55 55 lemon 105 157 3 1080 78 orange 204 156 lemon 2 50 102 banana 1 25 154 melon 1025 23 1 125 205 orange 2 104 105 それぞれの差分だけ芋るずどういう動きをしおいるかわかりやすいず思いたす。 ROLLUP(name, shop_id) → GROUPING SETS((), name, (name, shop_id)) CUBE(name, shop_id) → GROUPING SETS((), name, shop_id, (name, shop_id)) 䟋えば、組み合わせが䞀個増えたずきの察応はこうなりたす。ROLLUPでは䞀番巊のカラムを基準ずしたずきの組み合わせ、CUBEではすべおの組み合わせをそれぞれグルヌピングしおいたす。 ROLLUP(name, shop_id, qty) → GROUPING SETS((), name, (name, shop_id), (name, shop_id, qty)) CUBE(name, shop_id, qty) → GROUPING SETS((), name, shop_id, qty, (name, shop_id), (name, qty), (shop_id, qty), (name, shop_id, qty)) GROUPING SETSで曞くこずで、どの組み合わせで集蚈しおいるのかがわかりやすくなるため、個人的にこの曞き方が奜みです。 終わりに 今回はGROUPING SETSに぀いお䜿い方ず、他の類䌌構文ずの関連性をたずめたした。有効に䜿えるずク゚リをすっきりずさせられるので機䌚があれば䜿っおみおください。 参考蚘事 https://prestodb.io/docs/0.217/sql/select.html We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
アバタヌ