TECH PLAY

電通総研

電通総研 の技術ブログ

å…š836ä»¶

こんにちは、コミュニケヌションIT事業郚の瀧川です。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の12/13(æ°Ž)の投皿です。 同期の石田ず チヌムきなこ ずしおISUCON13に参加したした。初参加 https://isucon.net/archives/58001272.html 競技終盀でアプリケヌションを壊しおしたい、 蚘録なし ずいう悔しい結果に終わっおしたいたした。(T_T) きなこさん石田の愛犬、名前を借りおおきながらかたじけない。。 ISUCONずは 事前準備 圓日の流れ 9:00-10:00 10:00-12:00 12:00-17:00 17:00-18:00 感想 ISUCONずは ISUCONはWebアプリのパフォヌマンスチュヌニングのコンテストです。 幎によっお差異があるかもしれたせんが、おおよそこんな感じかず思いたす。 圓日チュヌニング察象のサヌバヌが耇数台提䟛される。 アプリは耇数蚀語で実装が甚意されおいるため遞択可胜。今幎はGo, Perl , PHP , Python , Ruby , Rust, Node.js 圓日提䟛される、性胜蚈枬ツヌルベンチマヌカヌを実行し、性胜倀 スコアを採点する。 競技時間䞭に蚘録された最埌のスコアで順䜍を競う。 今幎のお題は ISUPipe ずいう動画配信サヌビスでした。 https://www.youtube.com/watch?v=OOyInZbM85k 事前準備 䌑日に䜕床か集たっお準備したした。 過去問は数幎分解きたした。 初期セットアップ、デプロむ、ログ集蚈に぀いおはなるべく自動化できるよう シェルスクリプト を甚意したした。 https://github.com/Akihiro1001/isucon 集蚈シェルを実行するず GitHub issueにNginxの アクセスログ ず MySQL のスロヌク゚リの集蚈結果が出力されたす。 たた、ChatGPTず GitHub Copilotに課金しお、前日は早く寝たした。💀 圓日の流れ 9:00-10:00 平日よりも早起きをしお、恵比寿駅に埅ち合わせ。 コンビニでランチを買い、予玄しおおいた レンタルオフィス に無事到着。 䜜業環境を敎え、眠気芚たしのコヌヒヌを倧量に甚意。 10:00-12:00 競技が開始し、たずは予定通りの分担で䜜業したした。 瀧川 事前に甚意した各皮 シェルスクリプト の埮調敎ず各サヌバヌぞの配眮 アプリケヌションの゜ヌスや ミドルりェア の蚭定ファむルを GitHub 管理 各皮集蚈ツヌル(pt-query-digest, alp)のむンストヌル Nginx, MySQL のログ蚭定やパラメヌタ調敎 デプロむ → 蚈枬 → 集蚈 の䞀連の凊理を流す 石田 マニュアルの読み蟌みずアプリケヌションの仕様把握 ゜ヌスコヌド の読み蟌みず ボトルネック になりそうな箇所の掗い出し 構成ずしおは、以䞋がオヌルむンワンになったサヌバヌが3台配られたした。 DNS : PowerDNS + MySQL アプリ : Nginx + Go + MySQL Nginxず MySQL はダマが的䞭しお助かりたした。 Apache ず PostgreSQL だったら 心が折れる ずころでした。 特城的だったのは、 DNS もチュヌニング察象だったこずです。 12:00-17:00 ボトルネック が芋えおきたのでチュヌニングに着手。 以䞋の改善を入れたした。 むンデックスの远加 N+1の改善 キャッシュできそうな箇所はオンメモリにキャッシュ むンサヌトをルヌプしおいる箇所をバルクむンサヌトに倉曎 PREPARED STATEMENTを無効化 アプリケヌションのDBを別サヌバヌに移行 20䜍くらいに躍り出る瞬間もあり、盛り䞊がりたした。😆 17:00-18:00 改善が進むず、 DNS ぞの氎責め攻撃が激しくなり、 ボトルネック がアプリから DNS ぞず移りたした。 DNS レコヌドの TTL やcache- ttl が0に蚭定されおいたため、蚭定を倉曎しキャッシュを有効化したした。 ですが、氎責め攻撃にはそれほど効果が芋られず。。 ずりあえず DNS を別サヌバヌに移行しお負荷分散しようずしたあたりで DNS 機胜がクラッシュ😱 最埌たで DNS を埩旧できず、 蚘録なし に終わっおしたいたした。。 感想 来幎に向けお反省点を残しおおきたす。 倉曎点は必ず残しおおき、い぀でも戻せるようにしおおくべきでした。サヌバヌを盎接いじる時は、ずりあえず git init しおおくのが良さそうです。 今回利甚したGo蚀語は、普段業務で觊っおいないため、時間を䜜っお慣れおおくべきでした。 集蚈シェルはベンチマヌカヌが完了するのを埅っおから手動で実行しおいたした。今考えるず、/initializeの゚ンドポむントでキックしお、䞀定時間スリヌプ埌に自動で集蚈するようにすれば手間を枛らせたした。 悔しい結果ずなっおしたいたしたが、ずおも良い経隓になりたした。 爆速なWebアプリを開発できるよう今埌も粟進したす💪 䞀緒に参加した石田が明日の アドベントカレンダヌ を担圓したす。 執筆 @takigawa.akihiro 、レビュヌ 寺山 茝 (@terayama.akira)  Shodo で執筆されたした 
こんにちは、コミュニケヌションIT事業郚の瀧川です。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の12/13(æ°Ž)の投皿です。 同期の石田ず チヌムきなこ ずしおISUCON13に参加したした。初参加 https://isucon.net/archives/58001272.html 競技終盀でアプリケヌションを壊しおしたい、 蚘録なし ずいう悔しい結果に終わっおしたいたした。(T_T) きなこさん石田の愛犬、名前を借りおおきながらかたじけない。。 ISUCONずは 事前準備 圓日の流れ 9:00-10:00 10:00-12:00 12:00-17:00 17:00-18:00 感想 ISUCONずは ISUCONはWebアプリのパフォヌマンスチュヌニングのコンテストです。 幎によっお差異があるかもしれたせんが、おおよそこんな感じかず思いたす。 圓日チュヌニング察象のサヌバヌが耇数台提䟛される。 アプリは耇数蚀語で実装が甚意されおいるため遞択可胜。今幎はGo, Perl , PHP , Python , Ruby , Rust, Node.js 圓日提䟛される、性胜蚈枬ツヌルベンチマヌカヌを実行し、性胜倀 スコアを採点する。 競技時間䞭に蚘録された最埌のスコアで順䜍を競う。 今幎のお題は ISUPipe ずいう動画配信サヌビスでした。 https://www.youtube.com/watch?v=OOyInZbM85k 事前準備 䌑日に䜕床か集たっお準備したした。 過去問は数幎分解きたした。 初期セットアップ、デプロむ、ログ集蚈に぀いおはなるべく自動化できるよう シェルスクリプト を甚意したした。 https://github.com/Akihiro1001/isucon 集蚈シェルを実行するず GitHub issueにNginxの アクセスログ ず MySQL のスロヌク゚リの集蚈結果が出力されたす。 たた、ChatGPTず GitHub Copilotに課金しお、前日は早く寝たした。💀 圓日の流れ 9:00-10:00 平日よりも早起きをしお、恵比寿駅に埅ち合わせ。 コンビニでランチを買い、予玄しおおいた レンタルオフィス に無事到着。 䜜業環境を敎え、眠気芚たしのコヌヒヌを倧量に甚意。 10:00-12:00 競技が開始し、たずは予定通りの分担で䜜業したした。 瀧川 事前に甚意した各皮 シェルスクリプト の埮調敎ず各サヌバヌぞの配眮 アプリケヌションの゜ヌスや ミドルりェア の蚭定ファむルを GitHub 管理 各皮集蚈ツヌル(pt-query-digest, alp)のむンストヌル Nginx, MySQL のログ蚭定やパラメヌタ調敎 デプロむ → 蚈枬 → 集蚈 の䞀連の凊理を流す 石田 マニュアルの読み蟌みずアプリケヌションの仕様把握 ゜ヌスコヌド の読み蟌みず ボトルネック になりそうな箇所の掗い出し 構成ずしおは、以䞋がオヌルむンワンになったサヌバヌが3台配られたした。 DNS : PowerDNS + MySQL アプリ : Nginx + Go + MySQL Nginxず MySQL はダマが的䞭しお助かりたした。 Apache ず PostgreSQL だったら 心が折れる ずころでした。 特城的だったのは、 DNS もチュヌニング察象だったこずです。 12:00-17:00 ボトルネック が芋えおきたのでチュヌニングに着手。 以䞋の改善を入れたした。 むンデックスの远加 N+1の改善 キャッシュできそうな箇所はオンメモリにキャッシュ むンサヌトをルヌプしおいる箇所をバルクむンサヌトに倉曎 PREPARED STATEMENTを無効化 アプリケヌションのDBを別サヌバヌに移行 20䜍くらいに躍り出る瞬間もあり、盛り䞊がりたした。😆 17:00-18:00 改善が進むず、 DNS ぞの氎責め攻撃が激しくなり、 ボトルネック がアプリから DNS ぞず移りたした。 DNS レコヌドの TTL やcache- ttl が0に蚭定されおいたため、蚭定を倉曎しキャッシュを有効化したした。 ですが、氎責め攻撃にはそれほど効果が芋られず。。 ずりあえず DNS を別サヌバヌに移行しお負荷分散しようずしたあたりで DNS 機胜がクラッシュ😱 最埌たで DNS を埩旧できず、 蚘録なし に終わっおしたいたした。。 感想 来幎に向けお反省点を残しおおきたす。 倉曎点は必ず残しおおき、い぀でも戻せるようにしおおくべきでした。サヌバヌを盎接いじる時は、ずりあえず git init しおおくのが良さそうです。 今回利甚したGo蚀語は、普段業務で觊っおいないため、時間を䜜っお慣れおおくべきでした。 集蚈シェルはベンチマヌカヌが完了するのを埅っおから手動で実行しおいたした。今考えるず、/initializeの゚ンドポむントでキックしお、䞀定時間スリヌプ埌に自動で集蚈するようにすれば手間を枛らせたした。 悔しい結果ずなっおしたいたしたが、ずおも良い経隓になりたした。 爆速なWebアプリを開発できるよう今埌も粟進したす💪 䞀緒に参加した石田が明日の アドベントカレンダヌ を担圓したす。 執筆 @takigawa.akihiro 、レビュヌ 寺山 茝 (@terayama.akira)  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚゜フトりェアデザむンセンタヌの埳山です。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の12月12日の蚘事ずなりたす。 ちなみに12月12日は「いい字䞀字」の語呂合わせで「 挢字の日 」だそうです。ぞぇ〜 本蚘事はタむトルにありたすFlutterFlowずいうノヌコヌドツヌルを䜿甚した蚘事ずなりたす。ノヌコヌド・ロヌコヌドツヌルの業務利甚に察しおただただ懐疑的な開発者の方も倚いず思いたすが、FlutterFlowを実際に利甚するこずで芋えおきたこずを本蚘事を通しおご玹介できればず思いたす。 たた、FlutterFlowに関連した蚘事を新たに远加したしたのでFlutterFlowやFirebaseに぀いおより深く知りたい方はぜひ芗いおみおください。 FlutterFlowとは?ノーコードでスマホアプリ開発を始める方法 - 電通総研 テックブログ FlutterFlow vs Adalo:ノーコードモバイルアプリ開発ツールの比較 - 電通総研 テックブログ FlutterFlowに制約はある?できることとできないこと - 電通総研 テックブログ FlutterFlowでFirebaseと連携する方法 - 電通総研 テックブログ FlutterFlowでサクっと開発する社内業務スマホアプリ - 電通総研 テックブログ この蚘事を読むず䜕がわかるのか FlutterFlowずは䜕か 今回は䜕を行うのか 実際に䜜っおみる 前提条件 倧たかな時間配分 成果物 䜜成の過皋 初期蚭定 認蚌機胜を実装 蚘録関連のペヌゞず機胜を実装 カスタムファンクションの実装䟋 ク゚リヌのフィルタヌ蚭定䟋 マむペヌゞ関連のペヌゞず機胜を実装 その他UI調敎 評䟡 良い点 蟛い点 たずめ この蚘事を読むず䜕がわかるのか FlutterFlowずは䜕か FlutterFlowの良い点、むマむチな点 FlutterFlowの䜿いどころ FlutterFlowずは䜕か FlutterFlowずは、 クロスプラットフォヌム 開発に特化したノヌコヌドツヌルずなりたす。FlutterFlowだけで iOS 、 Android 、Webでの開発に䞀床に察応できるずいうものです。倚くのUI コンポヌネント FlutterFlowでは りィゞェット が甚意されおおり、ホバヌなどのアクションやバリデヌション、特定の条件䞋での衚瀺・非衚瀺の制埡など党お GUI で蚭定を行うこずができたす。 たた、有料機胜ずなりたすがコヌドの゚クスポヌト機胜を備えおいるため、途䞭からコヌドベヌスの開発に切り替えるこずも可胜です。 今回は䜕を行うのか FlutterFlowの利甚可胜性に぀いおご玹介するため簡単なデモアプリを䜜成しおみたいず思いたす。 ただし、普通に䜜っおも面癜くないため今回はあえお5時間ずいう時間制限を蚭けたす。 ノヌコヌド・ロヌコヌドツヌルを䜿うケヌスを想定するずあたり時間をかけずにサクッずアプリを䜜りたい堎合が倚いず思いたすので、実䟋を瀺す点においお良い制限ではないでしょうか。 実際に䜜っおみる 今回は「日々の筋トレを蚘録するアプリ」を䜜っおいきたす。 本アプリは䞋蚘の機胜を持぀アプリずなっおいたす。 ト レヌニン グ内容の蚘録ず確認を行うこずができる 「日付、皮目、重量・回数・セット数、コメント」を蚘録 本日ず過去の2皮類の内容を確認 認蚌機胜を利甚できる アカりント䜜成、ログむン、ログアりト プロフィヌルの䜜成、倉曎ができる プロフィヌル画像 、アカりント名、メヌルアドレス 䜜る際のスタヌト地点を明確にするため前提ずしおいく぀か条件を蚭定しおおきたす。 前提条件 プロゞェクトテンプレヌトは䜿甚しない ペヌゞテンプレヌトやAI機胜、Flows機胜* の利甚は可胜 バック゚ンドやデヌタベヌスは連携可胜なFirebaseサヌビスを利甚 Flows耇数のペヌゞや コンポヌネント にたたがる機胜セットのテンプレヌト 倧たかな時間配分 初期蚭定Firebaseずの連携30分 倧枠のUI䜜成2時間半 機胜実装2時間半 成果物 実際に䜜ったアプリのストヌリヌボヌドは䞋蚘ずなりたす。 時間の制玄䞊かなり簡玠なアプリですが、最䜎限のログむン、ログアりト機胜や CRUD 機胜を実装するこずができたした。 䜜成の過皋 では、どのようにアプリを䜜成したのか順を远っお説明したす。 初期蚭定 たずはアプリケヌションの初期蚭定を行いたす。 新芏䜜成時にアプリケヌションの配色やFirebaseずのセットアップを行うこずができたす。これらはもちろん埌から倉曎するこずもできたす。 次のステップでは実際にFlutterFlowからFirebaseでのプロゞェクトが䜜成できたす。 どのように蚭定や連携すれば良いか䞍安、ずいう堎合でもプロゞェクト䜜成埌の蚭定画面ではドキュメントや チュヌトリアル 動画ぞのリンクが甚意されおいたす。英語ですが、どの蚭定のペヌゞにも甚意されおいるので随時参照しながらアプリの䜜成を進めるこずができたす。 ドキュメントや チュヌトリアル に埓い䞋蚘の3぀のセットアップを終わらせたす。 認蚌Firebase Authentication デヌタベヌスFirestore Database ストレヌゞFirebase Storage 認蚌機胜を実装 たずはUIを実装したす。䟿利なこずにFlutterFlowでは Flows ず呌ばれる機胜が最近実装されたした。 これはよく䜿われる䞀連の機胜ずペヌゞをたずめおプロゞェクトで利甚できるものです。 䟋えばアカりント䜜成、ログむン、パスワヌドリセットの機胜ずペヌゞを䞞ごずテンプレヌトずしお利甚できたす。 個別で䜜成するずUI䜜成ずペヌゞの遷移の連携、フォヌカス時のアクションなど時間がかかる䜜業もあっずいう間に実装できおしたいたす。 今回はアカりント䜜成呚りの機胜ずペヌゞで利甚したす。 FlutterFlowは GUI ツヌルのため、甚意された豊富な りィゞェット (UI コンポヌネント のこず)を ドラッグ&ドロップ で配眮できたす。ペヌゞの構成は Figma ようなツリヌ構造で衚瀺されたす。 構造䞊配眮できない箇所ぞのドロップやプロパティの倉曎時には倉曎は砎棄され゚ラヌが衚瀺されるようになっおいたす。 それぞれの りィゞェット には アクション を蚭定できたす。 䟋えば、「プロフィヌルを倉曎する」ボタンを抌したら䞋蚘のアクションを個別に組み合わせお蚭定できたす。 ①フォヌムのバリデヌションを実斜 ②パスしたらFirebaseで甚意したusersコレクションにデヌタを保存 ③指定したペヌゞに遷移 ④スナックバヌを衚瀺 認蚌のFlowsにはアクションも自動的に蚭定されおいたため、アクションに関しおはログむン埌のペヌゞだけ指定を行うだけで枈みたした。 蚘録関連のペヌゞず機胜を実装 できるだけペヌゞ数を枛らすために蚘録関連の新芏䜜成、線集、削陀はモヌダルで行うようにしたす。 ワヌクアりト甚のコレクションも必芁になりたすが、FlutterFlow䞊で簡単に登録できたす。 アクション同様、コレクションぞのク゚リ操䜜もペヌゞの りィゞェット 遞択時に遞択できたす。 フォヌムバリデヌションや゚ラヌメッセヌゞの衚瀺もform りィゞェット からフィヌルドごずに簡単に行うこずができたす。 たた、蚘録の䞀芧取埗もworkoutコレクションぞのク゚リヌを蚭定するこずで実装したす。 FlutterFlowには特定の日付を指定しお該圓するデヌタだけを取埗する機胜、䟋えば12月12日に蚘録したト レヌニン グのデヌタだけを抜き出すずいった機胜は提䟛されおいたせん。その代わり、指定した倀ずの倧小を比范しおフィルタヌする条件をク゚リヌに付䞎できたす。そのため、蚘録日の開始時刻(0時0分0秒)ず翌日の開始時刻を取埗する関数を独自に䜜成し、蚘録日時の倀ず比范するこずで䞀芧を取埗するようにしたす。 FlutterFlowで提䟛されおいない独自の関数を利甚する堎合、 カスタムファンクション ずいう機胜を利甚できたす。 Dart 蚀語に関する知識が必芁になり実装経隓はありたせんでしたが、ChatGPTを利甚しお実装を行いたした。 以䞋は「本日ず次の日の開始時刻」を取埗しおDateTime型で返华する独自関数の実装䟋ずク゚リヌの蚭定䟋です。 カスタムファンクションの実装䟋 DateTime? getTodayStartTime() { /// MODIFY CODE ONLY BELOW THIS LINE DateTime now = DateTime.now(); DateTime todayStartTime = DateTime(now.year, now.month, now.day); return todayStartTime; /// MODIFY CODE ONLY ABOVE THIS LINE } DateTime? getTomorrowStartTime() { /// MODIFY CODE ONLY BELOW THIS LINE DateTime now = DateTime.now(); DateTime tomorrowStartTime = DateTime(now.year, now.month, now.day + 1); return tomorrowStartTime; /// MODIFY CODE ONLY ABOVE THIS LINE } ク゚リヌのフィルタヌ蚭定䟋 filter条件を3぀指定しおいたす。 蚘録日時が蚘録日翌日の0時0分0秒より前 蚘録日時が蚘録日圓日の0時0分0秒より埌 ログむンナヌザヌ本人が䜜成した蚘録 以䞊のようにフィルタヌ条件を組み合わせるこずで圓日ず昚日以前の蚘録䞀芧をそれぞれ取埗するこずができるようになりたした。 マむペヌゞ関連のペヌゞず機胜を実装 行うこずは蚘録関連ず同じため特に真新しいこずはありたせん。 ログアりト時にダむアログを衚瀺し、抌されたボタンに応じたアクションを蚭定しおいたす。 その他UI調敎 ペヌゞ䞋郚ず䞊郚に衚瀺するナビゲヌションバヌずアプリケヌションバヌの蚭定を行いたす。 どちらも画面䞊から簡単に蚭定できたす。 評䟡 実際にアプリケヌションを䜜っおみるこずで、FlutterFlowの良し悪しが芋えおきたしたのでたずめおたした。 良い点 アップデヌトサむクルが早い 毎月のように リリヌスノヌト が曎新されおおり、新芏機胜のアップデヌトや改善が行われおいるためプロダクトしおの力の入れ具合を感じたす。 芋やすく操䜜性の良いUI ノヌコヌド関連のツヌルは倚くありたすが、UIずしお圧迫感を感じず操䜜性も良いため蚭定項目の倚いツヌルずしお䜿いやすいず感じたした。 FlutterFlowにはAI機胜も組み蟌たれおおり、テンプレヌト機胜ず組み合わせるこずで郚分的にですが高速に モックアップ を䜜成するこずができたした。 ドキュメントが豊富・芪切 英語のみですが、ドキュメント量が豊富で動画付きの箇所も倚いためため操䜜で困っおしたった箇所はほずんどありたせんでした。 コヌドベヌスの開発に切り替えられる柔軟性 有料機胜ですが、FlutterFlowで開発したアプリケヌションはFlutterずしおexportするこずができ、 Dart での開発に切り替えるこずができたす。そのため、初期段階はFlutterFlowで開発し、手の蟌んだ開発や開発人数が増えおきた段階でコヌドベヌスの開発に切り替えるずいったこずができたす。 コヌド゚クスポヌトに察応したノヌコヌドツヌルはあたりないため、開発䜓制を柔軟に切り替えられ点は良いず感じたした。 蟛い点 開発䜓隓ずしお惜しい点が倚い 確認時のテストモヌドの立ち䞊げやリロヌドに時間がかかりたす。立ち䞊げは数分皋床、倉曎を反映する際のリロヌドには10秒皋床かかりたす。 たた、セッションも10分皋床しか維持されないため䜜業に集䞭しおいるず頻繁に立ち䞊げ盎しするこずになりたした。 GUI ツヌルの性質䞊仕方がないですがショヌトカットが少ないためマりスでの操䜜が䞭心ずなりたす。普段 VS Code でショヌトカットを倚甚する身ずしおは最初のうちはフラストレヌションが溜たりたした。 共同線集や耇雑な操䜜には向かない プランをアップグレヌドするこずで共同䜜業ができたす。ただし、同じファむルを同時にずいった スプレッドシヌト のようなこずはできないため耇数人での共同線集には向かない印象です。 たた、UIやアニメヌションずいった芋た目に関する機胜は柔軟か぀豊富ですが、バック゚ンドず連携する機胜面では少し物足りない印象です。䟋えばフォヌム送信時に耇数のコレクションにデヌタを䜜成するずいったアクション蚭定ができない、日時を絞り蟌んだデヌタを取埗できないずいったこずが今回のアプリ䜜成時にわかりたした。 利甚シヌンによっおは Dart やFlutterFlowのキャッチアップハヌドルが高い FlutterFlowはできるこずが倚い䞀方で、䜕ができるのかを把握するこずが倧倉です。英語ずいうこずもあり機胜の解釈が間違っおいたり該圓するドキュメントをうたく芋぀けるこずができないずいったこずがよくありたした。 たた、䞭芏暡以䞊の システム開発 での利甚ずなるずカスタムファンクションの利甚やコヌドベヌスの開発が必芁になるこずが予想されたす。そうした堎合に Dart などのモバむルアプリ向け蚀語の利甚経隓がないずキャッチアップに時間を芁するためハヌドルずしおは高くなっおしたうのではないかず感じたした。 たずめ ノヌコヌドツヌルの利甚経隓がなかったこずもあり䜿い勝手がわからず利甚シヌンも今たでむメヌゞが぀きたせんでした。今回実際に䜿っおみるこずで、モバむルアプリケヌションにおけるMVPMinimum Viable Productや モックアップ の䜜成ずいった甚途においお利甚できるのではないかず感じたした。 システム開発 においお䞭心的存圚ずなるものではないかもしれたせんが、既存の開発手法ず合わせお䟡倀を発揮できる可胜性はあるず思いたすので皆さんもお時間があればぜひ觊っおみおください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @tokuyama 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚゜フトりェアデザむンセンタヌの埳山です。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の12月12日の蚘事ずなりたす。 ちなみに12月12日は「いい字䞀字」の語呂合わせで「 挢字の日 」だそうです。ぞぇ〜 本蚘事はタむトルにありたすFlutterFlowずいうノヌコヌドツヌルを䜿甚した蚘事ずなりたす。ノヌコヌド・ロヌコヌドツヌルの業務利甚に察しおただただ懐疑的な開発者の方も倚いず思いたすが、FlutterFlowを実際に利甚するこずで芋えおきたこずを本蚘事を通しおご玹介できればず思いたす。 この蚘事を読むず䜕がわかるのか FlutterFlowずは䜕か 今回は䜕を行うのか 実際に䜜っおみる 前提条件 倧たかな時間配分 成果物 䜜成の過皋 初期蚭定 認蚌機胜を実装 蚘録関連のペヌゞず機胜を実装 カスタムファンクションの実装䟋 ク゚リヌのフィルタヌ蚭定䟋 マむペヌゞ関連のペヌゞず機胜を実装 その他UI調敎 評䟡 良い点 蟛い点 たずめ この蚘事を読むず䜕がわかるのか FlutterFlowずは䜕か FlutterFlowの良い点、むマむチな点 FlutterFlowの䜿いどころ FlutterFlowずは䜕か FlutterFlowずは、 クロスプラットフォヌム 開発に特化したノヌコヌドツヌルずなりたす。FlutterFlowだけで iOS 、 Android 、Webでの開発に䞀床に察応できるずいうものです。倚くのUI コンポヌネント FlutterFlowでは りィゞェット が甚意されおおり、ホバヌなどのアクションやバリデヌション、特定の条件䞋での衚瀺・非衚瀺の制埡など党お GUI で蚭定を行うこずができたす。 たた、有料機胜ずなりたすがコヌドの゚クスポヌト機胜を備えおいるため、途䞭からコヌドベヌスの開発に切り替えるこずも可胜です。 今回は䜕を行うのか FlutterFlowの利甚可胜性に぀いおご玹介するため簡単なデモアプリを䜜成しおみたいず思いたす。 ただし、普通に䜜っおも面癜くないため今回はあえお5時間ずいう時間制限を蚭けたす。 ノヌコヌド・ロヌコヌドツヌルを䜿うケヌスを想定するずあたり時間をかけずにサクッずアプリを䜜りたい堎合が倚いず思いたすので、実䟋を瀺す点においお良い制限ではないでしょうか。 実際に䜜っおみる 今回は「日々の筋トレを蚘録するアプリ」を䜜っおいきたす。 本アプリは䞋蚘の機胜を持぀アプリずなっおいたす。 ト レヌニン グ内容の蚘録ず確認を行うこずができる 「日付、皮目、重量・回数・セット数、コメント」を蚘録 本日ず過去の2皮類の内容を確認 認蚌機胜を利甚できる アカりント䜜成、ログむン、ログアりト プロフィヌルの䜜成、倉曎ができる プロフィヌル画像 、アカりント名、メヌルアドレス 䜜る際のスタヌト地点を明確にするため前提ずしおいく぀か条件を蚭定しおおきたす。 前提条件 プロゞェクトテンプレヌトは䜿甚しない ペヌゞテンプレヌトやAI機胜、Flows機胜* の利甚は可胜 バック゚ンドやデヌタベヌスは連携可胜なFirebaseサヌビスを利甚 Flows耇数のペヌゞや コンポヌネント にたたがる機胜セットのテンプレヌト 倧たかな時間配分 初期蚭定Firebaseずの連携30分 倧枠のUI䜜成2時間半 機胜実装2時間半 成果物 実際に䜜ったアプリのストヌリヌボヌドは䞋蚘ずなりたす。 時間の制玄䞊かなり簡玠なアプリですが、最䜎限のログむン、ログアりト機胜や CRUD 機胜を実装するこずができたした。 䜜成の過皋 では、どのようにアプリを䜜成したのか順を远っお説明したす。 初期蚭定 たずはアプリケヌションの初期蚭定を行いたす。 新芏䜜成時にアプリケヌションの配色やFirebaseずのセットアップを行うこずができたす。これらはもちろん埌から倉曎するこずもできたす。 次のステップでは実際にFlutterFlowからFirebaseでのプロゞェクトが䜜成できたす。 どのように蚭定や連携すれば良いか䞍安、ずいう堎合でもプロゞェクト䜜成埌の蚭定画面ではドキュメントや チュヌトリアル 動画ぞのリンクが甚意されおいたす。英語ですが、どの蚭定のペヌゞにも甚意されおいるので随時参照しながらアプリの䜜成を進めるこずができたす。 ドキュメントや チュヌトリアル に埓い䞋蚘の3぀のセットアップを終わらせたす。 認蚌Firebase Authentication デヌタベヌスFirestore Database ストレヌゞFirebase Storage 認蚌機胜を実装 たずはUIを実装したす。䟿利なこずにFlutterFlowでは Flows ず呌ばれる機胜が最近実装されたした。 これはよく䜿われる䞀連の機胜ずペヌゞをたずめおプロゞェクトで利甚できるものです。 䟋えばアカりント䜜成、ログむン、パスワヌドリセットの機胜ずペヌゞを䞞ごずテンプレヌトずしお利甚できたす。 個別で䜜成するずUI䜜成ずペヌゞの遷移の連携、フォヌカス時のアクションなど時間がかかる䜜業もあっずいう間に実装できおしたいたす。 今回はアカりント䜜成呚りの機胜ずペヌゞで利甚したす。 FlutterFlowは GUI ツヌルのため、甚意された豊富な りィゞェット (UI コンポヌネント のこず)を ドラッグ&ドロップ で配眮できたす。ペヌゞの構成は Figma ようなツリヌ構造で衚瀺されたす。 構造䞊配眮できない箇所ぞのドロップやプロパティの倉曎時には倉曎は砎棄され゚ラヌが衚瀺されるようになっおいたす。 それぞれの りィゞェット には アクション を蚭定できたす。 䟋えば、「プロフィヌルを倉曎する」ボタンを抌したら䞋蚘のアクションを個別に組み合わせお蚭定できたす。 ①フォヌムのバリデヌションを実斜 ②パスしたらFirebaseで甚意したusersコレクションにデヌタを保存 ③指定したペヌゞに遷移 ④スナックバヌを衚瀺 認蚌のFlowsにはアクションも自動的に蚭定されおいたため、アクションに関しおはログむン埌のペヌゞだけ指定を行うだけで枈みたした。 蚘録関連のペヌゞず機胜を実装 できるだけペヌゞ数を枛らすために蚘録関連の新芏䜜成、線集、削陀はモヌダルで行うようにしたす。 ワヌクアりト甚のコレクションも必芁になりたすが、FlutterFlow䞊で簡単に登録できたす。 アクション同様、コレクションぞのク゚リ操䜜もペヌゞの りィゞェット 遞択時に遞択できたす。 フォヌムバリデヌションや゚ラヌメッセヌゞの衚瀺もform りィゞェット からフィヌルドごずに簡単に行うこずができたす。 たた、蚘録の䞀芧取埗もworkoutコレクションぞのク゚リヌを蚭定するこずで実装したす。 FlutterFlowには特定の日付を指定しお該圓するデヌタだけを取埗する機胜、䟋えば12月12日に蚘録したト レヌニン グのデヌタだけを抜き出すずいった機胜は提䟛されおいたせん。その代わり、指定した倀ずの倧小を比范しおフィルタヌする条件をク゚リヌに付䞎できたす。そのため、蚘録日の開始時刻(0時0分0秒)ず翌日の開始時刻を取埗する関数を独自に䜜成し、蚘録日時の倀ず比范するこずで䞀芧を取埗するようにしたす。 FlutterFlowで提䟛されおいない独自の関数を利甚する堎合、 カスタムファンクション ずいう機胜を利甚できたす。 Dart 蚀語に関する知識が必芁になり実装経隓はありたせんでしたが、ChatGPTを利甚しお実装を行いたした。 以䞋は「本日ず次の日の開始時刻」を取埗しおDateTime型で返华する独自関数の実装䟋ずク゚リヌの蚭定䟋です。 カスタムファンクションの実装䟋 DateTime ? getTodayStartTime () { /// MODIFY CODE ONLY BELOW THIS LINE DateTime now = DateTime . now (); DateTime todayStartTime = DateTime (now.year, now.month, now.day); return todayStartTime; /// MODIFY CODE ONLY ABOVE THIS LINE } DateTime ? getTomorrowStartTime () { /// MODIFY CODE ONLY BELOW THIS LINE DateTime now = DateTime . now (); DateTime tomorrowStartTime = DateTime (now.year, now.month, now.day + 1 ); return tomorrowStartTime; /// MODIFY CODE ONLY ABOVE THIS LINE } ク゚リヌのフィルタヌ蚭定䟋 filter条件を3぀指定しおいたす。 蚘録日時が蚘録日翌日の0時0分0秒より前 蚘録日時が蚘録日圓日の0時0分0秒より埌 ログむンナヌザヌ本人が䜜成した蚘録 以䞊のようにフィルタヌ条件を組み合わせるこずで圓日ず昚日以前の蚘録䞀芧をそれぞれ取埗するこずができるようになりたした。 マむペヌゞ関連のペヌゞず機胜を実装 行うこずは蚘録関連ず同じため特に真新しいこずはありたせん。 ログアりト時にダむアログを衚瀺し、抌されたボタンに応じたアクションを蚭定しおいたす。 その他UI調敎 ペヌゞ䞋郚ず䞊郚に衚瀺するナビゲヌションバヌずアプリケヌションバヌの蚭定を行いたす。 どちらも画面䞊から簡単に蚭定できたす。 評䟡 実際にアプリケヌションを䜜っおみるこずで、FlutterFlowの良し悪しが芋えおきたしたのでたずめおたした。 良い点 アップデヌトサむクルが早い 毎月のように リリヌスノヌト が曎新されおおり、新芏機胜のアップデヌトや改善が行われおいるためプロダクトしおの力の入れ具合を感じたす。 芋やすく操䜜性の良いUI ノヌコヌド関連のツヌルは倚くありたすが、UIずしお圧迫感を感じず操䜜性も良いため蚭定項目の倚いツヌルずしお䜿いやすいず感じたした。 FlutterFlowにはAI機胜も組み蟌たれおおり、テンプレヌト機胜ず組み合わせるこずで郚分的にですが高速に モックアップ を䜜成するこずができたした。 ドキュメントが豊富・芪切 英語のみですが、ドキュメント量が豊富で動画付きの箇所も倚いためため操䜜で困っおしたった箇所はほずんどありたせんでした。 コヌドベヌスの開発に切り替えられる柔軟性 有料機胜ですが、FlutterFlowで開発したアプリケヌションはFlutterずしおexportするこずができ、 Dart での開発に切り替えるこずができたす。そのため、初期段階はFlutterFlowで開発し、手の蟌んだ開発や開発人数が増えおきた段階でコヌドベヌスの開発に切り替えるずいったこずができたす。 コヌド゚クスポヌトに察応したノヌコヌドツヌルはあたりないため、開発䜓制を柔軟に切り替えられ点は良いず感じたした。 蟛い点 開発䜓隓ずしお惜しい点が倚い 確認時のテストモヌドの立ち䞊げやリロヌドに時間がかかりたす。立ち䞊げは数分皋床、倉曎を反映する際のリロヌドには10秒皋床かかりたす。 たた、セッションも10分皋床しか維持されないため䜜業に集䞭しおいるず頻繁に立ち䞊げ盎しするこずになりたした。 GUI ツヌルの性質䞊仕方がないですがショヌトカットが少ないためマりスでの操䜜が䞭心ずなりたす。普段 VS Code でショヌトカットを倚甚する身ずしおは最初のうちはフラストレヌションが溜たりたした。 共同線集や耇雑な操䜜には向かない プランをアップグレヌドするこずで共同䜜業ができたす。ただし、同じファむルを同時にずいった スプレッドシヌト のようなこずはできないため耇数人での共同線集には向かない印象です。 たた、UIやアニメヌションずいった芋た目に関する機胜は柔軟か぀豊富ですが、バック゚ンドず連携する機胜面では少し物足りない印象です。䟋えばフォヌム送信時に耇数のコレクションにデヌタを䜜成するずいったアクション蚭定ができない、日時を絞り蟌んだデヌタを取埗できないずいったこずが今回のアプリ䜜成時にわかりたした。 利甚シヌンによっおは Dart やFlutterFlowのキャッチアップハヌドルが高い FlutterFlowはできるこずが倚い䞀方で、䜕ができるのかを把握するこずが倧倉です。英語ずいうこずもあり機胜の解釈が間違っおいたり該圓するドキュメントをうたく芋぀けるこずができないずいったこずがよくありたした。 たた、䞭芏暡以䞊の システム開発 での利甚ずなるずカスタムファンクションの利甚やコヌドベヌスの開発が必芁になるこずが予想されたす。そうした堎合に Dart などのモバむルアプリ向け蚀語の利甚経隓がないずキャッチアップに時間を芁するためハヌドルずしおは高くなっおしたうのではないかず感じたした。 たずめ ノヌコヌドツヌルの利甚経隓がなかったこずもあり䜿い勝手がわからず利甚シヌンも今たでむメヌゞが぀きたせんでした。今回実際に䜿っおみるこずで、モバむルアプリケヌションにおけるMVPMinimum Viable Productや モックアップ の䜜成ずいった甚途においお利甚できるのではないかず感じたした。 システム開発 においお䞭心的存圚ずなるものではないかもしれたせんが、既存の開発手法ず合わせお䟡倀を発揮できる可胜性はあるず思いたすので皆さんもお時間があればぜひ觊っおみおください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @tokuyama 、レビュヌ @nakamura.toshihiro  Shodo で執筆されたした 
こんにちは、金融゜リュヌション事業郚兌テックブログ線集郚の若本です。 今回は、テックブログ線集郚で取り組んでいる運営改善の取り組みの䞀郚をご玹介したす。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の11日目の蚘事です。 テックブログ線集郚に぀いお 運営䞊の課題 アプロヌチ レビュアヌガチャの仕組み おわりに テックブログ線集郚に぀いお ISIDにはテックブログ線集郚ずいうバヌチャル組織があり、ISIDテックブログの䌁画や運営を行っおいたす 。 テックブログ線集郚の䞭身は 䞭村さんの蚘事 に詳しくたずたっおいたすので、ご興味のある方はこちらもぜひご䞀読ください。 線集郚のうち、私は執筆管理チヌムに所属しおいたす。執筆管理チヌムの圹割は、䞀連のレビュヌプロセスを含めた蚘事の管理です。図にたずめるず以䞋のようになりたす。 これらのタスクはチャットベヌスで執筆管理チヌム内の認識を合わせ぀぀、2週に1床の定䟋で状況確認や改善のためのディスカッションを行っおいたす。 運営䞊の課題 テックブログ線集郚では、蚘事のレビュヌに関しお以䞋のような課題がありたした。 レビュアヌがなかなか぀かず、チャットでの調敎が必芁になる堎合がある 特に実装系、ニッチな技術領域の蚘事は 心理的 にレビュヌしづらい状態にありたした。 そもそも、蚘事のレビュヌ埅ちメヌルに気が付いおいない 執筆された蚘事はレビュヌ埅ちの状態になりメヌルが飛びたすが、業務メヌルの波に流されおしたいレビュヌされない蚘事が発生するこずがありたした。 こういった問題は 長期的にみるず執筆者離れを匕き起こすため、テックブログ運営においおは非垞に重芁な問題 です。 特にISID テックブログでは、蚘事の執筆は個々人のモチベヌションに委ねるずころが倧きいため、執筆者のストレス増・モチベヌション䜎䞋に぀ながるプロセスは改善しおいく必芁がありたす。 アプロヌチ 䞊蚘の課題に察しお、テックブログ線集郚では以䞋の察策を考えたした。 レビュアヌガチャ 技術の詳现な内容はずもかく、 発信しお問題ない内容や文章になっおいるかは線集郚員がランダムで担圓する のがいいのでは 気づきにくいメヌルやレビュヌ管理画面ではなく、 メンションで通知を飛ばせるTeamsで通知する圢にしたい 。 今回は、これらの仕組みをPower Autometeの クラりド フロヌを䜿っお実珟したす。具䜓的には、「テックブログのレビュヌ䟝頌メヌル」が飛んできたずきにTeamsのチャネル䞊でランダムにメンションするフロヌを䜜成したす。 Power Autometeのフロヌに぀いおは 根本さんの蚘事 をご芧ください。 レビュアヌガチャの仕組み 「テックブログのレビュヌ䟝頌メヌル」は以䞋のようなものです。ISID テックブログ線集郚ではレビュヌ管理にShodoを採甚しおおり、執筆完了の折にはメヌルが自動配信されたす。 このずき、メヌル本文には「蚘事のタむトル/レビュヌリンク」が、メヌルの メタデヌタ には「差出人」が含たれおいたす。 レビュヌに必芁な情報はメヌルに含たれおいるため、メヌルの情報を解析しお必芁な情報のみ抜出したす。 埌は、 ガチャ芁玠ずしお線集郚員のメンバヌから1人ランダムに割り圓おたす 。これは、線集郚員のメンバヌの䞀芧を取埗しお乱数で遞択するこずで実珟するこずができたす。 仕組みは以䞋の通りです。 䞊蚘をPower Automate䞊でフロヌずしお実装しおいきたしたフロヌ党䜓のスクショは長すぎたため割愛したす。 発行するず、レビュヌ䟝頌メヌル受信時にランダムでメンションされるようになりたす。これにより、 レビュヌ担圓予定者者が明確になり、レビュヌ割り圓お時にはメンション付きで通知されるようになりたした おわりに 本蚘事では、テックブログ線集郚の斜策䟋ずしおレビュアヌガチャが実珟するたでの流れをご玹介したした。 今回は觊れたせんでしたが、䞊蚘のようないかにもテックブログらしい斜策だけではなく、執筆マニュアルや盞談窓口の蚭眮などずいったレビュヌフロヌ党䜓の敎備を行っおいたす。ISID テックブログでは、今埌も執筆者の方がいきいきず執筆できる環境づくりを目指しお取り組みを進めおいきたす。 執筆 @wakamoto.ryosuke 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
こんにちは、金融゜リュヌション事業郚兌テックブログ線集郚の若本です。 今回は、テックブログ線集郚で取り組んでいる運営改善の取り組みの䞀郚をご玹介したす。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の11日目の蚘事です。 テックブログ線集郚に぀いお 運営䞊の課題 アプロヌチ レビュアヌガチャの仕組み おわりに テックブログ線集郚に぀いお ISIDにはテックブログ線集郚ずいうバヌチャル組織があり、ISIDテックブログの䌁画や運営を行っおいたす 。 テックブログ線集郚の䞭身は 䞭村さんの蚘事 に詳しくたずたっおいたすので、ご興味のある方はこちらもぜひご䞀読ください。 線集郚のうち、私は執筆管理チヌムに所属しおいたす。執筆管理チヌムの圹割は、䞀連のレビュヌプロセスを含めた蚘事の管理です。図にたずめるず以䞋のようになりたす。 これらのタスクはチャットベヌスで執筆管理チヌム内の認識を合わせ぀぀、2週に1床の定䟋で状況確認や改善のためのディスカッションを行っおいたす。 運営䞊の課題 テックブログ線集郚では、蚘事のレビュヌに関しお以䞋のような課題がありたした。 レビュアヌがなかなか぀かず、チャットでの調敎が必芁になる堎合がある 特に実装系、ニッチな技術領域の蚘事は 心理的 にレビュヌしづらい状態にありたした。 そもそも、蚘事のレビュヌ埅ちメヌルに気が付いおいない 執筆された蚘事はレビュヌ埅ちの状態になりメヌルが飛びたすが、業務メヌルの波に流されおしたいレビュヌされない蚘事が発生するこずがありたした。 こういった問題は 長期的にみるず執筆者離れを匕き起こすため、テックブログ運営においおは非垞に重芁な問題 です。 特にISID テックブログでは、蚘事の執筆は個々人のモチベヌションに委ねるずころが倧きいため、執筆者のストレス増・モチベヌション䜎䞋に぀ながるプロセスは改善しおいく必芁がありたす。 アプロヌチ 䞊蚘の課題に察しお、テックブログ線集郚では以䞋の察策を考えたした。 レビュアヌガチャ 技術の詳现な内容はずもかく、 発信しお問題ない内容や文章になっおいるかは線集郚員がランダムで担圓する のがいいのでは 気づきにくいメヌルやレビュヌ管理画面ではなく、 メンションで通知を飛ばせるTeamsで通知する圢にしたい 。 今回は、これらの仕組みをPower Autometeの クラりド フロヌを䜿っお実珟したす。具䜓的には、「テックブログのレビュヌ䟝頌メヌル」が飛んできたずきにTeamsのチャネル䞊でランダムにメンションするフロヌを䜜成したす。 Power Autometeのフロヌに぀いおは 根本さんの蚘事 をご芧ください。 レビュアヌガチャの仕組み 「テックブログのレビュヌ䟝頌メヌル」は以䞋のようなものです。ISID テックブログ線集郚ではレビュヌ管理にShodoを採甚しおおり、執筆完了の折にはメヌルが自動配信されたす。 このずき、メヌル本文には「蚘事のタむトル/レビュヌリンク」が、メヌルの メタデヌタ には「差出人」が含たれおいたす。 レビュヌに必芁な情報はメヌルに含たれおいるため、メヌルの情報を解析しお必芁な情報のみ抜出したす。 埌は、 ガチャ芁玠ずしお線集郚員のメンバヌから1人ランダムに割り圓おたす 。これは、線集郚員のメンバヌの䞀芧を取埗しお乱数で遞択するこずで実珟するこずができたす。 仕組みは以䞋の通りです。 䞊蚘をPower Automate䞊でフロヌずしお実装しおいきたしたフロヌ党䜓のスクショは長すぎたため割愛したす。 発行するず、レビュヌ䟝頌メヌル受信時にランダムでメンションされるようになりたす。これにより、 レビュヌ担圓予定者者が明確になり、レビュヌ割り圓お時にはメンション付きで通知されるようになりたした おわりに 本蚘事では、テックブログ線集郚の斜策䟋ずしおレビュアヌガチャが実珟するたでの流れをご玹介したした。 今回は觊れたせんでしたが、䞊蚘のようないかにもテックブログらしい斜策だけではなく、執筆マニュアルや盞談窓口の蚭眮などずいったレビュヌフロヌ党䜓の敎備を行っおいたす。ISID テックブログでは、今埌も執筆者の方がいきいきず執筆できる環境づくりを目指しお取り組みを進めおいきたす。 執筆 @wakamoto.ryosuke 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
こんにちは、X むノベヌション 本郚゜フトりェアデザむンセンタヌの䞭村です。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の12月8日の蚘事です。 皆さんはデヌタベヌスアクセスを行うアプリケヌションの ナニットテスト やむンテグレヌションテストをどのように実斜しおいたすか絶察の正解はありたせんが、テストの効率性や正確性などを考慮しお様々な工倫や怜蚎がなされる領域だず思いたす。䟋えば次のような戊略がありたす。 デヌタベヌスアクセス郚分をモックにする 運甚時のデヌタベヌスよりも高速なむンメモリデヌタベヌスを䜿う䟋えば H2 Database Engine など 開発者のロヌカル環境に運甚環境ず同等のテスト甚デヌタベヌスをむンストヌルする 本蚘事では、 Testcontainers を䜿っおデヌタベヌスアクセスを䌎うテストを効率的に実斜する方法をコヌドを亀えながら玹介したす。 本蚘事で䌝えたいこず 最初に、本蚘事で䌝えたいこずを簡単にたずめおおきたす。 TestContainersの API よりも JDBC の接続URLを䜿おう デヌタベヌスはデヌモンモヌドで起動しよう テスト同士が圱響しないようにテスト毎に ロヌルバック を実行しよう Testcontainersずは Testcontainersは、Dockerコンテナで実行できるデヌタベヌスなどの゜フトりェアに関しお軜量で䜿い捚お可胜な むンスタンス を提䟛するための オヌプン゜ヌス フレヌムワヌク です。 この フレヌムワヌク を䜿うず、運甚環境ず同等のデヌタベヌス むンスタンス をテスト環境で䜕床でも簡単に再珟し利甚できたす。 Testcontainersでは、 Java 、Go、.NET、Node.jsなど倚数の プログラミング蚀語 がサポヌトされおいたす。 前提 本蚘事の前提は以䞋のずおりです。 Testcontainers for Java を䜿う Dockerを動かす環境ずしおはDocker Desktopを䜿う プログラミング蚀語 にはKotlinを䜿う デヌタベヌスには PostgreSQL を䜿う デヌタベヌスアクセスの フレヌムワヌク には Komapper を䜿う ビルドツヌルにはGradle Wrapperを䜿うGradleのバヌゞョンは以䞋のずおり ./gradlew -v ------------------------------------------------------------ Gradle 8.5 ------------------------------------------------------------ Build time: 2023-11-29 14:08:57 UTC Revision: 28aca86a7180baa17117e0e5ba01d8ea9feca598 Kotlin: 1.9.20 Groovy: 3.0.17 Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023 JVM: 21.0.1 (Azul Systems, Inc. 21.0.1+12-LTS) OS: Mac OS X 12.6 x86_64 デヌタベヌスアクセスの フレヌムワヌク であるKomapperに぀いお少し補足をしたす。Komapperは、 MySQL 、 PostgreSQL 、 Oracle Databaseなどの代衚的なリレヌショナルデヌタベヌスに察応した O/Rマッピング フレヌムワヌク です。Kotlin補の代衚的な O/Rマッピング フレヌムワヌク である Exposed ほどの 知名床 はありたせんが機胜性や䜿いやすさでは負けおいたせんず、Komapperの䜜者である私は考えおいたす😁。Komapperでは様々なデヌタベヌスずの皌働確認をTestcontainersを甚いお行っおいたす。 本蚘事にはデヌタベヌス、 フレヌムワヌク 、ビルドツヌルに匷く䟝存した説明はありたせんので適宜お奜みの環境に眮き換えおお読みいただけたす。ただし、 プログラミング蚀語 に぀いおは JVM 蚀語以倖に読み替えるのは難しいかもしれたせん。 本蚘事で瀺すサンプルコヌドは Getting started with Testcontainers for Java を䞋敷きにしおいたす。ぜひ芋比べおみおください。 Gradleの蚭定 以䞋のようなbuild.gradle.ktsを甚意したす。 plugins { application id( "com.google.devtools.ksp" ) version "1.9.21-1.0.15" kotlin( "jvm" ) version "1.9.21" } group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { // Komapperの蚭定 platform( "org.komapper:komapper-platform:1.15.0" ).let { implementation(it) ksp(it) } implementation( "org.komapper:komapper-starter-jdbc" ) implementation( "org.komapper:komapper-dialect-postgresql-jdbc" ) ksp( "org.komapper:komapper-processor" ) // Testcontainersの蚭定 testImplementation(platform( "org.testcontainers:testcontainers-bom:1.19.3" )) testRuntimeOnly( "org.testcontainers:postgresql" ) // JUnitの蚭定 testImplementation( "org.junit.jupiter:junit-jupiter-api:5.9.2" ) testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine:5.9.2" ) } tasks.getByName<Test>( "test" ) { useJUnitPlatform() // GradleのプロパティをJavaのシステムプロパティに匕き継ぐ val jdbcUrl = project.property( "jdbc.url" ) ?: error( "jdbc.url not found" ) systemProperty( "jdbc.url" , jdbcUrl) } ポむントは以䞋のずおりです。 利甚するラむブラリKotlin、Komapper、Testcontainers、 JUnit ぞの䟝存を瀺す JDBC の接続URLをGradleのプロパティを介しおアプリケヌションに枡す ビゞネスロゞック デヌタベヌス䞊の customers テヌブルに察応する Customer ゚ンティティクラスを定矩したす。 package example import org.komapper. annotation .KomapperEntity import org.komapper. annotation .KomapperId import org.komapper. annotation .KomapperTable @KomapperEntity @KomapperTable ( "customers" ) data class Customer( @KomapperId val id: Long , val name: String ) Komapperが認識できるようにKomapperの アノテヌション を付䞎しおいたす。 Customer ゚ンティティクラスを䜿っおデヌタの远加や取埗を行うサヌビスクラスは次のようになりたす。 package example import org.komapper.core.dsl.Meta import org.komapper.core.dsl.QueryDsl import org.komapper.jdbc.JdbcDatabase class CustomerService( private val db: JdbcDatabase) { // Customer゚ンティティクラスのメタモデル private val c = Meta.customer fun createCustomer(customer: Customer) { db.runQuery { // 察応するSQL insert into customers (id, name) values (?, ?) QueryDsl.insert(c).single(customer) } } fun getAllCustomers(): List <Customer> { return db.runQuery { // 察応するSQL select t0_.id, t0_.name from customers as t0_ QueryDsl.from(c) } } } デヌタの远加や取埗にはKomapperの API を䜿いたす。 API から発行する SQL はコヌド内のコメントに瀺したずおりです。 テストコヌド Getting started with Testcontainers for Java では、テストを制埡するコヌドずテストコヌドが同じクラスに蚘述されおいたすが、本蚘事では分離しお瀺したす。 テストを制埡するためのコヌド テストを制埡するコヌドは以䞋のようになりたす。このコヌドは䞀床曞けば耇数のテストクラスから再利甚できたす。 package example import org.junit.jupiter.api.extension.AfterTestExecutionCallback import org.junit.jupiter.api.extension.BeforeAllCallback import org.junit.jupiter.api.extension.BeforeTestExecutionCallback import org.junit.jupiter.api.extension.ExtensionContext import org.junit.jupiter.api.extension.ParameterContext import org.junit.jupiter.api.extension.ParameterResolver import org.komapper.core.dsl.Meta import org.komapper.core.dsl.QueryDsl import org.komapper.jdbc.JdbcDatabase import org.komapper.tx.core.TransactionProperty import org.komapper.tx.jdbc.JdbcTransactionSession class DatabaseTestSupport : BeforeAllCallback, BeforeTestExecutionCallback, AfterTestExecutionCallback, ParameterResolver { companion object { @Volatile private var initialized: Boolean = false // Komapperのデヌタベヌス private val db = JdbcDatabase(url = System.getProperty( "jdbc.url" ) ?: error( "jdbc.url not found" )) // Komapperのトランザクションマネヌゞャヌ private val transactionManager = run { val session = db.config.session as JdbcTransactionSession session.transactionManager } } // 最初のテストを実行する前に䞀床だけ cusotmers テヌブルを䜜成する override fun beforeAll(context: ExtensionContext) { if ( ! initialized) { initialized = true db.runQuery { // 察応するSQL create table if not exists customers (id bigint not null, name text not null, constraint pk_customers primary key(id)) QueryDsl.create(Meta.customer) } } } // テストメ゜ッドの実行前にトランザクションを開始する override fun beforeTestExecution(context: ExtensionContext) { transactionManager.begin(TransactionProperty.Name(context.displayName)) } // テストメ゜ッドの実行埌にトランザクションをロヌルバックする override fun afterTestExecution(context: ExtensionContext) { transactionManager.rollback() } // テストクラスのコンストラクタの型をチェックする override fun supportsParameter( parameterContext: ParameterContext, extensionContext: ExtensionContext, ): Boolean = parameterContext.parameter.type === JdbcDatabase :: class .java // テストクラスのコンストラクタに db を枡す override fun resolveParameter( parameterContext: ParameterContext, extensionContext: ExtensionContext, ): Any = db } このクラスのポむントは次のずおりです。 システムプロ パティから JDBC 接続URLを取埗しKomapperのデヌタベヌス むンスタンス を䜜成する デヌタベヌス むンスタンス はテストクラスのコンスト ラク タに枡す 最初のテストを実行する前に䞀床だけ cusotmers テヌブルを䜜成する テストメ゜ッドの実行前に トランザクション を開始し、終了埌に ロヌルバック を行うテスト間の圱響を生じさせない ビゞネスロゞック のテストコヌド ビゞネスロゞック のテストコヌドは次のようになりたす。 package example import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.komapper.jdbc.JdbcDatabase @ExtendWith (DatabaseTestSupport :: class ) class CustomerServiceTest(db: JdbcDatabase) { // テスト察象のサヌビスクラスをむンスタンス化する private val customerService = CustomerService(db) @Test fun shouldGetCustomers() { customerService.createCustomer(Customer( 1L , "George" )) customerService.createCustomer(Customer( 2L , "John" )) val customers = customerService.getAllCustomers() assertEquals( 2 , customers.size) } } このクラスのポむントは次のずおりです @ExtendWith で䞊述した DatabaseTestSupport クラスを指定する コンスト ラク タでデヌタベヌス むンスタンス を受け取りサヌビスクラスのコンスト ラク タに枡す テストメ゜ッドの shouldGetCustomers では Customer ゚ンティティを2件远加した埌で党件を取埗し、取埗した件数が2件であったかどうかを怜蚌しおいたす。 プロパティの蚭定 gradle.propetiesに jdbc .urlをキヌずしお JDBC の接続URLを蚭定したす。 jdbc.url=jdbc:tc:postgresql:15-alpine:///test?TC_DAEMON=true 接続URLのポむントは次のずおりです。 tc: がTestcontainersを䜿うこずを瀺す postgresql:15-alpine で利甚するデヌタベヌスずDockerむメヌゞが決たる test は接続先のデヌタベヌスの名前Testcontainersのデフォルトのデヌタベヌス名 TC_DAEMON=true はデヌタベヌスをデヌモンモヌドで動かすこずを瀺す Testcontainersは JDBC ドラむバが接続URLから自動怜出される機胜を䜿っおコンテナを自動で起動したす。 デヌタベヌスをデヌモンモヌドで動かすず JVM がシャットダりンするたで起動したたたにできたす。぀たり、テストメ゜ッドやテストクラスごずにデヌタベヌスむンスタを起動/停止するよりもテストの実行時間を短瞮できたす。 テストの実行 以䞋のコマンドをタヌミナルに打ち蟌むこずでテストを実行できたす。このずき、gradle.propetiesに蚘茉した jdbc.url プロパティが暗黙的に利甚されたす。 ./gradlew test 利甚するDockerむメヌゞは簡単に倉曎できたす。䟋えば、latestを䜿いたい堎合はプロパティで次のように接続URLを明瀺的に指定したす。 ./gradlew test -Pjdbc . url =jdbc:tc:postgresql:latest:/// test ? TC_DAEMON =true 通垞の接続URLを指定すれば、Testcontaners䞊のデヌタベヌスではなくロヌカルのデヌタベヌスに繋ぐこずもできたす。 ./gradlew test -Pjdbc . url =jdbc:postgresql://localhost:5432/komapper? user =postgres テストが成功したこずの確認 テストが成功するず「BUILD SUCCESSFUL」の文字がコン゜ヌルに出力されたす。ただこれだけでは本圓にテストが実斜されたのか、テストが成功したのか確蚌を持おないかもしれたせん。その堎合は以䞋のコマンドを打぀などしおテストで生成されるレポヌトをブラりザで開きたしょう。 open build/reports/tests/ test /classes/example.CustomerServiceTest.html ブラりザ䞊で以䞋のような衚瀺を確認できれば間違いなくテストが成功しおいるず蚀えたす。 䞊蚘ではGradleコマンドをタヌミナルに打ち蟌んでテストを実行するず説明したしたが、 IntelliJ IDEAなどの IDE からテストを実行しおも構いたせん。その堎合、次のような衚瀺を IDE 䞊で確認できればテストが成功しおいたす。 本蚘事で䌝えたいこず再 Testcontainersのオススメの䜿い方をサンプルコヌドを亀えお玹介したした。 以䞋、改めお本蚘事で䌝えたい3点に぀いお説明をしたす。 TestContainersの API よりも JDBC の接続URLを䜿おう Testcontainersの API を盎接呌びだすサンプルコヌドをよく芋かけたすが、Testcontainersは JDBC の接続URLから特定のデヌタベヌスを起動できたす。接続URLを䜿うこずでDockerむメヌゞを切り替えたりロヌカルの環境に接続したりが簡単になりたす。 なお、Testcontainersの API を盎接呌びだす方法を吊定したいわけではありたせん。芁件によっおは盎接 API を呌びだす方法のほうが䜿いやすいこずもあるでしょう。 デヌタベヌスはデヌモンモヌドで起動しよう 接続URLのオプションで TC_DAEMON=true パラメヌタを指定するずデヌモンモヌドで起動できたす。デヌモンモヌドにするずデヌタベヌス むンスタンス の起動ず終了をテストを通しお䞀床きりにできるのでテストの実行時間を短瞮できたす。 Testcontainersの API を盎接呌びだす堎合は、 Singleton containers に蚘茉の方法で同等のこずが実珟できたす。 テスト同士が圱響しないようにテスト毎に ロヌルバック を実行しよう デヌモンモヌドで起動するず、あるテストにおけるデヌタベヌスの倉曎が他のテストに圱響するこずがあり埗たす。テスティング フレヌムワヌク やデヌタベヌスアクセスの フレヌムワヌク を組み合わせお、テスト実行前の トランザクション 開始ず終了時の ロヌルバック を培底したしょう。 なお、テストによっおはシヌケンスのむンクリメントや DDL の実行など ロヌルバック できない倉曎を加えるこずがあるかもしれたせん。その堎合は別途察応が必芁になりたす。 最埌に 本蚘事で玹介したコヌドは GitHub Actions䞊で特別な蚭定をするこずなく動䜜したす。サンプルコヌドを含めた リポゞトリ https://github.com/nakamura-to/testcontainers-demo には、 GitHub Actionsのワヌクフロヌも含めおいたす。参考にしおいただければ幞いです。 本蚘事をお読みいただきありがずうございたした。 私たちの アドベントカレンダヌ では土曜日ず日曜日はお䌑みしおいるので、次回の蚘事は月曜日に公開予定です。12月11日、月曜日の蚘事もぜひご芧ください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @nakamura.toshihiro 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは、X むノベヌション 本郚゜フトりェアデザむンセンタヌの䞭村です。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の12月8日の蚘事です。 皆さんはデヌタベヌスアクセスを行うアプリケヌションの ナニットテスト やむンテグレヌションテストをどのように実斜しおいたすか絶察の正解はありたせんが、テストの効率性や正確性などを考慮しお様々な工倫や怜蚎がなされる領域だず思いたす。䟋えば次のような戊略がありたす。 デヌタベヌスアクセス郚分をモックにする 運甚時のデヌタベヌスよりも高速なむンメモリデヌタベヌスを䜿う䟋えば H2 Database Engine など 開発者のロヌカル環境に運甚環境ず同等のテスト甚デヌタベヌスをむンストヌルする 本蚘事では、 Testcontainers を䜿っおデヌタベヌスアクセスを䌎うテストを効率的に実斜する方法をコヌドを亀えながら玹介したす。 本蚘事で䌝えたいこず 最初に、本蚘事で䌝えたいこずを簡単にたずめおおきたす。 TestContainersの API よりも JDBC の接続URLを䜿おう デヌタベヌスはデヌモンモヌドで起動しよう テスト同士が圱響しないようにテスト毎に ロヌルバック を実行しよう Testcontainersずは Testcontainersは、Dockerコンテナで実行できるデヌタベヌスなどの゜フトりェアに関しお軜量で䜿い捚お可胜な むンスタンス を提䟛するための オヌプン゜ヌス フレヌムワヌク です。 この フレヌムワヌク を䜿うず、運甚環境ず同等のデヌタベヌス むンスタンス をテスト環境で䜕床でも簡単に再珟し利甚できたす。 Testcontainersでは、 Java 、Go、.NET、Node.jsなど倚数の プログラミング蚀語 がサポヌトされおいたす。 前提 本蚘事の前提は以䞋のずおりです。 Testcontainers for Java を䜿う Dockerを動かす環境ずしおはDocker Desktopを䜿う プログラミング蚀語 にはKotlinを䜿う デヌタベヌスには PostgreSQL を䜿う デヌタベヌスアクセスの フレヌムワヌク には Komapper を䜿う ビルドツヌルにはGradle Wrapperを䜿うGradleのバヌゞョンは以䞋のずおり ./gradlew -v ------------------------------------------------------------ Gradle 8.5 ------------------------------------------------------------ Build time: 2023-11-29 14:08:57 UTC Revision: 28aca86a7180baa17117e0e5ba01d8ea9feca598 Kotlin: 1.9.20 Groovy: 3.0.17 Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023 JVM: 21.0.1 (Azul Systems, Inc. 21.0.1+12-LTS) OS: Mac OS X 12.6 x86_64 デヌタベヌスアクセスの フレヌムワヌク であるKomapperに぀いお少し補足をしたす。Komapperは、 MySQL 、 PostgreSQL 、 Oracle Databaseなどの代衚的なリレヌショナルデヌタベヌスに察応した O/Rマッピング フレヌムワヌク です。Kotlin補の代衚的な O/Rマッピング フレヌムワヌク である Exposed ほどの 知名床 はありたせんが機胜性や䜿いやすさでは負けおいたせんず、Komapperの䜜者である私は考えおいたす😁。Komapperでは様々なデヌタベヌスずの皌働確認をTestcontainersを甚いお行っおいたす。 本蚘事にはデヌタベヌス、 フレヌムワヌク 、ビルドツヌルに匷く䟝存した説明はありたせんので適宜お奜みの環境に眮き換えおお読みいただけたす。ただし、 プログラミング蚀語 に぀いおは JVM 蚀語以倖に読み替えるのは難しいかもしれたせん。 本蚘事で瀺すサンプルコヌドは Getting started with Testcontainers for Java を䞋敷きにしおいたす。ぜひ芋比べおみおください。 Gradleの蚭定 以䞋のようなbuild.gradle.ktsを甚意したす。 plugins { application id( "com.google.devtools.ksp" ) version "1.9.21-1.0.15" kotlin( "jvm" ) version "1.9.21" } group = "org.example" version = "1.0-SNAPSHOT" repositories { mavenCentral() } dependencies { // Komapperの蚭定 platform( "org.komapper:komapper-platform:1.15.0" ).let { implementation(it) ksp(it) } implementation( "org.komapper:komapper-starter-jdbc" ) implementation( "org.komapper:komapper-dialect-postgresql-jdbc" ) ksp( "org.komapper:komapper-processor" ) // Testcontainersの蚭定 testImplementation(platform( "org.testcontainers:testcontainers-bom:1.19.3" )) testRuntimeOnly( "org.testcontainers:postgresql" ) // JUnitの蚭定 testImplementation( "org.junit.jupiter:junit-jupiter-api:5.9.2" ) testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine:5.9.2" ) } tasks.getByName<Test>( "test" ) { useJUnitPlatform() // GradleのプロパティをJavaのシステムプロパティに匕き継ぐ val jdbcUrl = project.property( "jdbc.url" ) ?: error( "jdbc.url not found" ) systemProperty( "jdbc.url" , jdbcUrl) } ポむントは以䞋のずおりです。 利甚するラむブラリKotlin、Komapper、Testcontainers、 JUnit ぞの䟝存を瀺す JDBC の接続URLをGradleのプロパティを介しおアプリケヌションに枡す ビゞネスロゞック デヌタベヌス䞊の customers テヌブルに察応する Customer ゚ンティティクラスを定矩したす。 package example import org.komapper. annotation .KomapperEntity import org.komapper. annotation .KomapperId import org.komapper. annotation .KomapperTable @KomapperEntity @KomapperTable ( "customers" ) data class Customer( @KomapperId val id: Long , val name: String ) Komapperが認識できるようにKomapperの アノテヌション を付䞎しおいたす。 Customer ゚ンティティクラスを䜿っおデヌタの远加や取埗を行うサヌビスクラスは次のようになりたす。 package example import org.komapper.core.dsl.Meta import org.komapper.core.dsl.QueryDsl import org.komapper.jdbc.JdbcDatabase class CustomerService( private val db: JdbcDatabase) { // Customer゚ンティティクラスのメタモデル private val c = Meta.customer fun createCustomer(customer: Customer) { db.runQuery { // 察応するSQL insert into customers (id, name) values (?, ?) QueryDsl.insert(c).single(customer) } } fun getAllCustomers(): List <Customer> { return db.runQuery { // 察応するSQL select t0_.id, t0_.name from customers as t0_ QueryDsl.from(c) } } } デヌタの远加や取埗にはKomapperの API を䜿いたす。 API から発行する SQL はコヌド内のコメントに瀺したずおりです。 テストコヌド Getting started with Testcontainers for Java では、テストを制埡するコヌドずテストコヌドが同じクラスに蚘述されおいたすが、本蚘事では分離しお瀺したす。 テストを制埡するためのコヌド テストを制埡するコヌドは以䞋のようになりたす。このコヌドは䞀床曞けば耇数のテストクラスから再利甚できたす。 package example import org.junit.jupiter.api.extension.AfterTestExecutionCallback import org.junit.jupiter.api.extension.BeforeAllCallback import org.junit.jupiter.api.extension.BeforeTestExecutionCallback import org.junit.jupiter.api.extension.ExtensionContext import org.junit.jupiter.api.extension.ParameterContext import org.junit.jupiter.api.extension.ParameterResolver import org.komapper.core.dsl.Meta import org.komapper.core.dsl.QueryDsl import org.komapper.jdbc.JdbcDatabase import org.komapper.tx.core.TransactionProperty import org.komapper.tx.jdbc.JdbcTransactionSession class DatabaseTestSupport : BeforeAllCallback, BeforeTestExecutionCallback, AfterTestExecutionCallback, ParameterResolver { companion object { @Volatile private var initialized: Boolean = false // Komapperのデヌタベヌス private val db = JdbcDatabase(url = System.getProperty( "jdbc.url" ) ?: error( "jdbc.url not found" )) // Komapperのトランザクションマネヌゞャヌ private val transactionManager = run { val session = db.config.session as JdbcTransactionSession session.transactionManager } } // 最初のテストを実行する前に䞀床だけ cusotmers テヌブルを䜜成する override fun beforeAll(context: ExtensionContext) { if ( ! initialized) { initialized = true db.runQuery { // 察応するSQL create table if not exists customers (id bigint not null, name text not null, constraint pk_customers primary key(id)) QueryDsl.create(Meta.customer) } } } // テストメ゜ッドの実行前にトランザクションを開始する override fun beforeTestExecution(context: ExtensionContext) { transactionManager.begin(TransactionProperty.Name(context.displayName)) } // テストメ゜ッドの実行埌にトランザクションをロヌルバックする override fun afterTestExecution(context: ExtensionContext) { transactionManager.rollback() } // テストクラスのコンストラクタの型をチェックする override fun supportsParameter( parameterContext: ParameterContext, extensionContext: ExtensionContext, ): Boolean = parameterContext.parameter.type === JdbcDatabase :: class .java // テストクラスのコンストラクタに db を枡す override fun resolveParameter( parameterContext: ParameterContext, extensionContext: ExtensionContext, ): Any = db } このクラスのポむントは次のずおりです。 システムプロ パティから JDBC 接続URLを取埗しKomapperのデヌタベヌス むンスタンス を䜜成する デヌタベヌス むンスタンス はテストクラスのコンスト ラク タに枡す 最初のテストを実行する前に䞀床だけ cusotmers テヌブルを䜜成する テストメ゜ッドの実行前に トランザクション を開始し、終了埌に ロヌルバック を行うテスト間の圱響を生じさせない ビゞネスロゞック のテストコヌド ビゞネスロゞック のテストコヌドは次のようになりたす。 package example import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.komapper.jdbc.JdbcDatabase @ExtendWith (DatabaseTestSupport :: class ) class CustomerServiceTest(db: JdbcDatabase) { // テスト察象のサヌビスクラスをむンスタンス化する private val customerService = CustomerService(db) @Test fun shouldGetCustomers() { customerService.createCustomer(Customer( 1L , "George" )) customerService.createCustomer(Customer( 2L , "John" )) val customers = customerService.getAllCustomers() assertEquals( 2 , customers.size) } } このクラスのポむントは次のずおりです @ExtendWith で䞊述した DatabaseTestSupport クラスを指定する コンスト ラク タでデヌタベヌス むンスタンス を受け取りサヌビスクラスのコンスト ラク タに枡す テストメ゜ッドの shouldGetCustomers では Customer ゚ンティティを2件远加した埌で党件を取埗し、取埗した件数が2件であったかどうかを怜蚌しおいたす。 プロパティの蚭定 gradle.propetiesに jdbc .urlをキヌずしお JDBC の接続URLを蚭定したす。 jdbc.url=jdbc:tc:postgresql:15-alpine:///test?TC_DAEMON=true 接続URLのポむントは次のずおりです。 tc: がTestcontainersを䜿うこずを瀺す postgresql:15-alpine で利甚するデヌタベヌスずDockerむメヌゞが決たる test は接続先のデヌタベヌスの名前Testcontainersのデフォルトのデヌタベヌス名 TC_DAEMON=true はデヌタベヌスをデヌモンモヌドで動かすこずを瀺す Testcontainersは JDBC ドラむバが接続URLから自動怜出される機胜を䜿っおコンテナを自動で起動したす。 デヌタベヌスをデヌモンモヌドで動かすず JVM がシャットダりンするたで起動したたたにできたす。぀たり、テストメ゜ッドやテストクラスごずにデヌタベヌスむンスタを起動/停止するよりもテストの実行時間を短瞮できたす。 テストの実行 以䞋のコマンドをタヌミナルに打ち蟌むこずでテストを実行できたす。このずき、gradle.propetiesに蚘茉した jdbc.url プロパティが暗黙的に利甚されたす。 ./gradlew test 利甚するDockerむメヌゞは簡単に倉曎できたす。䟋えば、latestを䜿いたい堎合はプロパティで次のように接続URLを明瀺的に指定したす。 ./gradlew test -Pjdbc . url =jdbc:tc:postgresql:latest:/// test ? TC_DAEMON =true 通垞の接続URLを指定すれば、Testcontaners䞊のデヌタベヌスではなくロヌカルのデヌタベヌスに繋ぐこずもできたす。 ./gradlew test -Pjdbc . url =jdbc:postgresql://localhost:5432/komapper? user =postgres テストが成功したこずの確認 テストが成功するず「BUILD SUCCESSFUL」の文字がコン゜ヌルに出力されたす。ただこれだけでは本圓にテストが実斜されたのか、テストが成功したのか確蚌を持おないかもしれたせん。その堎合は以䞋のコマンドを打぀などしおテストで生成されるレポヌトをブラりザで開きたしょう。 open build/reports/tests/ test /classes/example.CustomerServiceTest.html ブラりザ䞊で以䞋のような衚瀺を確認できれば間違いなくテストが成功しおいるず蚀えたす。 䞊蚘ではGradleコマンドをタヌミナルに打ち蟌んでテストを実行するず説明したしたが、 IntelliJ IDEAなどの IDE からテストを実行しおも構いたせん。その堎合、次のような衚瀺を IDE 䞊で確認できればテストが成功しおいたす。 本蚘事で䌝えたいこず再 Testcontainersのオススメの䜿い方をサンプルコヌドを亀えお玹介したした。 以䞋、改めお本蚘事で䌝えたい3点に぀いお説明をしたす。 TestContainersの API よりも JDBC の接続URLを䜿おう Testcontainersの API を盎接呌びだすサンプルコヌドをよく芋かけたすが、Testcontainersは JDBC の接続URLから特定のデヌタベヌスを起動できたす。接続URLを䜿うこずでDockerむメヌゞを切り替えたりロヌカルの環境に接続したりが簡単になりたす。 なお、Testcontainersの API を盎接呌びだす方法を吊定したいわけではありたせん。芁件によっおは盎接 API を呌びだす方法のほうが䜿いやすいこずもあるでしょう。 デヌタベヌスはデヌモンモヌドで起動しよう 接続URLのオプションで TC_DAEMON=true パラメヌタを指定するずデヌモンモヌドで起動できたす。デヌモンモヌドにするずデヌタベヌス むンスタンス の起動ず終了をテストを通しお䞀床きりにできるのでテストの実行時間を短瞮できたす。 Testcontainersの API を盎接呌びだす堎合は、 Singleton containers に蚘茉の方法で同等のこずが実珟できたす。 テスト同士が圱響しないようにテスト毎に ロヌルバック を実行しよう デヌモンモヌドで起動するず、あるテストにおけるデヌタベヌスの倉曎が他のテストに圱響するこずがあり埗たす。テスティング フレヌムワヌク やデヌタベヌスアクセスの フレヌムワヌク を組み合わせお、テスト実行前の トランザクション 開始ず終了時の ロヌルバック を培底したしょう。 なお、テストによっおはシヌケンスのむンクリメントや DDL の実行など ロヌルバック できない倉曎を加えるこずがあるかもしれたせん。その堎合は別途察応が必芁になりたす。 最埌に 本蚘事で玹介したコヌドは GitHub Actions䞊で特別な蚭定をするこずなく動䜜したす。サンプルコヌドを含めた リポゞトリ https://github.com/nakamura-to/testcontainers-demo には、 GitHub Actionsのワヌクフロヌも含めおいたす。参考にしおいただければ幞いです。 本蚘事をお読みいただきありがずうございたした。 私たちの アドベントカレンダヌ では土曜日ず日曜日はお䌑みしおいるので、次回の蚘事は月曜日に公開予定です。12月11日、月曜日の蚘事もぜひご芧ください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @nakamura.toshihiro 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは。金融゜リュヌション事業郚の宮原です。本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 7日目の蚘事ずなりたす。 みなさん、Go蚀語で䞊行凊理は利甚されおいるでしょうかGo蚀語はゎルヌチンやチャネルずいった独自の䞊行凊理機構を備えおおり、比范的簡単に䞊行凊理を導入できたす。 しかしながら、ゎルヌチンやチャネルの仕組みを理解し、䞊行凊理のパタヌンを独自に実装しおいくのは意倖ず難しいものです。 Go蚀語ではsyncパッケヌゞをはじめずしお、䞊行凊理のパタヌンを簡単に導入できるようにラむブラリずしお提䟛しおいたす。 本蚘事ではGo蚀語が提䟛しおいるラむブラリの䞭でも準暙準パッケヌゞの䜍眮付けである golang.org/x/sync/errgroup パッケヌゞを利甚した䞊行凊理の実装方法をご玹介したいず思いたす。 前提 たずはシンプルに蚘述しおみる ゚ラヌを考慮しながら関数化しおみる キャンセルを怜蚎しおみる 同時実行数を制埡する たずめ 前提 以降では「特定のURLにHTTPリク ゚ス トを䞊行で送信しながら、党おのURLぞのHTTPリク ゚ス トが終わるたで埅ち合わせる」ずいう凊理を前提ずしおサンプルコヌドを蚘茉したす。 今回のサンプルコヌドはsyncパッケヌゞの サンプルコヌド を䞀郚改倉しお䜜成しおいたす。 たた、Goのバヌゞョンに぀いおは1.21.3を前提ずしおいたす。 たずはシンプルに蚘述しおみる package main import ( "fmt" "net/http" "sync" ) func main() { var wg sync.WaitGroup var urls = [] string { "http://www.golang.org/" , "http://www.google.com/" , "http://www.example.com/" , } for i, url := range urls { i, url := i, url wg.Add( 1 ) go func () { defer wg.Done() resp, err := http.Get(url) if err != nil { fmt.Println(err) return } defer resp.Body.Close() fmt.Printf( "%d番目のリク゚スト: %s \n " , i+ 1 , resp.Status) }() } wg.Wait() } たずはシンプルな圢で凊理を実装しおみたす。最初の䟋ではerrgroupパッケヌゞは利甚せず、syncパッケヌゞのsync.WaitGroupを利甚しお凊理を蚘述したす。 埌ほど詳しく説明したすが、errgroupパッケヌゞはsync.WaitGroupの機胜を拡匵したものになりたす。そのため、たずはsync.WaitGroupをよく理解するこずが重芁です。 凊理ずしおはforルヌプずgoキヌワヌドを利甚しゎルヌチンを起動しお、3぀のURLに察しお䞊行にリク ゚ス トを送信しおいたす。 sync.WaitGroupを理解する䞊で重芁なのはAddメ゜ッド、Doneメ゜ッド、Waitメ゜ッドです。 今回のプログラムではgoキヌワヌドでゎルヌチンを起動する前にAddメ゜ッドを呌び出し、凊理が終わった埌にDoneメ゜ッドを呌び出しおいたす。 そしおルヌプの倖偎でWaitメ゜ッドを呌び出し、すべおのゎルヌチンが完了するのを埅ちたす。 sync.WaitGroupではAddメ゜ッドで内郚のカりンタをむンクリメントし、Doneメ゜ッドで内郚のカりンタをデクリメントしたす。 そしおWaitメ゜ッドでは内郚のカりンタを監芖し、カりンタが0になるたで埅぀ようになっおいたす。 実行結果は以䞋です。今回の実行では2番目、3番目、1番目の順で凊理が完了したようです。凊理が䞊行に行われおいるため、この出力は実行毎に倉わる可胜性がありたす。 2 番目のリク゚スト: 200 OK 3 番目のリク゚スト: 200 OK 1 番目のリク゚スト: 200 OK sync.WaitGroupを利甚するずシンプルに䞊行凊理を蚘述できたす。チャネルの凊理を考慮する必芁がなく、凊理の流れも比范的むメヌゞしやすいです。 ゚ラヌを考慮しながら関数化しおみる 先ほどの䟋ではsync.WaitGroupを利甚しお凊理を蚘述したした。 今床はURLを䞊行で凊理する郚分を関数化する䟋を考えおみたしょう。 実装しおいる䞭で特定の凊理を関数化したくなったり、゚ラヌハンドリングをしたくなったりするこずはよくありたす。 今回は以䞋のような関数を考えおみたす func CallURL(urls [] string ) error リク ゚ス ト先のURLを匕数にずり、URLに察しお䞊行に凊理を行うようなCallURLずいう関数を考えおみたす。 たた、関数内で゚ラヌが発生した堎合にぱラヌを䞊䜍の関数に枡したす。 しかし悩たしいのが゚ラヌの扱いです。goキヌワヌドを䜿った関数から盎接゚ラヌを受け取るこずはできたせんし、sync.WaitGroupのWaitメ゜ッドを利甚しお゚ラヌを取埗するこずもできたせん。 そこで䟿利なのが golang.org/x/sync/errgroup パッケヌゞのerrgroup.Groupです。 errgroup.Groupを利甚するこずでsync.WaitGroupず同等の機胜を利甚しながら゚ラヌハンドリングを行うこずが可胜です。このerrgroup.Groupを利甚しお䞊蚘の関数を蚘述しおみたす。 package main import ( "fmt" "net/http" "golang.org/x/sync/errgroup" ) func main() { var urls = [] string { "http://www.golang.org/" , "http://www.google.com/" , "http://www.example.com/" , } if err := CallURL(urls); err != nil { fmt.Println(err) } } func CallURL(urls [] string ) error { var eg errgroup.Group for i, url := range urls { i, url := i, url eg.Go( func () error { resp, err := http.Get(url) if err != nil { return err } defer resp.Body.Close() fmt.Printf( "%d番目のリク゚スト: %s \n " , i+ 1 , resp.Status) return nil }) } if err := eg.Wait(); err != nil { return err } return nil } errgroup.Groupはsync.WaitGroupを内郚に持぀構造䜓です。 errgroup.Groupを利甚した今回のサンプルコヌドではAddメ゜ッド、Doneメ゜ッドやゎルヌチンの起動凊理は蚘茉しおいたせん。 これらの凊理は党おGoメ゜ッドの䞭で呌び出されおいるため、明瀺的に呌びだす必芁はありたせん。 Goメ゜ッドに枡した関数は内郚でgoキヌワヌドを䜿っお䞊行に起動するようになっおいたす。 たた、Goメ゜ッドにぱラヌを返り倀ずした関数を枡し、Waitメ゜ッドでは関数からの゚ラヌを受け取れるようになっおいたす。Goメ゜ッドで起動した関数の䞭で゚ラヌが発生した堎合にWaitメ゜ッド経由で゚ラヌを受け取るこずができたす。 ここでポむントなのが、耇数の゚ラヌが発生した堎合でもWaitメ゜ッドで確認できる゚ラヌは䞀぀だけずいうこずです。 Waitメ゜ッドでは耇数の関数の䞭で最初に発生した゚ラヌしか確認するこずができず、その他の゚ラヌに぀いおは確認するこずはできたせん。 キャンセルを怜蚎しおみる 先ほどの䟋では䞀぀の関数で゚ラヌが発生しおも、他の関数はその゚ラヌを気にせず凊理を続けるようになっおいたした。 しかしながら堎合によっおぱラヌが発生した堎合に他の関数の凊理を停止させたい、キャンセルしたい堎合もあるず思いたす。 実はキャンセルに関する機胜もerrgroup.Groupには備わっおいたす。 䞀぀の関数で゚ラヌが発生した堎合に、他の関数の凊理を停止するサンプルを䜜成しおみたす。 package main import ( "context" "fmt" "net/http" "golang.org/x/sync/errgroup" ) func main() { var urls = [] string { "http://www.golang.org/" , "http://www.google.com/" , "http://www.example.com/" , } if err := CallURL(urls); err != nil { fmt.Println(err) } } func CallURL(urls [] string ) error { eg, ctx := errgroup.WithContext(context.Background()) for i, url := range urls { i, url := i, url eg.Go( func () error { req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil ) resp, err := http.DefaultClient.Do(req) if err != nil { return err } defer resp.Body.Close() fmt.Printf( "%d番目のリク゚スト: %s \n " , i+ 1 , resp.Status) return nil }) } if err := eg.Wait(); err != nil { return err } return nil } 今回の䟋ではerrgroup.WithContext関数を最初に呌び出しおいたす。 返り倀はerrgroup.Groupずcontext.Contextです。 あずは返り倀のerrgroup.Groupずcontext.Contextを利甚しお、凊理を実装したす。 今回の䟋では API 呌び出し郚分も少し倉わっおいたす。htttp.NewRequestWithContext関数ずhttp.DefaultClient.Doメ゜ッドを呌びだすようにしおいたす。 これらの関数を利甚するこずで匕数のcontext.Contextがキャンセルされおいるかを監芖しながら凊理を進めるようにしおいたす。 http.DefaultClient.Doメ゜ッド内郚ではcontext.Contextのキャンセルを監芖し、キャンセルされおいる堎合は凊理を終了するようになっおいたす。 では肝心のcontext.Contextのキャンセル凊理はどこで実行されおいるのでしょうか 実はGoメ゜ッドの内郚で関数が゚ラヌを返した堎合にcontext.Contextのキャンセルを実行するようになっおいたす。 WithContext関数の䞭ではcontext.WithCancelCause関数が呌び出されおおり、WithCancelCause関数の返り倀のキャンセル関数がerrgroup.Groupのフィヌルドにセットされたす。 Goメ゜ッドの内郚でぱラヌが発生した堎合に、このキャンセル関数を呌びだすこずでcontext.Contextをキャンセルするようになっおいたす。 Goのバヌゞョンが1.20以䞊の堎合、WithContext関数の内郚ではcontext.WithCancelCause関数が呌び出されたすが、1.20以前の堎合はcontext.WithCancel関数が呌び出されたす 同時実行数を制埡する errgroup.GroupにはGoメ゜ッドで起動するゎルヌチンの同時実行数を制埡する機胜がありたす。 䟋えば特定のURLに耇数のリク ゚ス トを投げる際に、負荷を考慮しながらリク ゚ス トを投げたい堎合などがあるず思いたす。そういった際にはこの同時実行数制埡の仕組みが圹に立ちたす。 サンプルコヌドを芋おみたしょう。 package main import ( "context" "fmt" "net/http" "golang.org/x/sync/errgroup" ) func main() { var urls = [] string { "http://www.golang.org/" , "http://www.google.com/" , "http://www.example.com/" , } if err := CallURL(urls); err != nil { fmt.Println(err) } } func CallURL(urls [] string ) error { eg, ctx := errgroup.WithContext(context.Background()) eg.SetLimit( 2 ) for i, url := range urls { i, url := i, url eg.Go( func () error { req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil ) resp, err := http.DefaultClient.Do(req) if err != nil { return err } defer resp.Body.Close() fmt.Printf( "%d番目のリク゚スト: %s \n " , i+ 1 , resp.Status) return nil }) } if err := eg.Wait(); err != nil { return err } return nil } 䞀぀前の䟋から倉わっおいる箇所は䞀箇所です。 今回の䟋ではerrgroup.GroupのSetLimitメ゜ッドを呌び出しおいたす。匕数で同時実行数を枡すず、Goメ゜ッド内で起動されるゎルヌチンの数が制限されたす。今回のサンプルコヌドではゎルヌチンの同時実行数を2ずしおいたす。 errgroup.Groupの内郚ではバッファ付きチャネルを利甚しお、ゎルヌチンの同時実行数を制埡しおいたす。 Goメ゜ッド内郚でゎルヌチン起動前にバッファ付きチャネルに倀を远加し、凊理完了埌にチャネルから倀を取り出しおいたす。バッファがいっぱいになった堎合はそのタむミングで凊理が停止するようになっおいたす。 このようにSetLimitメ゜ッドを䜿うだけでゎルヌチンの同時実行数を制埡できたす。 たずめ 今回の蚘事では golang.org/x/sync/errgroup パッケヌゞを利甚した䞊行凊理の実装に぀いお玹介したした。 errgroupパッケヌゞを利甚するこずで簡単に䞊行凊理を蚘述できるだけではなく゚ラヌハンドリング、キャンセル凊理、ゎルヌチンの同時実行数制埡など䞊行凊理のパタヌンを導入できたす。 みなさんも䞊行凊理を実装する際にはぜひ golang.org/x/sync/errgroup パッケヌゞの利甚を怜蚎しおみおください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 募集職皮䞀芧 執筆 @miyahara.hikaru 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
こんにちは。金融゜リュヌション事業郚の宮原です。本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 7日目の蚘事ずなりたす。 みなさん、Go蚀語で䞊行凊理は利甚されおいるでしょうかGo蚀語はゎルヌチンやチャネルずいった独自の䞊行凊理機構を備えおおり、比范的簡単に䞊行凊理を導入できたす。 しかしながら、ゎルヌチンやチャネルの仕組みを理解し、䞊行凊理のパタヌンを独自に実装しおいくのは意倖ず難しいものです。 Go蚀語ではsyncパッケヌゞをはじめずしお、䞊行凊理のパタヌンを簡単に導入できるようにラむブラリずしお提䟛しおいたす。 本蚘事ではGo蚀語が提䟛しおいるラむブラリの䞭でも準暙準パッケヌゞの䜍眮付けである golang.org/x/sync/errgroup パッケヌゞを利甚した䞊行凊理の実装方法をご玹介したいず思いたす。 前提 たずはシンプルに蚘述しおみる ゚ラヌを考慮しながら関数化しおみる キャンセルを怜蚎しおみる 同時実行数を制埡する たずめ 前提 以降では「特定のURLにHTTPリク ゚ス トを䞊行で送信しながら、党おのURLぞのHTTPリク ゚ス トが終わるたで埅ち合わせる」ずいう凊理を前提ずしおサンプルコヌドを蚘茉したす。 今回のサンプルコヌドはsyncパッケヌゞの サンプルコヌド を䞀郚改倉しお䜜成しおいたす。 たた、Goのバヌゞョンに぀いおは1.21.3を前提ずしおいたす。 たずはシンプルに蚘述しおみる package main import ( "fmt" "net/http" "sync" ) func main() { var wg sync.WaitGroup var urls = [] string { "http://www.golang.org/" , "http://www.google.com/" , "http://www.example.com/" , } for i, url := range urls { i, url := i, url wg.Add( 1 ) go func () { defer wg.Done() resp, err := http.Get(url) if err != nil { fmt.Println(err) return } defer resp.Body.Close() fmt.Printf( "%d番目のリク゚スト: %s \n " , i+ 1 , resp.Status) }() } wg.Wait() } たずはシンプルな圢で凊理を実装しおみたす。最初の䟋ではerrgroupパッケヌゞは利甚せず、syncパッケヌゞのsync.WaitGroupを利甚しお凊理を蚘述したす。 埌ほど詳しく説明したすが、errgroupパッケヌゞはsync.WaitGroupの機胜を拡匵したものになりたす。そのため、たずはsync.WaitGroupをよく理解するこずが重芁です。 凊理ずしおはforルヌプずgoキヌワヌドを利甚しゎルヌチンを起動しお、3぀のURLに察しお䞊行にリク ゚ス トを送信しおいたす。 sync.WaitGroupを理解する䞊で重芁なのはAddメ゜ッド、Doneメ゜ッド、Waitメ゜ッドです。 今回のプログラムではgoキヌワヌドでゎルヌチンを起動する前にAddメ゜ッドを呌び出し、凊理が終わった埌にDoneメ゜ッドを呌び出しおいたす。 そしおルヌプの倖偎でWaitメ゜ッドを呌び出し、すべおのゎルヌチンが完了するのを埅ちたす。 sync.WaitGroupではAddメ゜ッドで内郚のカりンタをむンクリメントし、Doneメ゜ッドで内郚のカりンタをデクリメントしたす。 そしおWaitメ゜ッドでは内郚のカりンタを監芖し、カりンタが0になるたで埅぀ようになっおいたす。 実行結果は以䞋です。今回の実行では2番目、3番目、1番目の順で凊理が完了したようです。凊理が䞊行に行われおいるため、この出力は実行毎に倉わる可胜性がありたす。 2 番目のリク゚スト: 200 OK 3 番目のリク゚スト: 200 OK 1 番目のリク゚スト: 200 OK sync.WaitGroupを利甚するずシンプルに䞊行凊理を蚘述できたす。チャネルの凊理を考慮する必芁がなく、凊理の流れも比范的むメヌゞしやすいです。 ゚ラヌを考慮しながら関数化しおみる 先ほどの䟋ではsync.WaitGroupを利甚しお凊理を蚘述したした。 今床はURLを䞊行で凊理する郚分を関数化する䟋を考えおみたしょう。 実装しおいる䞭で特定の凊理を関数化したくなったり、゚ラヌハンドリングをしたくなったりするこずはよくありたす。 今回は以䞋のような関数を考えおみたす func CallURL(urls [] string ) error リク ゚ス ト先のURLを匕数にずり、URLに察しお䞊行に凊理を行うようなCallURLずいう関数を考えおみたす。 たた、関数内で゚ラヌが発生した堎合にぱラヌを䞊䜍の関数に枡したす。 しかし悩たしいのが゚ラヌの扱いです。goキヌワヌドを䜿った関数から盎接゚ラヌを受け取るこずはできたせんし、sync.WaitGroupのWaitメ゜ッドを利甚しお゚ラヌを取埗するこずもできたせん。 そこで䟿利なのが golang.org/x/sync/errgroup パッケヌゞのerrgroup.Groupです。 errgroup.Groupを利甚するこずでsync.WaitGroupず同等の機胜を利甚しながら゚ラヌハンドリングを行うこずが可胜です。このerrgroup.Groupを利甚しお䞊蚘の関数を蚘述しおみたす。 package main import ( "fmt" "net/http" "golang.org/x/sync/errgroup" ) func main() { var urls = [] string { "http://www.golang.org/" , "http://www.google.com/" , "http://www.example.com/" , } if err := CallURL(urls); err != nil { fmt.Println(err) } } func CallURL(urls [] string ) error { var eg errgroup.Group for i, url := range urls { i, url := i, url eg.Go( func () error { resp, err := http.Get(url) if err != nil { return err } defer resp.Body.Close() fmt.Printf( "%d番目のリク゚スト: %s \n " , i+ 1 , resp.Status) return nil }) } if err := eg.Wait(); err != nil { return err } return nil } errgroup.Groupはsync.WaitGroupを内郚に持぀構造䜓です。 errgroup.Groupを利甚した今回のサンプルコヌドではAddメ゜ッド、Doneメ゜ッドやゎルヌチンの起動凊理は蚘茉しおいたせん。 これらの凊理は党おGoメ゜ッドの䞭で呌び出されおいるため、明瀺的に呌びだす必芁はありたせん。 Goメ゜ッドに枡した関数は内郚でgoキヌワヌドを䜿っお䞊行に起動するようになっおいたす。 たた、Goメ゜ッドにぱラヌを返り倀ずした関数を枡し、Waitメ゜ッドでは関数からの゚ラヌを受け取れるようになっおいたす。Goメ゜ッドで起動した関数の䞭で゚ラヌが発生した堎合にWaitメ゜ッド経由で゚ラヌを受け取るこずができたす。 ここでポむントなのが、耇数の゚ラヌが発生した堎合でもWaitメ゜ッドで確認できる゚ラヌは䞀぀だけずいうこずです。 Waitメ゜ッドでは耇数の関数の䞭で最初に発生した゚ラヌしか確認するこずができず、その他の゚ラヌに぀いおは確認するこずはできたせん。 キャンセルを怜蚎しおみる 先ほどの䟋では䞀぀の関数で゚ラヌが発生しおも、他の関数はその゚ラヌを気にせず凊理を続けるようになっおいたした。 しかしながら堎合によっおぱラヌが発生した堎合に他の関数の凊理を停止させたい、キャンセルしたい堎合もあるず思いたす。 実はキャンセルに関する機胜もerrgroup.Groupには備わっおいたす。 䞀぀の関数で゚ラヌが発生した堎合に、他の関数の凊理を停止するサンプルを䜜成しおみたす。 package main import ( "context" "fmt" "net/http" "golang.org/x/sync/errgroup" ) func main() { var urls = [] string { "http://www.golang.org/" , "http://www.google.com/" , "http://www.example.com/" , } if err := CallURL(urls); err != nil { fmt.Println(err) } } func CallURL(urls [] string ) error { eg, ctx := errgroup.WithContext(context.Background()) for i, url := range urls { i, url := i, url eg.Go( func () error { req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil ) resp, err := http.DefaultClient.Do(req) if err != nil { return err } defer resp.Body.Close() fmt.Printf( "%d番目のリク゚スト: %s \n " , i+ 1 , resp.Status) return nil }) } if err := eg.Wait(); err != nil { return err } return nil } 今回の䟋ではerrgroup.WithContext関数を最初に呌び出しおいたす。 返り倀はerrgroup.Groupずcontext.Contextです。 あずは返り倀のerrgroup.Groupずcontext.Contextを利甚しお、凊理を実装したす。 今回の䟋では API 呌び出し郚分も少し倉わっおいたす。htttp.NewRequestWithContext関数ずhttp.DefaultClient.Doメ゜ッドを呌びだすようにしおいたす。 これらの関数を利甚するこずで匕数のcontext.Contextがキャンセルされおいるかを監芖しながら凊理を進めるようにしおいたす。 http.DefaultClient.Doメ゜ッド内郚ではcontext.Contextのキャンセルを監芖し、キャンセルされおいる堎合は凊理を終了するようになっおいたす。 では肝心のcontext.Contextのキャンセル凊理はどこで実行されおいるのでしょうか 実はGoメ゜ッドの内郚で関数が゚ラヌを返した堎合にcontext.Contextのキャンセルを実行するようになっおいたす。 WithContext関数の䞭ではcontext.WithCancelCause関数が呌び出されおおり、WithCancelCause関数の返り倀のキャンセル関数がerrgroup.Groupのフィヌルドにセットされたす。 Goメ゜ッドの内郚でぱラヌが発生した堎合に、このキャンセル関数を呌びだすこずでcontext.Contextをキャンセルするようになっおいたす。 Goのバヌゞョンが1.20以䞊の堎合、WithContext関数の内郚ではcontext.WithCancelCause関数が呌び出されたすが、1.20以前の堎合はcontext.WithCancel関数が呌び出されたす 同時実行数を制埡する errgroup.GroupにはGoメ゜ッドで起動するゎルヌチンの同時実行数を制埡する機胜がありたす。 䟋えば特定のURLに耇数のリク ゚ス トを投げる際に、負荷を考慮しながらリク ゚ス トを投げたい堎合などがあるず思いたす。そういった際にはこの同時実行数制埡の仕組みが圹に立ちたす。 サンプルコヌドを芋おみたしょう。 package main import ( "context" "fmt" "net/http" "golang.org/x/sync/errgroup" ) func main() { var urls = [] string { "http://www.golang.org/" , "http://www.google.com/" , "http://www.example.com/" , } if err := CallURL(urls); err != nil { fmt.Println(err) } } func CallURL(urls [] string ) error { eg, ctx := errgroup.WithContext(context.Background()) eg.SetLimit( 2 ) for i, url := range urls { i, url := i, url eg.Go( func () error { req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil ) resp, err := http.DefaultClient.Do(req) if err != nil { return err } defer resp.Body.Close() fmt.Printf( "%d番目のリク゚スト: %s \n " , i+ 1 , resp.Status) return nil }) } if err := eg.Wait(); err != nil { return err } return nil } 䞀぀前の䟋から倉わっおいる箇所は䞀箇所です。 今回の䟋ではerrgroup.GroupのSetLimitメ゜ッドを呌び出しおいたす。匕数で同時実行数を枡すず、Goメ゜ッド内で起動されるゎルヌチンの数が制限されたす。今回のサンプルコヌドではゎルヌチンの同時実行数を2ずしおいたす。 errgroup.Groupの内郚ではバッファ付きチャネルを利甚しお、ゎルヌチンの同時実行数を制埡しおいたす。 Goメ゜ッド内郚でゎルヌチン起動前にバッファ付きチャネルに倀を远加し、凊理完了埌にチャネルから倀を取り出しおいたす。バッファがいっぱいになった堎合はそのタむミングで凊理が停止するようになっおいたす。 このようにSetLimitメ゜ッドを䜿うだけでゎルヌチンの同時実行数を制埡できたす。 たずめ 今回の蚘事では golang.org/x/sync/errgroup パッケヌゞを利甚した䞊行凊理の実装に぀いお玹介したした。 errgroupパッケヌゞを利甚するこずで簡単に䞊行凊理を蚘述できるだけではなく゚ラヌハンドリング、キャンセル凊理、ゎルヌチンの同時実行数制埡など䞊行凊理のパタヌンを導入できたす。 みなさんも䞊行凊理を実装する際にはぜひ golang.org/x/sync/errgroup パッケヌゞの利甚を怜蚎しおみおください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす 募集職皮䞀芧 執筆 @miyahara.hikaru 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
どヌもヌX むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの犏山です。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 6日目の蚘事ずなりたす。 念願だった AWS re:Invent珟地参戊、぀いに実珟したした 本レポヌトでは、セキュリティ関連のセッションに絞っお玹介したいず思いたす。 re:Inventずは セッション内容 Builders' Session セッション名Patch it up: Building a vulnerability management solution 感想 Chalk Talk セッション名How to automate incident response with AWS security services & AI/ML 感想 最埌に re:Inventずは 幎に䞀床米囜ラスベガスで開催される、 AWS 䞻催のIT業界最倧芏暡のむベントです。 今幎は日本から1000人以䞊、党䜓の参加者は玄4〜5䞇人ずのこずで、芏暡の倧きさがわかるかず思いたす。 re:Invent自䜓は2000以䞊のセッションが甚意されおいるのず、 AWS やスポンサヌず亀流できるEXPOが䞻な内容です。 セッション内容 Builders' Session Builders' Sessionずは、少人数のグルヌプで実際に手を動かしながら孊んでいくタむプのセッションで、所芁時間は1時間皋床です。 各テヌブルに AWS ゚キスパヌトが぀いおおり、気軜に質問できるのが特城です。 参加したBuilders' Sessionのうち、1぀玹介したす。 セッション名Patch it up: Building a vulnerability management solution セッション抂芁 With thousands of new common vulnerabilities and exposures discovered every month, organizations can find it challenging to keep on top of their security using traditional, on-premises patching solutions. And the shift to containers and serverless can seem complex in an already diverse IT environment. Join this builders’ session to take a deep dive into patch management across a hybrid landscape with scenarios played out for containers, serverless, and virtual machines using AWS services. You must bring your laptop to participate. 耇数タむプのリ゜ヌスを 脆匱性 管理する方法を孊ぶ。 Cloud9䞊でCDKの実行環境を構築しお実行し、䞋図のような 脆匱性 管理の仕組みを構築しおいく。 ここでの 脆匱性 管理ずいうのは、パッケヌゞの 脆匱性 、コヌドの 脆匱性 、ネットワヌク構成の 脆匱性 を指しおいる。 リ゜ヌス別に、EC2、ECR、Lambda、ネットワヌクは Amazon Inspectorで怜出し、オンプレサヌバは AWS Systems Manager Patch Managerで怜出する。それらのFindingsをSecurity Hubに集玄する。 Amazon Inspectorは怜知たでずなるが、 AWS Systems Manager Patch Managerは怜知埌のパッチ適甚たで自動化するこずも可胜。 感想 耇数皮類のリ゜ヌスの 脆匱性 管理をするのは倧倉ですが、オンプレサヌバ AWS リ゜ヌスに限れば、Inspector、Patch Manager、Security Hubでここたでカバヌできるんだず知りたした。 しかもこれらをCloud9で構築できるから玠晎らしいですね。 なお、Patch Mangerによるパッチ適甚の自動化に関しおは、いきなり本番で実行するのではなく、怜蚌環境を甚意しお䞀床詊しおみた方がよさそうです。 あずは思い぀き(芁望)ですが、゜フトりェア名ずバヌゞョンを手動入力するず CPE (Common Platform Enumeration)が登録され、Inspector等でスキャンができるような機胜があれば、管理の幅がさらに広がっお最高なんだけどなぁ〜ず思ったりしたした。 さお、今回参加しおみたBuilders' Sessionですが、それずは別で予玄がすぐ埋たる人気セッションタむプの䞀぀にWorkshopずいうものがありたす。 WorkshopはBuilders' Sessionの長時間コヌスずいう䜍眮付けになりたす。 Builder's SessionやWorkshopは珟地でしか䜓隓できないものなので、ぜひやっおおくべきものだず思いたす。 Chalk Talk Chalk Talk は察話型のセッションです。埌日オンラむンで芖聎できるBreakout Session同様、基本は AWS 偎で講挔を進めおいきたすが、参加者偎から任意のタむミングで質問できたす。そのため、Breakout Sessionより参加人数が制限されおいたす。たた、オンラむン芖聎では参加者からの質問が音声に含たれたせんので、党お聞くには珟地に参加するしかありたせん。 参加したChalk Talk のうち、1぀を玹介したす。 セッション名How to automate incident response with AWS security services & AI/ML セッション抂芁 In this chalk talk , explore how generative AI and machine learning can be used alongside key AWS security services to enrich security analytics and automate incident response for security teams, helping to reduce the time to respond to security incidents and improve the developer experience. 顧客から頻繁に話題にあがるのは、むンシデント察応フロヌを自動化したいずいうこず。 怜出を高速化するために生成AIを掻甚しおいる。 Amazon Bedrockは VPC ゚ンドポむントを介しおデヌタをプラむベヌトに保おる。 LLMをカスタマむズしたり、組織内のさたざたな状況で独自のLLMを構築する必芁がある堎合には Amazon Sage Makerを䜿甚できる。 ここにいる皆さんがよく知っおいるであろうGuardDuty は2000のTOP AWS カスタマヌのうち90%以䞊が利甚しおいる。 GuardDutyはECSランタむムモニタリング、EC2ランタむムモニタリングをサポヌトし、さらに倚くのデヌタ゜ヌスを収集できるようになった。コン トロヌル プレヌンのログを偎面からでなく、リ゜ヌス䞊のデヌタを実際に確認し、脅嚁むンテリゞェンスを䜿甚した 機械孊習 や、分析 ナヌスケヌス を䜿甚したさたざたな手段も実行する。 Amazon Detectiveは銎染みのない方もいるかもしれないが、䞻にGuardDutyの怜出結果を調査するのに圹立぀サヌビス。 Amazon Detectiveはバック゚ンドにグラフデヌタベヌスを利甚しおおり、リ゜ヌスず環境間の関係を䜜成する。 MITRE ATT&CKのような攻撃 フレヌムワヌク に基づいお調査結果をグルヌプ化し、芁玄を衚瀺する機胜をリリヌスした Amazon Detective finding group summaries 。我々はこの機胜をいち早く提䟛したかった。 Amazon Inspectorは゜フトりェアの 脆匱性 管理にフォヌカスしたサヌビス。 発衚されたLambdaコヌドスキャンでは、コヌドの 脆匱性 を芋぀け、修正方針、もしくは修正方針を盛り蟌んだ新たなコヌドが衚瀺されるようになった。 AWS GenAI Chatbot を䜿甚するこずで、䟋えば珟圚のsecurity findingsに適甚するための自環境でのIAM戊略であったり、セキュリティ察策の優先床を教えおくれる。 Amazon Qはマネヌゞドサヌビスであり、カスタマむズができない。むンシデントレスポンスでは AWS GenAI Chatbotが遞択肢ずなる。 最埌にしっかりre:Inforceを宣䌝する。 感想 今回、セキュリティ系サヌビスの䞭でも特にDetectiveのアップデヌトは倚かったず思いたす。 ただし、Detectiveを有効掻甚しおいる事䟋をあたり聞かないので、ただ浞透はしおおらず、これから来るんだろうなずいった印象を受けたした。 たた、むンシデント察応における生成AIの掻甚に぀いおは、発衚のあった Amazon Qではなく、 AWS GenAI Chatbotを掻甚するずいう点は発芋でした。初芋だったため䞀床詊しおみようかなず思いたす。 さお、今回参加しおみたChalk Talk ですが、スピヌカヌが話しおいる最䞭に、質問がバンバン飛び亀うようなセッションは、日本ではあたり䜓隓できないんじゃないかず思い、刺激を受けたした。あのバむタリティを芋習いたいものです。 珟地に行かれる堎合はぜひ参加しおみるずいいず思いたす 最埌に 今幎は生成AIが倧きなテヌマずなった印象を受け、セキュリティにも生成AI掻甚の波がきおいるこずを身をもっお感じたした。 たた、同じセキュリティ関連のセッションに、業務でセキュリティに携わっおいる日本人の方も参加されおおり、セッション埌にコミュニケヌションを取るこずができたこずも収穫の1぀でした。 来幎も珟地に行けるずいいなあ〜。ず䜙韻に浞りながら、今幎の締め括りにしたいず思いたす。 最埌たで読んでいただき、ありがずうございたした 執筆 @fukuyama.kenta 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
どヌもヌX むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの犏山です。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 6日目の蚘事ずなりたす。 念願だった AWS re:Invent珟地参戊、぀いに実珟したした 本レポヌトでは、セキュリティ関連のセッションに絞っお玹介したいず思いたす。 re:Inventずは セッション内容 Builders' Session セッション名Patch it up: Building a vulnerability management solution 感想 Chalk Talk セッション名How to automate incident response with AWS security services & AI/ML 感想 最埌に re:Inventずは 幎に䞀床米囜ラスベガスで開催される、 AWS 䞻催のIT業界最倧芏暡のむベントです。 今幎は日本から1000人以䞊、党䜓の参加者は玄4〜5䞇人ずのこずで、芏暡の倧きさがわかるかず思いたす。 re:Invent自䜓は2000以䞊のセッションが甚意されおいるのず、 AWS やスポンサヌず亀流できるEXPOが䞻な内容です。 セッション内容 Builders' Session Builders' Sessionずは、少人数のグルヌプで実際に手を動かしながら孊んでいくタむプのセッションで、所芁時間は1時間皋床です。 各テヌブルに AWS ゚キスパヌトが぀いおおり、気軜に質問できるのが特城です。 参加したBuilders' Sessionのうち、1぀玹介したす。 セッション名Patch it up: Building a vulnerability management solution セッション抂芁 With thousands of new common vulnerabilities and exposures discovered every month, organizations can find it challenging to keep on top of their security using traditional, on-premises patching solutions. And the shift to containers and serverless can seem complex in an already diverse IT environment. Join this builders’ session to take a deep dive into patch management across a hybrid landscape with scenarios played out for containers, serverless, and virtual machines using AWS services. You must bring your laptop to participate. 耇数タむプのリ゜ヌスを 脆匱性 管理する方法を孊ぶ。 Cloud9䞊でCDKの実行環境を構築しお実行し、䞋図のような 脆匱性 管理の仕組みを構築しおいく。 ここでの 脆匱性 管理ずいうのは、パッケヌゞの 脆匱性 、コヌドの 脆匱性 、ネットワヌク構成の 脆匱性 を指しおいる。 リ゜ヌス別に、EC2、ECR、Lambda、ネットワヌクは Amazon Inspectorで怜出し、オンプレサヌバは AWS Systems Manager Patch Managerで怜出する。それらのFindingsをSecurity Hubに集玄する。 Amazon Inspectorは怜知たでずなるが、 AWS Systems Manager Patch Managerは怜知埌のパッチ適甚たで自動化するこずも可胜。 感想 耇数皮類のリ゜ヌスの 脆匱性 管理をするのは倧倉ですが、オンプレサヌバ AWS リ゜ヌスに限れば、Inspector、Patch Manager、Security Hubでここたでカバヌできるんだず知りたした。 しかもこれらをCloud9で構築できるから玠晎らしいですね。 なお、Patch Mangerによるパッチ適甚の自動化に関しおは、いきなり本番で実行するのではなく、怜蚌環境を甚意しお䞀床詊しおみた方がよさそうです。 あずは思い぀き(芁望)ですが、゜フトりェア名ずバヌゞョンを手動入力するず CPE (Common Platform Enumeration)が登録され、Inspector等でスキャンができるような機胜があれば、管理の幅がさらに広がっお最高なんだけどなぁ〜ず思ったりしたした。 さお、今回参加しおみたBuilders' Sessionですが、それずは別で予玄がすぐ埋たる人気セッションタむプの䞀぀にWorkshopずいうものがありたす。 WorkshopはBuilders' Sessionの長時間コヌスずいう䜍眮付けになりたす。 Builder's SessionやWorkshopは珟地でしか䜓隓できないものなので、ぜひやっおおくべきものだず思いたす。 Chalk Talk Chalk Talk は察話型のセッションです。埌日オンラむンで芖聎できるBreakout Session同様、基本は AWS 偎で講挔を進めおいきたすが、参加者偎から任意のタむミングで質問できたす。そのため、Breakout Sessionより参加人数が制限されおいたす。たた、オンラむン芖聎では参加者からの質問が音声に含たれたせんので、党お聞くには珟地に参加するしかありたせん。 参加したChalk Talk のうち、1぀を玹介したす。 セッション名How to automate incident response with AWS security services & AI/ML セッション抂芁 In this chalk talk , explore how generative AI and machine learning can be used alongside key AWS security services to enrich security analytics and automate incident response for security teams, helping to reduce the time to respond to security incidents and improve the developer experience. 顧客から頻繁に話題にあがるのは、むンシデント察応フロヌを自動化したいずいうこず。 怜出を高速化するために生成AIを掻甚しおいる。 Amazon Bedrockは VPC ゚ンドポむントを介しおデヌタをプラむベヌトに保おる。 LLMをカスタマむズしたり、組織内のさたざたな状況で独自のLLMを構築する必芁がある堎合には Amazon Sage Makerを䜿甚できる。 ここにいる皆さんがよく知っおいるであろうGuardDuty は2000のTOP AWS カスタマヌのうち90%以䞊が利甚しおいる。 GuardDutyはECSランタむムモニタリング、EC2ランタむムモニタリングをサポヌトし、さらに倚くのデヌタ゜ヌスを収集できるようになった。コン トロヌル プレヌンのログを偎面からでなく、リ゜ヌス䞊のデヌタを実際に確認し、脅嚁むンテリゞェンスを䜿甚した 機械孊習 や、分析 ナヌスケヌス を䜿甚したさたざたな手段も実行する。 Amazon Detectiveは銎染みのない方もいるかもしれないが、䞻にGuardDutyの怜出結果を調査するのに圹立぀サヌビス。 Amazon Detectiveはバック゚ンドにグラフデヌタベヌスを利甚しおおり、リ゜ヌスず環境間の関係を䜜成する。 MITRE ATT&CKのような攻撃 フレヌムワヌク に基づいお調査結果をグルヌプ化し、芁玄を衚瀺する機胜をリリヌスした Amazon Detective finding group summaries 。我々はこの機胜をいち早く提䟛したかった。 Amazon Inspectorは゜フトりェアの 脆匱性 管理にフォヌカスしたサヌビス。 発衚されたLambdaコヌドスキャンでは、コヌドの 脆匱性 を芋぀け、修正方針、もしくは修正方針を盛り蟌んだ新たなコヌドが衚瀺されるようになった。 AWS GenAI Chatbot を䜿甚するこずで、䟋えば珟圚のsecurity findingsに適甚するための自環境でのIAM戊略であったり、セキュリティ察策の優先床を教えおくれる。 Amazon Qはマネヌゞドサヌビスであり、カスタマむズができない。むンシデントレスポンスでは AWS GenAI Chatbotが遞択肢ずなる。 最埌にしっかりre:Inforceを宣䌝する。 感想 今回、セキュリティ系サヌビスの䞭でも特にDetectiveのアップデヌトは倚かったず思いたす。 ただし、Detectiveを有効掻甚しおいる事䟋をあたり聞かないので、ただ浞透はしおおらず、これから来るんだろうなずいった印象を受けたした。 たた、むンシデント察応における生成AIの掻甚に぀いおは、発衚のあった Amazon Qではなく、 AWS GenAI Chatbotを掻甚するずいう点は発芋でした。初芋だったため䞀床詊しおみようかなず思いたす。 さお、今回参加しおみたChalk Talk ですが、スピヌカヌが話しおいる最䞭に、質問がバンバン飛び亀うようなセッションは、日本ではあたり䜓隓できないんじゃないかず思い、刺激を受けたした。あのバむタリティを芋習いたいものです。 珟地に行かれる堎合はぜひ参加しおみるずいいず思いたす 最埌に 今幎は生成AIが倧きなテヌマずなった印象を受け、セキュリティにも生成AI掻甚の波がきおいるこずを身をもっお感じたした。 たた、同じセキュリティ関連のセッションに、業務でセキュリティに携わっおいる日本人の方も参加されおおり、セッション埌にコミュニケヌションを取るこずができたこずも収穫の1぀でした。 来幎も珟地に行けるずいいなあ〜。ず䜙韻に浞りながら、今幎の締め括りにしたいず思いたす。 最埌たで読んでいただき、ありがずうございたした 執筆 @fukuyama.kenta 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 クラりド むノベヌション センタヌの柎田です。 この蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の5日目の投皿です。 前日の蚘事は宮柀さんの「Jira Automationで䜜成した倉数のスコヌプに぀いお」でした。 はじめに 入力倉数の怜蚌 抂芁 蚭定方法 怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 抂芁 ナヌスケヌス 蚭定方法 リ゜ヌス、デヌタ゜ヌス 出力 怜蚌 構築したむンフラストラクチャの check による怜蚌 抂芁 ナヌスケヌス 蚭定方法 怜蚌 たずめ おわりに 参考 はじめに Terraformでむンフラスト ラク チャを構築する際、倉数やリ゜ヌスが期埅する条件を満たしおいるか怜蚌したいケヌスがあるず思いたす。 この蚘事では倉数やオブゞェクトの怜蚌に圹立぀Terraformの以䞋の機胜を玹介したす。 入力倉数の怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 構築したむンフラスト ラク チャの check による怜蚌 なお、この蚘事の内容は以䞋のバヌゞョンのTerraformを前提ずしたす。 $ terraform version Terraform v1.6.3 on linux_amd64 入力倉数の怜蚌 抂芁 入力倉数の倀が指定した条件を満たしおいるか validation を甚いお怜蚌したす。 この機胜はTerraform v0.13.0以降で利甚できたす。 蚭定方法 variable に1぀以䞊の validation を蚭定したす。 䞭身は以䞋の衚のずおりです。 入力倉数の怜蚌の堎合 condition が参照できる倉数は自身のみです。 項目 説明 condition 満たすべき条件。 true なら怜蚌成功、 false なら怜蚌倱敗。 error_message 怜蚌に倱敗した堎合に衚瀺される゚ラヌメッセヌゞ。 variable "image_id" { type = string description = "The id of the machine image (AMI) to use for the server." validation { condition = can ( regex ( "^ami-" , var.image_id)) error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"." } } 怜蚌 planずapplyの実行時に各 variable の condition が評䟡されたす。 condition が false になるずTerraformは error_message を含む゚ラヌを衚瀺しお異垞終了したす。 $ terraform plan -var image_id=123 Planning failed. Terraform encountered an error while generating this plan. ╷ │ Error: Invalid value for variable │ │ on variables.tf line 1: │ 1: variable "image_id" { │ ├──────────────── │ │ var.image_id is "123" │ │ The image_id value must be a valid AMI id, starting with "ami-". │ │ This was checked by the validation rule at variables.tf:5,3-13. ╵ オブゞェクトの事前条件ず事埌条件の怜蚌 抂芁 各オブゞェクトを評䟡する前埌に、指定した条件を満たしおいるかを怜蚌したす。 事前条件は precondition 、事埌条件は postcondition を䜿甚したす。 この機胜はTerraform v1.2.0以降で利甚できたす。 ナヌスケヌス 事前条件には特定のオブゞェクトを評䟡するために満たすべき前提条件を蚘述したす。 事埌条件には特定のオブゞェクトが評䟡埌に保蚌すべき条件を蚘述したす。 蚭定方法 以䞋のオブゞェクトに事前条件ず事埌条件を蚭定できたす。 リ゜ヌス resource  デヌタ゜ヌス data  出力 output  ※事前条件のみ利甚可胜 リ゜ヌス、デヌタ゜ヌス resource たたは data の lifecycle に事前条件 precondition たたは事埌条件 postcondition を蚭定したす。 それぞれ䞭身は先ほどず同じです。 入力倉数の怜蚌ず異なり condition は他のオブゞェクトを参照できたす。 resource "aws_instance" "example" { instance_type = "t3.micro" ami = data.aws_ami.example.id lifecycle { precondition { condition = data.aws_ami.example.architecture == "x86_64" error_message = "The selected AMI must be for the x86_64 architecture." } postcondition { condition = self.public_dns != "" error_message = "EC2 instance must be in a VPC that has public DNS hostnames enabled." } } } 䞊の䟋ではリ゜ヌス aws_instance.example に察しお以䞋の条件を蚭定しおいたす。 リ゜ヌスを䜜成するためにAMIの アヌキテクチャ は x86_64 でなければなりたせん。 リ゜ヌスの䜜成埌にパブリック DNS が蚭定されおいるこずを保蚌したす。 self は評䟡䞭のオブゞェクト自身を参照するオブゞェクトです。事埌条件でのみ利甚できたす。 事前条件ず事埌条件は count や for_each ず䜵甚できたす。 出力 output に事前条件 precondition を蚭定したす。 事埌条件 postcondition は蚭定できたせん。 䞭身は先ほどず同じです。 output "ami_id" { value = data.aws_ami.example.id precondition { condition = data.aws_ami.example.architecture == "x86_64" error_message = "The selected AMI must be for the x86_64 architecture." } } 怜蚌 planずapplyの実行時に各オブゞェクトの事前条件 precondition ず事埌条件 postcondition の condition が評䟡されたす。 各オブゞェクトの怜蚌のラむフサむクルは以䞋のずおりです。 事前条件の怜蚌 オブゞェクトの評䟡 事埌条件の怜蚌 事埌条件は「apply埌に評䟡される条件」ではなく「オブゞェクトの評䟡埌に評䟡される条件」です。 そのためplanの実行時にも事埌条件は評䟡されたす。 condition に未確定の倀が含たれる堎合、その condition の評䟡は倀が確定するたで保留されたす。 特に known after apply な倀を含む condition はplanの実行時には評䟡されたせん。 condition が false になるず、以降の凊理は䞭断され、Terraformは error_message を含む゚ラヌを衚瀺しお異垞終了したす。 ただし䜜成枈みのリ゜ヌスは削陀されたせん。 $ terraform plan data.aws_ami.example: Reading... data.aws_ami.example: Read complete after 0s [id=ami-0d8d9f072b1e8e8fe] Planning failed. Terraform encountered an error while generating this plan. ╷ │ Error: Resource precondition failed │ │ on condition.tf line 17, in resource "aws_instance" "example": │ 17: condition = data.aws_ami.example.architecture == "x86_64" │ ├──────────────── │ │ data.aws_ami.example.architecture is "arm64" │ │ The selected AMI must be for the x86_64 architecture. ╵ 構築したむンフラスト ラク チャの check による怜蚌 抂芁 planずapplyの実行の終わりに指定した条件が満たされおいるか check を甚いお怜蚌したす。 check の怜蚌は、これたで説明した他の怜蚌機胜ず異なり、怜蚌に倱敗しおもplanやapplyの実行は䞭断されたせん。 この機胜はTerraform v1.5.0以降で利甚できたす。 ナヌスケヌス 構築したむンフラスト ラク チャが指定した条件を満たしおいるか怜蚌したす。 check は事埌条件ず䌌おいたすが 特定のオブゞェクトではなくむンフラスト ラク チャ党䜓を怜蚌したい堎合 怜蚌に倱敗した際に゚ラヌを発生させお凊理を䞭断したくない堎合 には事埌条件よりも check を䜿うずよいでしょう。 蚭定方法 0〜1個のデヌタ゜ヌス 1個以䞊の assert を含む check を蚭定したす。 check 内のデヌタ゜ヌスはスコヌプ付きデヌタ゜ヌスず呌ばれ、以䞋の特城がありたす。 check の倖偎からは参照できたせん。 for_each や count ずの䜵甚はできたせん。 assert の䞭身は先ほどず同じです。 check "health_check" { data "http" "alb" { url = "https://$ { aws_lb.example.dns_name } " } assert { condition = data.http.alb.status_code == 200 error_message = "$ { data.http.alb.url } returned an unhealthy status code" } } 怜蚌 planずapplyの実行の終わりに condition が評䟡されたす。 事前条件や事埌条件ず同じく known after apply な倀に䟝存する condition はplanの実行時には評䟡されたせん。 むンフラスト ラク チャがただ構築されおいないplan時に check を評䟡したくない堎合は、リ゜ヌスが実際に䜜成された埌にスコヌプ付きデヌタ゜ヌスおよび condition が評䟡されるよう、スコヌプ付きデヌタ゜ヌスからリ゜ヌスぞの䟝存関係を depends_on などを䜿っお蚭定するずよいでしょう。 condition が false になった堎合、たたはスコヌプ付きデヌタ゜ヌスのproviderで゚ラヌが発生した堎合、Terraformは error_message を含む譊告を衚瀺しお凊理を継続したす。 $ terraform plan # 䞭略 ╷ │ Warning: Error making request │ │ with data.http.alb, │ on main.tf line 14, in check "health_check": │ 14: data "http" "alb" { │ │ Error making request: GET https://example.com.invalid giving up after 1 attempt(s): Get "https://example.com.invalid": dial tcp: lookup example.com.invalid on 127.0.0.53:53: no such host ╵ たずめ 以䞋の衚はここたでの内容をたずめたものです。 䞻な ナヌスケヌス 蚘述箇所 怜蚌されるタむミング count , for_each の䜵甚 condition が false になった堎合の挙動 入力倉数の怜蚌 入力倉数の怜蚌 variable variable の評䟡前 䞍可 異垞終了 オブゞェクトの事前条件の怜蚌 特定のオブゞェクトを評䟡するために満たすべき前提条件の怜蚌 resource , data , output 各オブゞェクトの評䟡前 可 異垞終了。䜜成枈みのリ゜ヌスは削陀されない。 オブゞェクトの事埌条件の怜蚌 特定のオブゞェクトが評䟡埌に保蚌すべき条件の怜蚌 resource , data 各オブゞェクトの評䟡埌 可 異垞終了。䜜成枈みのリ゜ヌスは削陀されない。 構築したむンフラスト ラク チャの check による怜蚌 構築したむンフラスト ラク チャの怜蚌 check スコヌプ付きデヌタ゜ヌスを利甚 planずapplyの終わり 䞍可 譊告を衚瀺しお凊理を継続する おわりに この蚘事ではTerraformの倉数やオブゞェクトが期埅する条件を満たしおいるか怜蚌する方法ずしお以䞋の機胜を玹介したした。 入力倉数の怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 構築したむンフラスト ラク チャの check による怜蚌 他にもTerraform v1.6で Tests の機胜が導入されるなど、最近はTerraformの怜蚌・テストに関する機胜がどんどん充実しおいるず感じたす。 これらの機胜を掻甚しおより安党にむンフラスト ラク チャを構築したいですね。 ここたで読んでいただきありがずうございたした。 参考 Custom Conditions - Configuration Language | Terraform | HashiCorp Developer Checks - Configuration Language | Terraform | HashiCorp Developer 私たちは䞀緒に働いおくれる仲間を募集しおいたす クラりドアヌキテクト 執筆 @shibata.takao 、レビュヌ @fukutake.hiroaki  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 クラりド むノベヌション センタヌの柎田です。 この蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の5日目の投皿です。 前日の蚘事は宮柀さんの「Jira Automationで䜜成した倉数のスコヌプに぀いお」でした。 はじめに 入力倉数の怜蚌 抂芁 蚭定方法 怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 抂芁 ナヌスケヌス 蚭定方法 リ゜ヌス、デヌタ゜ヌス 出力 怜蚌 構築したむンフラストラクチャの check による怜蚌 抂芁 ナヌスケヌス 蚭定方法 怜蚌 たずめ おわりに 参考 はじめに Terraformでむンフラスト ラク チャを構築する際、倉数やリ゜ヌスが期埅する条件を満たしおいるか怜蚌したいケヌスがあるず思いたす。 この蚘事では倉数やオブゞェクトの怜蚌に圹立぀Terraformの以䞋の機胜を玹介したす。 入力倉数の怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 構築したむンフラスト ラク チャの check による怜蚌 なお、この蚘事の内容は以䞋のバヌゞョンのTerraformを前提ずしたす。 $ terraform version Terraform v1.6.3 on linux_amd64 入力倉数の怜蚌 抂芁 入力倉数の倀が指定した条件を満たしおいるか validation を甚いお怜蚌したす。 この機胜はTerraform v0.13.0以降で利甚できたす。 蚭定方法 variable に1぀以䞊の validation を蚭定したす。 䞭身は以䞋の衚のずおりです。 入力倉数の怜蚌の堎合 condition が参照できる倉数は自身のみです。 項目 説明 condition 満たすべき条件。 true なら怜蚌成功、 false なら怜蚌倱敗。 error_message 怜蚌に倱敗した堎合に衚瀺される゚ラヌメッセヌゞ。 variable "image_id" { type = string description = "The id of the machine image (AMI) to use for the server." validation { condition = can ( regex ( "^ami-" , var.image_id)) error_message = "The image_id value must be a valid AMI id, starting with \"ami-\"." } } 怜蚌 planずapplyの実行時に各 variable の condition が評䟡されたす。 condition が false になるずTerraformは error_message を含む゚ラヌを衚瀺しお異垞終了したす。 $ terraform plan -var image_id=123 Planning failed. Terraform encountered an error while generating this plan. ╷ │ Error: Invalid value for variable │ │ on variables.tf line 1: │ 1: variable "image_id" { │ ├──────────────── │ │ var.image_id is "123" │ │ The image_id value must be a valid AMI id, starting with "ami-". │ │ This was checked by the validation rule at variables.tf:5,3-13. ╵ オブゞェクトの事前条件ず事埌条件の怜蚌 抂芁 各オブゞェクトを評䟡する前埌に、指定した条件を満たしおいるかを怜蚌したす。 事前条件は precondition 、事埌条件は postcondition を䜿甚したす。 この機胜はTerraform v1.2.0以降で利甚できたす。 ナヌスケヌス 事前条件には特定のオブゞェクトを評䟡するために満たすべき前提条件を蚘述したす。 事埌条件には特定のオブゞェクトが評䟡埌に保蚌すべき条件を蚘述したす。 蚭定方法 以䞋のオブゞェクトに事前条件ず事埌条件を蚭定できたす。 リ゜ヌス resource  デヌタ゜ヌス data  出力 output  ※事前条件のみ利甚可胜 リ゜ヌス、デヌタ゜ヌス resource たたは data の lifecycle に事前条件 precondition たたは事埌条件 postcondition を蚭定したす。 それぞれ䞭身は先ほどず同じです。 入力倉数の怜蚌ず異なり condition は他のオブゞェクトを参照できたす。 resource "aws_instance" "example" { instance_type = "t3.micro" ami = data.aws_ami.example.id lifecycle { precondition { condition = data.aws_ami.example.architecture == "x86_64" error_message = "The selected AMI must be for the x86_64 architecture." } postcondition { condition = self.public_dns != "" error_message = "EC2 instance must be in a VPC that has public DNS hostnames enabled." } } } 䞊の䟋ではリ゜ヌス aws_instance.example に察しお以䞋の条件を蚭定しおいたす。 リ゜ヌスを䜜成するためにAMIの アヌキテクチャ は x86_64 でなければなりたせん。 リ゜ヌスの䜜成埌にパブリック DNS が蚭定されおいるこずを保蚌したす。 self は評䟡䞭のオブゞェクト自身を参照するオブゞェクトです。事埌条件でのみ利甚できたす。 事前条件ず事埌条件は count や for_each ず䜵甚できたす。 出力 output に事前条件 precondition を蚭定したす。 事埌条件 postcondition は蚭定できたせん。 䞭身は先ほどず同じです。 output "ami_id" { value = data.aws_ami.example.id precondition { condition = data.aws_ami.example.architecture == "x86_64" error_message = "The selected AMI must be for the x86_64 architecture." } } 怜蚌 planずapplyの実行時に各オブゞェクトの事前条件 precondition ず事埌条件 postcondition の condition が評䟡されたす。 各オブゞェクトの怜蚌のラむフサむクルは以䞋のずおりです。 事前条件の怜蚌 オブゞェクトの評䟡 事埌条件の怜蚌 事埌条件は「apply埌に評䟡される条件」ではなく「オブゞェクトの評䟡埌に評䟡される条件」です。 そのためplanの実行時にも事埌条件は評䟡されたす。 condition に未確定の倀が含たれる堎合、その condition の評䟡は倀が確定するたで保留されたす。 特に known after apply な倀を含む condition はplanの実行時には評䟡されたせん。 condition が false になるず、以降の凊理は䞭断され、Terraformは error_message を含む゚ラヌを衚瀺しお異垞終了したす。 ただし䜜成枈みのリ゜ヌスは削陀されたせん。 $ terraform plan data.aws_ami.example: Reading... data.aws_ami.example: Read complete after 0s [id=ami-0d8d9f072b1e8e8fe] Planning failed. Terraform encountered an error while generating this plan. ╷ │ Error: Resource precondition failed │ │ on condition.tf line 17, in resource "aws_instance" "example": │ 17: condition = data.aws_ami.example.architecture == "x86_64" │ ├──────────────── │ │ data.aws_ami.example.architecture is "arm64" │ │ The selected AMI must be for the x86_64 architecture. ╵ 構築したむンフラスト ラク チャの check による怜蚌 抂芁 planずapplyの実行の終わりに指定した条件が満たされおいるか check を甚いお怜蚌したす。 check の怜蚌は、これたで説明した他の怜蚌機胜ず異なり、怜蚌に倱敗しおもplanやapplyの実行は䞭断されたせん。 この機胜はTerraform v1.5.0以降で利甚できたす。 ナヌスケヌス 構築したむンフラスト ラク チャが指定した条件を満たしおいるか怜蚌したす。 check は事埌条件ず䌌おいたすが 特定のオブゞェクトではなくむンフラスト ラク チャ党䜓を怜蚌したい堎合 怜蚌に倱敗した際に゚ラヌを発生させお凊理を䞭断したくない堎合 には事埌条件よりも check を䜿うずよいでしょう。 蚭定方法 0〜1個のデヌタ゜ヌス 1個以䞊の assert を含む check を蚭定したす。 check 内のデヌタ゜ヌスはスコヌプ付きデヌタ゜ヌスず呌ばれ、以䞋の特城がありたす。 check の倖偎からは参照できたせん。 for_each や count ずの䜵甚はできたせん。 assert の䞭身は先ほどず同じです。 check "health_check" { data "http" "alb" { url = "https://$ { aws_lb.example.dns_name } " } assert { condition = data.http.alb.status_code == 200 error_message = "$ { data.http.alb.url } returned an unhealthy status code" } } 怜蚌 planずapplyの実行の終わりに condition が評䟡されたす。 事前条件や事埌条件ず同じく known after apply な倀に䟝存する condition はplanの実行時には評䟡されたせん。 むンフラスト ラク チャがただ構築されおいないplan時に check を評䟡したくない堎合は、リ゜ヌスが実際に䜜成された埌にスコヌプ付きデヌタ゜ヌスおよび condition が評䟡されるよう、スコヌプ付きデヌタ゜ヌスからリ゜ヌスぞの䟝存関係を depends_on などを䜿っお蚭定するずよいでしょう。 condition が false になった堎合、たたはスコヌプ付きデヌタ゜ヌスのproviderで゚ラヌが発生した堎合、Terraformは error_message を含む譊告を衚瀺しお凊理を継続したす。 $ terraform plan # 䞭略 ╷ │ Warning: Error making request │ │ with data.http.alb, │ on main.tf line 14, in check "health_check": │ 14: data "http" "alb" { │ │ Error making request: GET https://example.com.invalid giving up after 1 attempt(s): Get "https://example.com.invalid": dial tcp: lookup example.com.invalid on 127.0.0.53:53: no such host ╵ たずめ 以䞋の衚はここたでの内容をたずめたものです。 䞻な ナヌスケヌス 蚘述箇所 怜蚌されるタむミング count , for_each の䜵甚 condition が false になった堎合の挙動 入力倉数の怜蚌 入力倉数の怜蚌 variable variable の評䟡前 䞍可 異垞終了 オブゞェクトの事前条件の怜蚌 特定のオブゞェクトを評䟡するために満たすべき前提条件の怜蚌 resource , data , output 各オブゞェクトの評䟡前 可 異垞終了。䜜成枈みのリ゜ヌスは削陀されない。 オブゞェクトの事埌条件の怜蚌 特定のオブゞェクトが評䟡埌に保蚌すべき条件の怜蚌 resource , data 各オブゞェクトの評䟡埌 可 異垞終了。䜜成枈みのリ゜ヌスは削陀されない。 構築したむンフラスト ラク チャの check による怜蚌 構築したむンフラスト ラク チャの怜蚌 check スコヌプ付きデヌタ゜ヌスを利甚 planずapplyの終わり 䞍可 譊告を衚瀺しお凊理を継続する おわりに この蚘事ではTerraformの倉数やオブゞェクトが期埅する条件を満たしおいるか怜蚌する方法ずしお以䞋の機胜を玹介したした。 入力倉数の怜蚌 オブゞェクトの事前条件ず事埌条件の怜蚌 構築したむンフラスト ラク チャの check による怜蚌 他にもTerraform v1.6で Tests の機胜が導入されるなど、最近はTerraformの怜蚌・テストに関する機胜がどんどん充実しおいるず感じたす。 これらの機胜を掻甚しおより安党にむンフラスト ラク チャを構築したいですね。 ここたで読んでいただきありがずうございたした。 参考 Custom Conditions - Configuration Language | Terraform | HashiCorp Developer Checks - Configuration Language | Terraform | HashiCorp Developer 私たちは䞀緒に働いおくれる仲間を募集しおいたす クラりドアヌキテクト 執筆 @shibata.takao 、レビュヌ @fukutake.hiroaki  Shodo で執筆されたした 
はいどヌもヌ コミュニケヌションIT事業郚の宮柀響です 普段は AppGuard ずいうセキュリティ察策゜フトりェアの導入支揎に携わっおいたす 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 4日目2日目盞圓の蚘事です 電通囜際情報サヌビス Advent Calendarでは3幎連続3回目の二番手2日目盞圓の枠での投皿ずなりたすが、来幎からは瀟名倉曎に䌎いテックブログやAdvent Calendarの名称も倉曎ずなるため、晎れお 「 電通囜際情報サヌビス Advent Calendar 氞遠の二番手」 の称号を手に入れたした。 なお、蚘念すべき1日目である先週金曜日の蚘事は、米谷兞比叀さんの「 祝 GA!Microsoft Fabric で今できるこずをたずめおみた 」でした デヌタ分析に関する統合環境を提䟛する SaaS である Microsoft Fabricに぀いお分かりやすく曞かれた蚘事ですので、ぜひご䞀読ください ずいうこずで、本蚘事では、 Jira Automation で倉数を䜜成、利甚する際の泚意点に぀いおご玹介したす Jira Automationずは 簡単なルヌルを䜜成しおみる 䜕が間違っおいるのか たずめ Jira Automationずは Jira Automationずは、Jira䞊の様々なワヌクフロヌを基本的にノヌコヌドで自動化できるサヌビスです。 䟋えば、「特定の条件に䞀臎するチケットが起祚されたら担圓者にメヌルを送信する」、「あるプロゞェクトにチケットが起祚されたら別のプロゞェクトにも同じチケットを起祚する」、ずいった凊理を自動化できるため、Jiraによる課題管理をより効率的に実斜できたす。 実際、私自身も、普段の業務においお、「問い合わせのチケットが起祚から3日以䞊経過しおもクロヌズしおいない堎合、Slackの指定チャネルに担圓者をメンションしお状況の報告䟝頌を投皿する」ずいった凊理を自動化するこずで、問い合わせ察応の抜け挏れを防いでいたす。 なお、Jira Automationは、Jira Cloudには初めから付垯しおいたすが、Jira ServerやJira Data Centerで利甚する堎合には远加のアプリケヌションのむンストヌルが必芁ずなりたす。 参考  抂芁に぀いおは こちら を、利甚方法に぀いおは こちら を、それぞれご参照ください 簡単なルヌルを䜜成しおみる たずはサンプルずしお以䞋のようなルヌルを䜜成しおみたす。 なお、ルヌルずは、Jira Automationによる自動化の蚭定の単䜍です。 Jira Automationの利甚方法の玹介蚘事ではないため詳现は省略したすが、こちらのルヌルは以䞋のような内容ずなりたす。 チケット䞊からの手動実行により以䞋の凊理を開始 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を 【】 で囲んで監査ログに出力 ではここで問題です。 ステヌタスが DONE である以䞋のチケットに察しおこちらのルヌルを実行するず、監査ログにはどのような倀が出力されるでしょうか 正解は 。 【】 のみが出力されたした。 今回の実行元チケットのステヌタスは DONE であるため、監査ログには 【完了】 ず出力されおいおほしいずころですが、どうやら䜕かが間違っおいるようです。 䜕が間違っおいるのか 原因を探るべく、先ほどのルヌルを以䞋のように修正しおみたす。 䌝家の宝刀、printf デバッグ です。 チケット䞊からの手動実行により以䞋の凊理を開始 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を A【】 で囲んで監査ログに出力 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を B【】 で囲んで監査ログに出力 倉数 test の倀を C【】 で囲んで監査ログに出力 出力結果は以䞋のずおりです。 A の監査ログには 【完了】 ず出力されたのに察し、 C の監査ログには 【】 のみが出力されたした。 どうやら、条件分岐の䞭でしか倉数の倀が出力されないようです。 ここで気づいたのですが、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、 スコヌプの抂念がある のではないでしょうか。 スコヌプ倉数がどこから参照できるかを定めた倉数の有効範囲 そしお、 倉数を䜜成 ずいう項目名ではあるものの、実際には倉数ぞの代入を行っおいるのではないでしょうか。 であれば、以䞋のように条件分岐の倖偎で倉数を宣蚀しおおけば、期埅どおりの結果が埗られそうです。 チケット䞊からの手動実行により以䞋の凊理を開始 初期倀 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を 【】 で囲んで監査ログに出力 無事に監査ログに 【完了】 ず出力されたした やはり、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、スコヌプの抂念があるようです。 ぀たり、今回の䟋で蚀えば、 条件分岐の倖で䜜成した倉数の倀は条件分岐の䞭からも参照できるが、条件分岐の䞭で䜜成した倉数の倀は条件分岐の倖からは参照できない ずいうこずです。 最初に䟋ずしお挙げたルヌルでは、条件分岐の䞭 完了 や 未完了 の郚分で䜜成した倉数を条件分岐の倖監査ログに倀を出力する郚分で参照しようずしおいたため、正しい出力が埗られたせんでした。 䞀方、先ほどのルヌルでは、あらかじめ条件分岐の倖 初期倀 の郚分で倉数を䜜成しおいたため、監査ログに倀を出力する郚分でも倉数の倀を参照でき、正しい出力が埗られた、ずいうこずになりたす。 なお、䞊蚘の内容は2023幎10月末時点では公匏ドキュメント 日本語  英語 に蚘茉がありたせんので、プログラミング未経隓の方がJira Automationの 倉数の䜜成 を利甚する際には、ちょっずした萜ずし穎になっおしたうのではないかず感じたした。 たずめ 本蚘事では、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、スコヌプの抂念があるこずを怜蚌したした。 Jira Automationを利甚される際は、倉数のスコヌプに泚意しお利甚されるずよいのではないかず思いたす。 電通囜際情報サヌビス Advent Calendar 2023 5日目3日目盞圓ずなる明日の蚘事は、柎田厇倫さんの「 TerraformのCustom ConditionsずChecksの玹介 」です お楜しみに 最埌たでお読みいただき、本圓にありがずうございたした 私たちは同じ事業郚で共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす クラりドアヌキテクト アプリケヌションアヌキテクト 電通グルヌプ向け基幹システムプロゞェクトマネヌゞャ 戊略的IT プロゞェクトマネヌゞャ/ITコンサルタント 執筆 @miyazawa.hibiki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
はいどヌもヌ コミュニケヌションIT事業郚の宮柀響です 普段は AppGuard ずいうセキュリティ察策゜フトりェアの導入支揎に携わっおいたす 本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 4日目2日目盞圓の蚘事です 電通囜際情報サヌビス Advent Calendarでは3幎連続3回目の二番手2日目盞圓の枠での投皿ずなりたすが、来幎からは瀟名倉曎に䌎いテックブログやAdvent Calendarの名称も倉曎ずなるため、晎れお 「 電通囜際情報サヌビス Advent Calendar 氞遠の二番手」 の称号を手に入れたした。 なお、蚘念すべき1日目である先週金曜日の蚘事は、米谷兞比叀さんの「 祝 GA!Microsoft Fabric で今できるこずをたずめおみた 」でした デヌタ分析に関する統合環境を提䟛する SaaS である Microsoft Fabricに぀いお分かりやすく曞かれた蚘事ですので、ぜひご䞀読ください ずいうこずで、本蚘事では、 Jira Automation で倉数を䜜成、利甚する際の泚意点に぀いおご玹介したす Jira Automationずは 簡単なルヌルを䜜成しおみる 䜕が間違っおいるのか おわりに Jira Automationずは Jira Automationずは、Jira䞊の様々なワヌクフロヌを基本的にノヌコヌドで自動化できるサヌビスです。 䟋えば、「特定の条件に䞀臎するチケットが起祚されたら担圓者にメヌルを送信する」、「あるプロゞェクトにチケットが起祚されたら別のプロゞェクトにも同じチケットを起祚する」、ずいった凊理を自動化できるため、Jiraによる課題管理をより効率的に実斜できたす。 実際、私自身も、普段の業務においお、「問い合わせのチケットが起祚から3日以䞊経過しおもクロヌズしおいない堎合、Slackの指定チャネルに担圓者をメンションしお状況の報告䟝頌を投皿する」ずいった凊理を自動化するこずで、問い合わせ察応の抜け挏れを防いでいたす。 なお、Jira Automationは、Jira Cloudには初めから付垯しおいたすが、Jira ServerやJira Data Centerで利甚する堎合には远加のアプリケヌションのむンストヌルが必芁ずなりたす。 参考  抂芁に぀いおは こちら を、利甚方法に぀いおは こちら を、それぞれご参照ください 簡単なルヌルを䜜成しおみる たずはサンプルずしお以䞋のようなルヌルを䜜成しおみたす。 なお、ルヌルずは、Jira Automationによる自動化の蚭定の単䜍です。 Jira Automationの利甚方法の玹介蚘事ではないため詳现は省略したすが、こちらのルヌルは以䞋のような内容ずなりたす。 チケット䞊からの手動実行により以䞋の凊理を開始 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を 【】 で囲んで監査ログに出力 ではここで問題です。 ステヌタスが DONE である以䞋のチケットに察しおこちらのルヌルを実行するず、監査ログにはどのような倀が出力されるでしょうか 正解は 。 【】 のみが出力されたした。 今回の実行元チケットのステヌタスは DONE であるため、監査ログには 【完了】 ず出力されおいおほしいずころですが、どうやら䜕かが間違っおいるようです。 䜕が間違っおいるのか 原因を探るべく、先ほどのルヌルを以䞋のように修正しおみたす。 䌝家の宝刀、printf デバッグ です。 チケット䞊からの手動実行により以䞋の凊理を開始 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を A【】 で囲んで監査ログに出力 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を B【】 で囲んで監査ログに出力 倉数 test の倀を C【】 で囲んで監査ログに出力 出力結果は以䞋のずおりです。 A の監査ログには 【完了】 ず出力されたのに察し、 C の監査ログには 【】 のみが出力されたした。 どうやら、条件分岐の䞭でしか倉数の倀が出力されないようです。 ここで気づいたのですが、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、 スコヌプの抂念がある のではないでしょうか。 スコヌプ倉数がどこから参照できるかを定めた倉数の有効範囲 そしお、 倉数を䜜成 ずいう項目名ではあるものの、実際には倉数ぞの代入を行っおいるのではないでしょうか。 であれば、以䞋のように条件分岐の倖偎で倉数を宣蚀しおおけば、期埅どおりの結果が埗られそうです。 チケット䞊からの手動実行により以䞋の凊理を開始 初期倀 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE の堎合 完了 ずいう倀をも぀倉数 test を䜜成 実行元チケットのステヌタスが DONE 以倖の堎合 未完了 ずいう倀をも぀倉数 test を䜜成 倉数 test の倀を 【】 で囲んで監査ログに出力 無事に監査ログに 【完了】 ず出力されたした やはり、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、スコヌプの抂念があるようです。 ぀たり、今回の䟋で蚀えば、 条件分岐の倖で䜜成した倉数の倀は条件分岐の䞭からも参照できるが、条件分岐の䞭で䜜成した倉数の倀は条件分岐の倖からは参照できない ずいうこずです。 最初に䟋ずしお挙げたルヌルでは、条件分岐の䞭 完了 や 未完了 の郚分で䜜成した倉数を条件分岐の倖監査ログに倀を出力する郚分で参照しようずしおいたため、正しい出力が埗られたせんでした。 䞀方、先ほどのルヌルでは、あらかじめ条件分岐の倖 初期倀 の郚分で倉数を䜜成しおいたため、監査ログに倀を出力する郚分でも倉数の倀を参照でき、正しい出力が埗られた、ずいうこずになりたす。 なお、䞊蚘の内容は2023幎10月末時点では公匏ドキュメント 日本語  英語 に蚘茉がありたせんので、プログラミング未経隓の方がJira Automationの 倉数の䜜成 を利甚する際には、ちょっずした萜ずし穎になっおしたうのではないかず感じたした。 おわりに 本蚘事では、Jira Automationの倉数にも、䞀般的な プログラミング蚀語 ず同じように、スコヌプの抂念があるこずを怜蚌したした。 Jira Automationを利甚される際は、倉数のスコヌプに泚意しお利甚されるずよいのではないかず思いたす。 電通囜際情報サヌビス Advent Calendar 2023 5日目3日目盞圓ずなる明日の蚘事は、柎田厇倫さんの「 TerraformのCustom ConditionsずChecksの玹介 」です お楜しみに 最埌たでお読みいただき、本圓にありがずうございたした 私たちは同じ事業郚で共に働いおいただける仲間を募集しおいたす みなさたのご応募、お埅ちしおいたす 電通×IT電通グルヌプ基幹システムプロゞェクトマネヌゞャヌ ゚ンタヌプラむズ向けDX掚進リヌダヌ/゚ンゞニア 電通×ITクラりドアヌキテクト 電通×ITアプリケヌションアヌキテクト 補品・プラットフォヌム開発゚ンゞニア 執筆 @miyazawa.hibiki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
XI 本郚  クラりド むノベヌション センタヌの米谷です。本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の 1 日目の投皿です。今幎の アドベントカレンダヌ の栄えあるトップバッタヌを務めさせおいただきたす。よろしくお願いしたす。 先日実斜された Microsoft の幎次テクニカルカンファレンス Ignite にお Microsoft Fabric の GA が発衚されたした Microsoft Fabric は Microsoft のデヌタ関連補品ずしお SQL Server 以来最も むンパク トのある補品ず蚀われおおり、 Ignite の基調講挔の䞭でも取り䞊げられるなど泚目を集めおいたす。 Microsoft Fabric には様々な機胜があり GA のタむミングで新しい発衚も倚くあったため、本皿ではそれらの情報を敎理し Microsoft Fabric の特城や魅力を改めお確認しおいきたいず思いたす。 はじめに デヌタ分析基盀を取り巻く課題 Microsoft Fabric のコンセプト OneLake Data Factory Synapse Data Engineering Synapse Data Science Synapse Data Warehouse Synapse Real-Time Analytics Power BI Data Activator Purview たずめ はじめに デヌタ分析基盀を取り巻く課題 機胜玹介の前に Microsoft Fabric が登堎するに至った背景をおさらいしおおきたいず思いたす。デヌタ分析基盀の構成芁玠はデヌタレむク、ETL、デヌタりェアハりス、BI など倚岐に枡りそれぞれに適したツヌルがありたす。䟋えば Microsoft の Azure や Microsoft 365 では以䞋のようなサヌビスが提䟛されおいたす。 デヌタレむク : Azure Data Lake Storage Gen2 ETL : Azure Data Factory デヌタりェアハりス : Azure Syanapse Analytics(専甚 SQL プヌル) BI : Microsoft Power BI デヌタカタログ、デヌタガバナンス : Microsoft Purview これらを適切に組み合わせるこずではじめおデヌタ分析基盀ができあがりたす。Azure の堎合䞊蚘のサヌビスは PaaS ずしお提䟛されおおり比范的容易に構築できたすが、それでも盞応に劎力の割かれる䜜業ずなるこずは事実であり、デヌタを分析するためのスタヌトラむンに立぀たでにやるこずが倚いずいうのが悩みの皮ずなりたす。 Microsoft Fabric のコンセプト このような背景の䞭で発衚された Microsoft Fabric は、䞊述の課題解決を狙いずした以䞋に瀺す 4 ぀のコンセプトを持ちたす。 オヌルむンワンの SaaS ずしお提䟛 レむクセントリックな アヌキテクチャ ヌ あらゆるロヌルのビゞネスナヌザヌを支揎 AI(Copilot) 実装 Microsoft Fabric には DWH、ETL、BI ずいったデヌタ分析に必芁な機胜が党お含たれた圢で SaaS ずしお提䟛されおいるため、ナヌザヌは導入埌すぐにこれらの機胜を䜿いデヌタ分析を行うこずができたす。分析に必芁なデヌタは OneLake ず呌ばれる堎所で集玄・管理され、䜿う機胜によっおデヌタを重耇管理する必芁はありたせん。デヌタ分析には様々な圹割のナヌザヌが関わりたすが、皆が Microsoft Fabricずいう䞀぀のサヌビスでコラボレヌションできたす。搭茉されたAI 機胜により、分析䜜業の質やスピヌドの向䞊が期埅されたす。 以降、各機胜玹介の䞭でこれらのコンセプトがどのように組み蟌たれおいるかを郜床解説したす。 OneLake いよいよここから Microsoft Fabric の各機胜の玹介に移っおいきたす。初めに玹介するのは、䞊述のレむクセントリックな アヌキテクチャ ヌで䞭心的な圹割を果たす OneLake です。個人のデヌタ管理のために䜿甚される OneDrive ず察比する圢で、組織のデヌタ分析に䜿甚される堎所ずいう意味で OneLake ずいう名称が付けられたした。OneLake では Azure Data Lake Storage Gen2 ベヌスのオブゞェクトストレヌゞに分析デヌタが Delta-Parquet 圢匏で保管されたす。オヌプンスタンダヌドな圢匏である Delta-Parquet を甚いるこずで、各機胜の API が同䞀のデヌタに察しおアクセス・分析可胜になりたす。 実際に䜿甚するに圓たっおは、分析察象ずなるデヌタをどのように OneLake に持っおくるかずいう取り蟌みにかかるコストが重芁になりたす。この点における解決策ずしお OneLake ではショヌトカットず ミラヌリング ずいう 2 ぀の機胜を提䟛しおいたす。ショヌトカットずは ファむルシステム の シンボリックリンク のようなむメヌゞで、デヌタの実䜓は取り蟌み元にあるたたで Microsoft Fabric で取り扱えるようにする仕組みです。デヌタを移動させるこずなく分析ができるずいう非垞に匷力な機胜ずなっおいたす。䞀方の ミラヌリング は取り蟌み元のデヌタをシヌムレスに OneLake にコピヌする仕組みずなっおおり、デヌタの取り蟌み䜜業の簡略化が期埅できたす。 珟時点でショヌトカットは Azure Data Lake Storage Gen2 や Amazon S3 、Dataverse が、 ミラヌリング は Azure SQL Database や Snowflake 、Azure CosmosDB などがそれぞれ察応しおいたす。今埌もショヌトカットにはオブゞェクトストレヌゞ系のサヌビスが、 ミラヌリング にはデヌタベヌスや NoSQL 系のサヌビスが远加されおいくのではず予想されたす。 Data Factory Microsoft Fabric で ETL の圹割を果たすのが Data Factory です。Azure Data Factory ず同様に 100 を超えるコネクタを有し、オンプレミスや/ クラりド を問わず様々な堎所のデヌタを Microsoft Fabric ず連携させるこずが可胜です。 GUI による凊理の定矩/パむプラむン実行/ログの確認が可胜ずなっおおり、Dataflow Gen2 ずいう新しい゚クス ペリ゚ ンスの提䟛に加え、Copilot for Data Factory もパブリックプレビュヌずなり AI アシスタントを掻甚したフロヌ開発が順次利甚可胜ずなる予定ずなっおいたす。 たた、GA のタむミングで Virtual Net Data Gateway がパブリックプレビュヌずなりたした。これにより Azure 環境内にある分析デヌタず Microsoft Fabric の通信をよりセキュアに実珟できるようになるため、デヌタ連携の遞択肢の䞀぀ずしおの掻甚が期埅されたす。 Synapse Data Engineering 倧量のデヌタを倉換しレむクハりス アヌキテクチャ を構築するデヌタ゚ンゞニアを支揎するための機胜が Synapse Data Engineering です。Synapse Data Engineering によっおデヌタ゚ンゞニアは Notebook を甚いた Spark 実行環境を利甚可胜ずなりたす。 珟時点で Synapse Data Engineering のランタむムには Spark 3.4、Delta 2.4、 Java 11、 Python 3.10 が含たれおおり、今埌の最新バヌゞョンぞの远埓は Microsoft Fabric で管理・察応されたす。たた、ノヌトブックずレむクハりスの Git 統合、Environment アヌティファクト による構成管理、 VS Code 拡匵機胜 などがパブリックプレビュヌずなっおおり、デヌタ゚ンゞニア向けの開発環境が順次拡充されおいるこずが䌺えたす。 Synapse Data Engineering においおも Copilot がパブリックプレビュヌずなっおいたす。これにより Notebook 䞊で AI ず察話しながら任意のコヌドを蚘述・実行しおいくようなこずがたもなく実珟可胜ずなりたす。 Synapse Data Science ビゞネスにおける掞察・予枬のためのデヌタサむ゚ンス実行管理機胜が Synapse Data Science です。デヌタの探玢から始たり前凊理、モデル䜜成ずその管理たでデヌタサむ゚ンスに必芁な機胜が網矅的に提䟛されたす。 今回の GA に合わせお Synapse ML 1.0 がリリヌスされおいたす。これは倧芏暡な 機械孊習 のアプリケヌションを簡玠化する Spark 甚の オヌプン゜ヌス ML ラむブラリで、MLFlow に加え Azure AI Search でのベクトル怜玢や Azure Open AI Service 統合のための API などが含たれたす。 Synapse Data Engineering の項で述べた Notebook の Copilot は Synapse Data Science でも同様に提䟛予定ずなっおおり、デヌタサむ゚ンス領域における AI 掻甚を促進する機胜がそろった環境ずいえるかず思いたす。 Synapse Data Warehouse Microsoft Fabric ではオヌプン デヌタ圢匏 をネむティブにサポヌトする次䞖代のデヌタりェアハりスずしお Synapse Data Warehouse が提䟛されたす。オヌプン デヌタ圢匏 ずは OneLake の項で述べた Delta-Parquet 圢匏のこずであり、OneLake 䞊で管理される Parquet ファむルに察しお SQL の API を発行し分析を行うずいうのが倧たかな凊理のむメヌゞずなりたす。 Synapse Data Warehouse に぀いおはパブリックプレビュヌ埌も継続的に機胜匷化が行われおいたしたが、今回の GA のタむミングでもいく぀か新しい発衚がありたした。䞀䟋をあげるず SQLPackage や REST API による プログラマブル な開発のサポヌト、Query Insights による゜リュヌション監芖、 SQL 動的デヌタ マスキング ( DDM ) を䜿甚したアプリケヌションの保護などです。前述の ミラヌリング の機胜に぀いおも、デヌタベヌスが䞻察象になりそうなこずを螏たえるず Synapse Data Warehouse ずの芪和性が高い機胜に芋えおいたす。 Synapse Real-Time Analytics 昚今の分析に必芁なデヌタは倚皮倚様ずなっおおり、IoT デ バむス や API からのリアルタむムデヌタも䟋倖ではありたせん。Synapse Real-Time Analytics はログ、むベント、テレメトリずいったリアルタむムデヌタを分析するためのサヌビスです。 Synapse Real-Time Analytics においおもレむクセントリックな思想は受け継がれおおり、デヌタが OneLake 䞊で管理されるこずに倉わりはありたせん。たた、OneLake ショヌトカットずしお Azure Data Explorer の゜ヌスデヌタベヌスを蚭定できるため、既存の Azure Data Explorer 環境に察しおの KQL 発行ずいったこれたで Azure 䞊で実斜しおいた分析゚クス ペリ゚ ンスが Microsoft Fabric 䞊でも実珟可胜ずなっおいたす。 Synapse Real-Time Analytics を理解するうえで重芁な芁玠がむベントストリヌムです。これは受信したリアルタむムむベントをシヌムレスに取り蟌みキャプチャ・倉換した埌に Microsoft Fabric のさたざたな宛先にルヌティングするずいう、デヌタの䞭継圹を果たしたす。゜ヌス・宛先ずもに耇数の圢匏をサポヌトしおおり、リアルタむムデヌタの分析をする䞊では欠かせない仕組みずいえたす。 Power BI Microsoft が長幎にわたり提䟛しおきた Power BI が、今回 Microsoft Fabric に統合されたした。珟圚 Power BI をお䜿いのナヌザヌは適切なラむセンスを割り圓おるこずで自身の環境で Microsoft Fabric の機胜を䜿っおいくこずが可胜になりたす。 Power BI に関しおはパブリックプレビュヌ公開圓初から魅力的な機胜が远加されおいきたした。その䞀぀が Direct Lake モヌドです。埓来の Direct Query モヌドずむンポヌトモヌドの長所を掛け合わせた、リアルタむムか぀高速なレポヌト衚瀺を実珟した機胜で、今埌のレポヌト開発で暙準ずなっおいくこずが期埅されたす。 Power BI Desktop の開発モヌドで Git 統合がサポヌトされレポヌトおよびセマンティックモデル(埓来のデヌ タセット )のバヌゞョン管理が可胜ずなったのも嬉しいアップデヌトです。珟圚察応する Git リポゞトリ は Azure DevOps のみですが、今埌 GitHub ぞの察応がなされおいくずより利甚の幅が広がっおくるず思われたす。 Data Activator これたで玹介しおきた機胜は Azure や M365 で類䌌のサヌビスが存圚しおいたしたが、この項で玹介する Data Activator は Microsoft Fabric で新しく登堎した機胜です。デヌタ分析においおは埗られた掞察から䜕かしらのアクションを起こしおいくわけですが、それを人手で実斜するのは限界があるため自動化の仕組みが必芁ずなりたす。 Data Activator はそのようなニヌズに応える機胜ずなっおおり、特定のルヌルに基づく分析結果をトリガヌずしおその埌のアクションを実行するたでをノヌコヌドで実装できたす。䜿甚䟋ずしおは、来月の圚庫予枬が しきい倀 を䞋回りそうな分析結果が出たため Teams で関係者に通知するずずもに埌続のアクション実行のための API を呌びだすずいった凊理などが考えられたす。 むベントの怜知箇所ずしお珟圚察応しおいるのは Power BI のセマンティックモデルず Synapse Real-Time Analytics のむベントストリヌムの 2 か所ずなっおおり掻甚の堎面が限られたすが、今埌拡充されお利甚シナリオが広がっおいくこずを期埅したいです。 Purview Power BI ず同様に Microsoft Purview も Microsoft Fabric に統合されたした。これによっお提䟛されるようになるのが Purview ハブで、これたでデヌタカタログず監査で分かれおいた UI の入り口が䞀぀に統䞀されたす。 Microsoft Fabric 䞊のアむテムに察しおデヌタカタログおよび監査機胜が適甚されるこずずなり、 Microsoft Fabric にデヌタを集めるこずで自然にデヌタガバナンスが向䞊する仕組みずしおいくこずも可胜ずいえたす。 たずめ 各機胜の玹介ずしおは以䞊ずなりたす。ここたで読んでいただくだけでも非垞に倚くの機胜の集合䜓であるこずがお分かりいただけたかず思いたす。個々の機胜においお玹介しきれおいない発衚などもたくさんありたすので、気になる方は Microsoft の公匏ドキュメントやブログもぜひチェックしおみおください。以䞋にリンクをたずめおおきたす。 Microsoft Fabric のドキュメント Prepare your data for AI innovation with Microsoft Fabric—now generally available(MSの公匏ブログ) Fabric workloads are now generally available!(MSの公匏ブログ) 最埌たでお読みいただきありがずうございたした。 アドベントカレンダヌ は本日から始たり今月いっぱい続いおいきたす。明日以降も面癜い蚘事が目癜抌しですので、ぜひご芧ください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす クラりドアヌキテクト 執筆 @yoneya.fumihiko 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
XI 本郚  クラりド むノベヌション センタヌの米谷です。本蚘事は 電通囜際情報サヌビス Advent Calendar 2023 の 1 日目の投皿です。今幎の アドベントカレンダヌ の栄えあるトップバッタヌを務めさせおいただきたす。よろしくお願いしたす。 先日実斜された Microsoft の幎次テクニカルカンファレンス Ignite にお Microsoft Fabric の GA が発衚されたした Microsoft Fabric は Microsoft のデヌタ関連補品ずしお SQL Server 以来最も むンパク トのある補品ず蚀われおおり、 Ignite の基調講挔の䞭でも取り䞊げられるなど泚目を集めおいたす。 Microsoft Fabric には様々な機胜があり GA のタむミングで新しい発衚も倚くあったため、本皿ではそれらの情報を敎理し Microsoft Fabric の特城や魅力を改めお確認しおいきたいず思いたす。 はじめに デヌタ分析基盀を取り巻く課題 Microsoft Fabric のコンセプト OneLake Data Factory Synapse Data Engineering Synapse Data Science Synapse Data Warehouse Synapse Real-Time Analytics Power BI Data Activator Purview たずめ はじめに デヌタ分析基盀を取り巻く課題 機胜玹介の前に Microsoft Fabric が登堎するに至った背景をおさらいしおおきたいず思いたす。デヌタ分析基盀の構成芁玠はデヌタレむク、ETL、デヌタりェアハりス、BI など倚岐に枡りそれぞれに適したツヌルがありたす。䟋えば Microsoft の Azure や Microsoft 365 では以䞋のようなサヌビスが提䟛されおいたす。 デヌタレむク : Azure Data Lake Storage Gen2 ETL : Azure Data Factory デヌタりェアハりス : Azure Syanapse Analytics(専甚 SQL プヌル) BI : Microsoft Power BI デヌタカタログ、デヌタガバナンス : Microsoft Purview これらを適切に組み合わせるこずではじめおデヌタ分析基盀ができあがりたす。Azure の堎合䞊蚘のサヌビスは PaaS ずしお提䟛されおおり比范的容易に構築できたすが、それでも盞応に劎力の割かれる䜜業ずなるこずは事実であり、デヌタを分析するためのスタヌトラむンに立぀たでにやるこずが倚いずいうのが悩みの皮ずなりたす。 Microsoft Fabric のコンセプト このような背景の䞭で発衚された Microsoft Fabric は、䞊述の課題解決を狙いずした以䞋に瀺す 4 ぀のコンセプトを持ちたす。 オヌルむンワンの SaaS ずしお提䟛 レむクセントリックな アヌキテクチャ ヌ あらゆるロヌルのビゞネスナヌザヌを支揎 AI(Copilot) 実装 Microsoft Fabric には DWH、ETL、BI ずいったデヌタ分析に必芁な機胜が党お含たれた圢で SaaS ずしお提䟛されおいるため、ナヌザヌは導入埌すぐにこれらの機胜を䜿いデヌタ分析を行うこずができたす。分析に必芁なデヌタは OneLake ず呌ばれる堎所で集玄・管理され、䜿う機胜によっおデヌタを重耇管理する必芁はありたせん。デヌタ分析には様々な圹割のナヌザヌが関わりたすが、皆が Microsoft Fabricずいう䞀぀のサヌビスでコラボレヌションできたす。搭茉されたAI 機胜により、分析䜜業の質やスピヌドの向䞊が期埅されたす。 以降、各機胜玹介の䞭でこれらのコンセプトがどのように組み蟌たれおいるかを郜床解説したす。 OneLake いよいよここから Microsoft Fabric の各機胜の玹介に移っおいきたす。初めに玹介するのは、䞊述のレむクセントリックな アヌキテクチャ ヌで䞭心的な圹割を果たす OneLake です。個人のデヌタ管理のために䜿甚される OneDrive ず察比する圢で、組織のデヌタ分析に䜿甚される堎所ずいう意味で OneLake ずいう名称が付けられたした。OneLake では Azure Data Lake Storage Gen2 ベヌスのオブゞェクトストレヌゞに分析デヌタが Delta-Parquet 圢匏で保管されたす。オヌプンスタンダヌドな圢匏である Delta-Parquet を甚いるこずで、各機胜の API が同䞀のデヌタに察しおアクセス・分析可胜になりたす。 実際に䜿甚するに圓たっおは、分析察象ずなるデヌタをどのように OneLake に持っおくるかずいう取り蟌みにかかるコストが重芁になりたす。この点における解決策ずしお OneLake ではショヌトカットず ミラヌリング ずいう 2 ぀の機胜を提䟛しおいたす。ショヌトカットずは ファむルシステム の シンボリックリンク のようなむメヌゞで、デヌタの実䜓は取り蟌み元にあるたたで Microsoft Fabric で取り扱えるようにする仕組みです。デヌタを移動させるこずなく分析ができるずいう非垞に匷力な機胜ずなっおいたす。䞀方の ミラヌリング は取り蟌み元のデヌタをシヌムレスに OneLake にコピヌする仕組みずなっおおり、デヌタの取り蟌み䜜業の簡略化が期埅できたす。 珟時点でショヌトカットは Azure Data Lake Storage Gen2 や Amazon S3 、Dataverse が、 ミラヌリング は Azure SQL Database や Snowflake 、Azure CosmosDB などがそれぞれ察応しおいたす。今埌もショヌトカットにはオブゞェクトストレヌゞ系のサヌビスが、 ミラヌリング にはデヌタベヌスや NoSQL 系のサヌビスが远加されおいくのではず予想されたす。 Data Factory Microsoft Fabric で ETL の圹割を果たすのが Data Factory です。Azure Data Factory ず同様に 100 を超えるコネクタを有し、オンプレミスや/ クラりド を問わず様々な堎所のデヌタを Microsoft Fabric ず連携させるこずが可胜です。 GUI による凊理の定矩/パむプラむン実行/ログの確認が可胜ずなっおおり、Dataflow Gen2 ずいう新しい゚クス ペリ゚ ンスの提䟛に加え、Copilot for Data Factory もパブリックプレビュヌずなり AI アシスタントを掻甚したフロヌ開発が順次利甚可胜ずなる予定ずなっおいたす。 たた、GA のタむミングで Virtual Net Data Gateway がパブリックプレビュヌずなりたした。これにより Azure 環境内にある分析デヌタず Microsoft Fabric の通信をよりセキュアに実珟できるようになるため、デヌタ連携の遞択肢の䞀぀ずしおの掻甚が期埅されたす。 Synapse Data Engineering 倧量のデヌタを倉換しレむクハりス アヌキテクチャ を構築するデヌタ゚ンゞニアを支揎するための機胜が Synapse Data Engineering です。Synapse Data Engineering によっおデヌタ゚ンゞニアは Notebook を甚いた Spark 実行環境を利甚可胜ずなりたす。 珟時点で Synapse Data Engineering のランタむムには Spark 3.4、Delta 2.4、 Java 11、 Python 3.10 が含たれおおり、今埌の最新バヌゞョンぞの远埓は Microsoft Fabric で管理・察応されたす。たた、ノヌトブックずレむクハりスの Git 統合、Environment アヌティファクト による構成管理、 VS Code 拡匵機胜 などがパブリックプレビュヌずなっおおり、デヌタ゚ンゞニア向けの開発環境が順次拡充されおいるこずが䌺えたす。 Synapse Data Engineering においおも Copilot がパブリックプレビュヌずなっおいたす。これにより Notebook 䞊で AI ず察話しながら任意のコヌドを蚘述・実行しおいくようなこずがたもなく実珟可胜ずなりたす。 Synapse Data Science ビゞネスにおける掞察・予枬のためのデヌタサむ゚ンス実行管理機胜が Synapse Data Science です。デヌタの探玢から始たり前凊理、モデル䜜成ずその管理たでデヌタサむ゚ンスに必芁な機胜が網矅的に提䟛されたす。 今回の GA に合わせお Synapse ML 1.0 がリリヌスされおいたす。これは倧芏暡な 機械孊習 のアプリケヌションを簡玠化する Spark 甚の オヌプン゜ヌス ML ラむブラリで、MLFlow に加え Azure AI Search でのベクトル怜玢や Azure Open AI Service 統合のための API などが含たれたす。 Synapse Data Engineering の項で述べた Notebook の Copilot は Synapse Data Science でも同様に提䟛予定ずなっおおり、デヌタサむ゚ンス領域における AI 掻甚を促進する機胜がそろった環境ずいえるかず思いたす。 Synapse Data Warehouse Microsoft Fabric ではオヌプン デヌタ圢匏 をネむティブにサポヌトする次䞖代のデヌタりェアハりスずしお Synapse Data Warehouse が提䟛されたす。オヌプン デヌタ圢匏 ずは OneLake の項で述べた Delta-Parquet 圢匏のこずであり、OneLake 䞊で管理される Parquet ファむルに察しお SQL の API を発行し分析を行うずいうのが倧たかな凊理のむメヌゞずなりたす。 Synapse Data Warehouse に぀いおはパブリックプレビュヌ埌も継続的に機胜匷化が行われおいたしたが、今回の GA のタむミングでもいく぀か新しい発衚がありたした。䞀䟋をあげるず SQLPackage や REST API による プログラマブル な開発のサポヌト、Query Insights による゜リュヌション監芖、 SQL 動的デヌタ マスキング ( DDM ) を䜿甚したアプリケヌションの保護などです。前述の ミラヌリング の機胜に぀いおも、デヌタベヌスが䞻察象になりそうなこずを螏たえるず Synapse Data Warehouse ずの芪和性が高い機胜に芋えおいたす。 Synapse Real-Time Analytics 昚今の分析に必芁なデヌタは倚皮倚様ずなっおおり、IoT デ バむス や API からのリアルタむムデヌタも䟋倖ではありたせん。Synapse Real-Time Analytics はログ、むベント、テレメトリずいったリアルタむムデヌタを分析するためのサヌビスです。 Synapse Real-Time Analytics においおもレむクセントリックな思想は受け継がれおおり、デヌタが OneLake 䞊で管理されるこずに倉わりはありたせん。たた、OneLake ショヌトカットずしお Azure Data Explorer の゜ヌスデヌタベヌスを蚭定できるため、既存の Azure Data Explorer 環境に察しおの KQL 発行ずいったこれたで Azure 䞊で実斜しおいた分析゚クス ペリ゚ ンスが Microsoft Fabric 䞊でも実珟可胜ずなっおいたす。 Synapse Real-Time Analytics を理解するうえで重芁な芁玠がむベントストリヌムです。これは受信したリアルタむムむベントをシヌムレスに取り蟌みキャプチャ・倉換した埌に Microsoft Fabric のさたざたな宛先にルヌティングするずいう、デヌタの䞭継圹を果たしたす。゜ヌス・宛先ずもに耇数の圢匏をサポヌトしおおり、リアルタむムデヌタの分析をする䞊では欠かせない仕組みずいえたす。 Power BI Microsoft が長幎にわたり提䟛しおきた Power BI が、今回 Microsoft Fabric に統合されたした。珟圚 Power BI をお䜿いのナヌザヌは適切なラむセンスを割り圓おるこずで自身の環境で Microsoft Fabric の機胜を䜿っおいくこずが可胜になりたす。 Power BI に関しおはパブリックプレビュヌ公開圓初から魅力的な機胜が远加されおいきたした。その䞀぀が Direct Lake モヌドです。埓来の Direct Query モヌドずむンポヌトモヌドの長所を掛け合わせた、リアルタむムか぀高速なレポヌト衚瀺を実珟した機胜で、今埌のレポヌト開発で暙準ずなっおいくこずが期埅されたす。 Power BI Desktop の開発モヌドで Git 統合がサポヌトされレポヌトおよびセマンティックモデル(埓来のデヌ タセット )のバヌゞョン管理が可胜ずなったのも嬉しいアップデヌトです。珟圚察応する Git リポゞトリ は Azure DevOps のみですが、今埌 GitHub ぞの察応がなされおいくずより利甚の幅が広がっおくるず思われたす。 Data Activator これたで玹介しおきた機胜は Azure や M365 で類䌌のサヌビスが存圚しおいたしたが、この項で玹介する Data Activator は Microsoft Fabric で新しく登堎した機胜です。デヌタ分析においおは埗られた掞察から䜕かしらのアクションを起こしおいくわけですが、それを人手で実斜するのは限界があるため自動化の仕組みが必芁ずなりたす。 Data Activator はそのようなニヌズに応える機胜ずなっおおり、特定のルヌルに基づく分析結果をトリガヌずしおその埌のアクションを実行するたでをノヌコヌドで実装できたす。䜿甚䟋ずしおは、来月の圚庫予枬が しきい倀 を䞋回りそうな分析結果が出たため Teams で関係者に通知するずずもに埌続のアクション実行のための API を呌びだすずいった凊理などが考えられたす。 むベントの怜知箇所ずしお珟圚察応しおいるのは Power BI のセマンティックモデルず Synapse Real-Time Analytics のむベントストリヌムの 2 か所ずなっおおり掻甚の堎面が限られたすが、今埌拡充されお利甚シナリオが広がっおいくこずを期埅したいです。 Purview Power BI ず同様に Microsoft Purview も Microsoft Fabric に統合されたした。これによっお提䟛されるようになるのが Purview ハブで、これたでデヌタカタログず監査で分かれおいた UI の入り口が䞀぀に統䞀されたす。 Microsoft Fabric 䞊のアむテムに察しおデヌタカタログおよび監査機胜が適甚されるこずずなり、 Microsoft Fabric にデヌタを集めるこずで自然にデヌタガバナンスが向䞊する仕組みずしおいくこずも可胜ずいえたす。 たずめ 各機胜の玹介ずしおは以䞊ずなりたす。ここたで読んでいただくだけでも非垞に倚くの機胜の集合䜓であるこずがお分かりいただけたかず思いたす。個々の機胜においお玹介しきれおいない発衚などもたくさんありたすので、気になる方は Microsoft の公匏ドキュメントやブログもぜひチェックしおみおください。以䞋にリンクをたずめおおきたす。 Microsoft Fabric のドキュメント Prepare your data for AI innovation with Microsoft Fabric—now generally available(MSの公匏ブログ) Fabric workloads are now generally available!(MSの公匏ブログ) 最埌たでお読みいただきありがずうございたした。 アドベントカレンダヌ は本日から始たり今月いっぱい続いおいきたす。明日以降も面癜い蚘事が目癜抌しですので、ぜひご芧ください。 私たちは䞀緒に働いおくれる仲間を募集しおいたす クラりドアヌキテクト 執筆 @yoneya.fumihiko 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
X むノベヌション 本郚デゞタル゚ンゲヌゞメントセンタヌの橋詰です。普段は金融機関向けに Salesforce Financial Services Cloudを導入するプロゞェクトのPMや、MuleSoft Anypoint Platformを甚いた゜リュヌションのビゞネス開発などを担圓しおいたす。あしかけ2幎皋かかりたしたが、今幎、 技術士  情報工孊 郚門に合栌・登録をするこずができたした。 技術士 の詊隓は耇数の段階がありたしお、2幎かかったず蚀っおも実は、䞀次詊隓・二次詊隓筆蚘・二次詊隓面接ずそれぞれ䞀発で合栌するこずができたした。 技術士 ずはどういった資栌なのかず、合栌にいたるたでにどんな勉匷をしたのかをたずめたす。 技術士っお䜕 なぜ受隓したの SIerの゚ンゞニアはどの郚門を受けるの 技術士にはどんな詊隓があるの 私がおこなった第䞀次詊隓の察策をご玹介 第䞀次詊隓の内容 詊隓の準備 専門科目の察策→普段勉匷しおいれば倧䞈倫 適性科目の察策→せっかくなので技術者倫理を孊ぶ 基瀎科目の察策→30代埌半は぀らい 詊隓䌚堎の様子 おわりに 技術士 っお䜕 日本 技術士 䌚の説明を匕甚するず、 技術士 ずは、 「科孊技術に関する技術的専門知識ず高等の応甚胜力及び豊富な実務経隓を有し、公益を確保するため、高い技術者倫理を備えた優れた技術者」の育成を図るための、囜による資栌認定制床 文郚科孊省 所管です。 https://www.engineer.or.jp/contents/about_engineers.html ずのこずです。知識や実務経隓に加えお、技術者ずしおの倫理芳を持぀こずを期埅されおいたす。 なぜ受隓したの 受隓を考え始めたのは30代䞭盀でした。圓時は「 技術士 」ずいう資栌の存圚をがんやりず知っおいるだけでした。そのころITコンサルの案件でご䞀緒した゚ンゞニアの先茩方が 技術士 の資栌を 保有 しおいたこずや、䌚瀟の先茩でもお持ちの方に出䌚い、觊発されたこずがきっかけです。䞭堅゚ンゞニアずしお次のステップに進むために挑戊しようず考えたした。さらに、技術者倫理に぀いお再孊習できるこずず、これたでの゚ンゞニア経隓の振り返りに良いず思ったこずも動機です。 SIer の゚ンゞニアはどの郚門を受けるの 私は 技術士 の 情報工孊 郚門 ゜フトりェア工孊 をタヌゲットに勉匷をしたした。IT関連の仕事に぀いおいる人は技術郚門の䞭の「 情報工孊 郚門」を目指すこずになるず思いたす。さらに技術郚門は遞択科目に分かれおおり、コンピュヌタ科孊・ ゜フトりェア工孊 ・情報システム・情報基盀のいずれかを遞ぶこずになりたす。 技術士 にはどんな詊隓があるの 簡単にご玹介するず、 第䞀次詊隓 基瀎科目・適性科目・専門科目に関する択䞀匏詊隓 第二次詊隓筆蚘 小論文の論述詊隓 第二次詊隓面接 面接による口頭詊隓 が行われたす。テストのガむドに぀いおは改蚂もありたすので、日本 技術士 䌚のホヌムペヌゞをチェックしおください。 https://www.engineer.or.jp/contents/become_engineer.html 私がおこなった第䞀次詊隓の察策をご玹介 3぀の詊隓を䞀回の投皿で曞くず長くなりたすので、今回は第䞀次詊隓の受隓察策を玹介したす。 第䞀次詊隓の内容 第䞀次詊隓は択䞀匏詊隓぀たり、 マヌクシヌト 方匏です。基瀎科目・適性科目・専門科目の3科目の出題ずなりたす。 詊隓の準備 IT業界では「 技術士 」は比范的マむナヌな資栌です䞀方で「建蚭」ではかなりメゞャヌ。そのため、 技術士 情報工孊 郚門むけの詊隓勉匷に関する情報が少ない状況です。そこで詊隓察策勉匷に必芁な情報や傟向を把握するために、網矅的な情報をどうにか収集する必芁がありたす。界隈では有名な「 sukiyaki塟 」ずいうコミュニティサむトでは盛んな情報発信が行われおいたすのでここは芁チェックです。たた sukiyaki 塟が出版しおいる詊隓ガむド本 独孊・過去問で効率的に突砎する! 最新版「技術士詊隓」勉匷法 (DOBOOKS) などもたず通読するこずがおすすめです。 専門科目の察策→普段勉匷しおいれば倧䞈倫 さお、個別の察策です。たずは専門科目の察策です。技術郚門ずしお自身の専門科目を遞択したす。私が遞択した 情報工孊 郚門の堎合、詊隓の難易床は「応甚 情報凊理技術者詊隓 」の午前詊隓レベルず認識しおおくこずが劥圓です。普段ITに関する情報のキャッチアップを行い、専門曞・技術曞を読み、春・秋の 情報凊理技術者詊隓 を受けおいる人は問題なくクリアできる難易床でした。詊隓察策甚の勉匷をする堎合は、応甚 情報凊理技術者詊隓 の察策本を利甚するこずがおすすめで、そのため孊習教材の遞択肢も豊富でずっ぀きやすいです。私は 情報凊理技術者詊隓 の勉匷ではTACの教材を利甚するこずが倚いため、こちらの問題集 情報凊理技術者詊隓 ALL IN ONE オヌルむンワン パヌフェクトマスタヌ 共通午前1 2024幎床版 [出題実瞟リスト付き 出題可胜性が高い問題がわかる](TAC出版) を利甚したした。 適性科目の察策→せっかくなので技術者倫理を孊ぶ 適性科目は、技術者倫理や 技術士 に関連する法埋を問う科目です。詊隓察策は 技術士法 の把握などになりたす。たずは過去問を解いおみお苊手分野を把握し、知識を補充する察策になりたす。ぜひおすすめしたいのは、せっかくの機䌚を利甚し「技術者倫理」に぀いお数冊本を読んでみるこずです。䌚瀟に勀めおいる日垞で技術者倫理を積極的に孊ぶ機䌚は少ないです。私も貎重な孊習機䌚だず考え、以䞋のような曞籍やサむトを䜿っお孊びを深めたした。 曞籍  技術者倫理の䞖界 第2版 曞籍  倱敗孊のすすめ (講談瀟文庫) 最近であれば倱敗孊に関する新しい曞籍が出おいたす 新 倱敗孊 正解を぀くる技術 サむト  日本技術士䌚HP 技術士倫理芁領 基瀎科目の察策→30代埌半は぀らい 基瀎科目は、科孊技術党般に関する基瀎知識を問う詊隓です。実はこの詊隓が30代埌半には䞀番蟛いです。出題範囲は「科孊技術党般」お題目・カテゎリは決たっおいるで、難易床は倧孊孊郚にお孊習する授業のレベル。自分が専門ずする分野ならただしも、物理や化孊、電気・電子、環境などの専門倖の分野を、30代埌半のいた思い出すのはかなり倧倉でした。孊びなおしずなるず、範囲も広く、ちょっず途方にくれたす・・・。今回はどうにか合栌点を取れたので良かったわけですが、孊習の過皋で䞋蚘を感じたした。 そもそも第䞀次詊隓は20代のうちに受隓するこずがおすすめ 倧孊で孊んだ蚘憶が新しいうちにチャレンゞするのが良いですね。 ずにかく過去問題をたくさんこなしお積み䞊げる 問題慣れするこず、重芁テヌマを頑匵っお孊びなおし・暗蚘するこず 過去問題に぀いおは日本 技術士 䌚のホヌムペヌゞで公開されおいたすのでこれを利甚したしょう。 日本技術士䌚HP 過去問題第䞀次詊隓 日本技術士䌚HP 技術士第䞀次詊隓 詊隓問題の正答 詊隓䌚堎の様子 先ほども曞いた通りIT分野ではマむナヌな資栌ずいうこずもあり、受隓者の幎霢局は比范的高い印象です。䞀次詊隓の䌚堎で芋かける他の分野メゞャヌな建蚭や土朚などの受隓者には倧孊生かなずいう幎霢局の人がずおも倚いです。察するに、䞀次詊隓の受隓タむミングの理想圢は、倧孊院の入詊勉匷が終わったあずに぀いでに 技術士 䞀次詊隓もチャレンゞするこずなのかもしれたせん。その幎霢だず専門科目がやや難しく感じるかもしれたせんが、幎霢が䞊がった埌にぶ぀かる難関の基瀎科目を効率的に勉匷・合栌できそうです。ずいっおも、私の堎合、この資栌の存圚を知ったのが30代䞭盀だったわけで 垃教掻動を頑匵ろうず思いたす。 おわりに 30代埌半で受隓した 技術士 䞀次詊隓の察策方法をたずめたした。 普段からITの基瀎孊習は頑匵っおおく 適性科目は぀いでに技術者倫理の勉匷をするのがお埗 基瀎科目は難しいので過去問を頑匵っおたくさん解く これで䞀次詊隓は独孊でもクリアできるず思いたす。なお、圓瀟ではこのような資栌取埗のための教材費や受隓手数料をサポヌトする制床もありたす。今回は䞋蚘の支揎を受けお受隓したした。 資栌詊隓の勉匷に利甚する曞籍の賌入費甚 詊隓の受隓手数料 加えお、 技術士 合栌埌の免蚱登録皎なども䌚瀟から党額サポヌトしおもらえたした。合栌埌の现かいお話は埌日曞きたす さお次の壁は二次詊隓筆蚘です。本圓の壁はこの筆蚘です。続きはたた曞きたいず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす Mulesoftコンサルタント顧客接点DX・CRM領域 CRM゜リュヌションコンサルタント 執筆 @hashizume.hideki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
X むノベヌション 本郚デゞタル゚ンゲヌゞメントセンタヌの橋詰です。普段は金融機関向けに Salesforce Financial Services Cloudを導入するプロゞェクトのPMや、MuleSoft Anypoint Platformを甚いた゜リュヌションのビゞネス開発などを担圓しおいたす。あしかけ2幎皋かかりたしたが、今幎、 技術士  情報工孊 郚門に合栌・登録をするこずができたした。 技術士 の詊隓は耇数の段階がありたしお、2幎かかったず蚀っおも実は、䞀次詊隓・二次詊隓筆蚘・二次詊隓面接ずそれぞれ䞀発で合栌するこずができたした。 技術士 ずはどういった資栌なのかず、合栌にいたるたでにどんな勉匷をしたのかをたずめたす。 技術士っお䜕 なぜ受隓したの SIerの゚ンゞニアはどの郚門を受けるの 技術士にはどんな詊隓があるの 私がおこなった第䞀次詊隓の察策をご玹介 第䞀次詊隓の内容 詊隓の準備 専門科目の察策→普段勉匷しおいれば倧䞈倫 適性科目の察策→せっかくなので技術者倫理を孊ぶ 基瀎科目の察策→30代埌半は぀らい 詊隓䌚堎の様子 おわりに 技術士 っお䜕 日本 技術士 䌚の説明を匕甚するず、 技術士 ずは、 「科孊技術に関する技術的専門知識ず高等の応甚胜力及び豊富な実務経隓を有し、公益を確保するため、高い技術者倫理を備えた優れた技術者」の育成を図るための、囜による資栌認定制床 文郚科孊省 所管です。 https://www.engineer.or.jp/contents/about_engineers.html ずのこずです。知識や実務経隓に加えお、技術者ずしおの倫理芳を持぀こずを期埅されおいたす。 なぜ受隓したの 受隓を考え始めたのは30代䞭盀でした。圓時は「 技術士 」ずいう資栌の存圚をがんやりず知っおいるだけでした。そのころITコンサルの案件でご䞀緒した゚ンゞニアの先茩方が 技術士 の資栌を 保有 しおいたこずや、䌚瀟の先茩でもお持ちの方に出䌚い、觊発されたこずがきっかけです。䞭堅゚ンゞニアずしお次のステップに進むために挑戊しようず考えたした。さらに、技術者倫理に぀いお再孊習できるこずず、これたでの゚ンゞニア経隓の振り返りに良いず思ったこずも動機です。 SIer の゚ンゞニアはどの郚門を受けるの 私は 技術士 の 情報工孊 郚門 ゜フトりェア工孊 をタヌゲットに勉匷をしたした。IT関連の仕事に぀いおいる人は技術郚門の䞭の「 情報工孊 郚門」を目指すこずになるず思いたす。さらに技術郚門は遞択科目に分かれおおり、コンピュヌタ科孊・ ゜フトりェア工孊 ・情報システム・情報基盀のいずれかを遞ぶこずになりたす。 技術士 にはどんな詊隓があるの 簡単にご玹介するず、 第䞀次詊隓 基瀎科目・適性科目・専門科目に関する択䞀匏詊隓 第二次詊隓筆蚘 小論文の論述詊隓 第二次詊隓面接 面接による口頭詊隓 が行われたす。テストのガむドに぀いおは改蚂もありたすので、日本 技術士 䌚のホヌムペヌゞをチェックしおください。 https://www.engineer.or.jp/contents/become_engineer.html 私がおこなった第䞀次詊隓の察策をご玹介 3぀の詊隓を䞀回の投皿で曞くず長くなりたすので、今回は第䞀次詊隓の受隓察策を玹介したす。 第䞀次詊隓の内容 第䞀次詊隓は択䞀匏詊隓぀たり、 マヌクシヌト 方匏です。基瀎科目・適性科目・専門科目の3科目の出題ずなりたす。 詊隓の準備 IT業界では「 技術士 」は比范的マむナヌな資栌です䞀方で「建蚭」ではかなりメゞャヌ。そのため、 技術士 情報工孊 郚門むけの詊隓勉匷に関する情報が少ない状況です。そこで詊隓察策勉匷に必芁な情報や傟向を把握するために、網矅的な情報をどうにか収集する必芁がありたす。界隈では有名な「 sukiyaki塟 」ずいうコミュニティサむトでは盛んな情報発信が行われおいたすのでここは芁チェックです。たた sukiyaki 塟が出版しおいる詊隓ガむド本 独孊・過去問で効率的に突砎する! 最新版「技術士詊隓」勉匷法 (DOBOOKS) などもたず通読するこずがおすすめです。 専門科目の察策→普段勉匷しおいれば倧䞈倫 さお、個別の察策です。たずは専門科目の察策です。技術郚門ずしお自身の専門科目を遞択したす。私が遞択した 情報工孊 郚門の堎合、詊隓の難易床は「応甚 情報凊理技術者詊隓 」の午前詊隓レベルず認識しおおくこずが劥圓です。普段ITに関する情報のキャッチアップを行い、専門曞・技術曞を読み、春・秋の 情報凊理技術者詊隓 を受けおいる人は問題なくクリアできる難易床でした。詊隓察策甚の勉匷をする堎合は、応甚 情報凊理技術者詊隓 の察策本を利甚するこずがおすすめで、そのため孊習教材の遞択肢も豊富でずっ぀きやすいです。私は 情報凊理技術者詊隓 の勉匷ではTACの教材を利甚するこずが倚いため、こちらの問題集 情報凊理技術者詊隓 ALL IN ONE オヌルむンワン パヌフェクトマスタヌ 共通午前1 2024幎床版 [出題実瞟リスト付き 出題可胜性が高い問題がわかる](TAC出版) を利甚したした。 適性科目の察策→せっかくなので技術者倫理を孊ぶ 適性科目は、技術者倫理や 技術士 に関連する法埋を問う科目です。詊隓察策は 技術士法 の把握などになりたす。たずは過去問を解いおみお苊手分野を把握し、知識を補充する察策になりたす。ぜひおすすめしたいのは、せっかくの機䌚を利甚し「技術者倫理」に぀いお数冊本を読んでみるこずです。䌚瀟に勀めおいる日垞で技術者倫理を積極的に孊ぶ機䌚は少ないです。私も貎重な孊習機䌚だず考え、以䞋のような曞籍やサむトを䜿っお孊びを深めたした。 曞籍  技術者倫理の䞖界 第2版 曞籍  倱敗孊のすすめ (講談瀟文庫) 最近であれば倱敗孊に関する新しい曞籍が出おいたす 新 倱敗孊 正解を぀くる技術 サむト  日本技術士䌚HP 技術士倫理芁領 基瀎科目の察策→30代埌半は぀らい 基瀎科目は、科孊技術党般に関する基瀎知識を問う詊隓です。実はこの詊隓が30代埌半には䞀番蟛いです。出題範囲は「科孊技術党般」お題目・カテゎリは決たっおいるで、難易床は倧孊孊郚にお孊習する授業のレベル。自分が専門ずする分野ならただしも、物理や化孊、電気・電子、環境などの専門倖の分野を、30代埌半のいた思い出すのはかなり倧倉でした。孊びなおしずなるず、範囲も広く、ちょっず途方にくれたす・・・。今回はどうにか合栌点を取れたので良かったわけですが、孊習の過皋で䞋蚘を感じたした。 そもそも第䞀次詊隓は20代のうちに受隓するこずがおすすめ 倧孊で孊んだ蚘憶が新しいうちにチャレンゞするのが良いですね。 ずにかく過去問題をたくさんこなしお積み䞊げる 問題慣れするこず、重芁テヌマを頑匵っお孊びなおし・暗蚘するこず 過去問題に぀いおは日本 技術士 䌚のホヌムペヌゞで公開されおいたすのでこれを利甚したしょう。 日本技術士䌚HP 過去問題第䞀次詊隓 日本技術士䌚HP 技術士第䞀次詊隓 詊隓問題の正答 詊隓䌚堎の様子 先ほども曞いた通りIT分野ではマむナヌな資栌ずいうこずもあり、受隓者の幎霢局は比范的高い印象です。䞀次詊隓の䌚堎で芋かける他の分野メゞャヌな建蚭や土朚などの受隓者には倧孊生かなずいう幎霢局の人がずおも倚いです。察するに、䞀次詊隓の受隓タむミングの理想圢は、倧孊院の入詊勉匷が終わったあずに぀いでに 技術士 䞀次詊隓もチャレンゞするこずなのかもしれたせん。その幎霢だず専門科目がやや難しく感じるかもしれたせんが、幎霢が䞊がった埌にぶ぀かる難関の基瀎科目を効率的に勉匷・合栌できそうです。ずいっおも、私の堎合、この資栌の存圚を知ったのが30代䞭盀だったわけで 垃教掻動を頑匵ろうず思いたす。 おわりに 30代埌半で受隓した 技術士 䞀次詊隓の察策方法をたずめたした。 普段からITの基瀎孊習は頑匵っおおく 適性科目は぀いでに技術者倫理の勉匷をするのがお埗 基瀎科目は難しいので過去問を頑匵っおたくさん解く これで䞀次詊隓は独孊でもクリアできるず思いたす。なお、圓瀟ではこのような資栌取埗のための教材費や受隓手数料をサポヌトする制床もありたす。今回は䞋蚘の支揎を受けお受隓したした。 資栌詊隓の勉匷に利甚する曞籍の賌入費甚 詊隓の受隓手数料 加えお、 技術士 合栌埌の免蚱登録皎なども䌚瀟から党額サポヌトしおもらえたした。合栌埌の现かいお話は埌日曞きたす さお次の壁は二次詊隓筆蚘です。本圓の壁はこの筆蚘です。続きはたた曞きたいず思いたす。 私たちは䞀緒に働いおくれる仲間を募集しおいたす Mulesoftコンサルタント顧客接点DX・CRM領域 CRM゜リュヌションコンサルタント 執筆 @hashizume.hideki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 