TECH PLAY

電通総研

電通総研 の技術ブログ

å…š836ä»¶

みなさんこんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌの鈎朚です。 この床「 AWS Certified Solutions Architect – Professional以降、SAP-C02」に合栌したした。 この蚘事では孊習した内容や、合栌のために必芁だず感じたこずに぀いおたずめたいず思いたす。 埌半には、若手瀟䌚人歎3幎目の私が、SAP-C02を受怜しお良かったず感じたこずも蚘茉したす。 読んでいただいた方の受怜の参考に、そしお孊習ぞのモチベヌションに぀ながれば幞いです。 筆者に぀いお SAP-C02ずは SAP-C02合栌たでの道のり 孊習時間ず孊習したコンテンツ 曞籍 ①AWS認定資栌詊隓テキスト&問題集 AWS認定゜リュヌションアヌキテクト - プロフェッショナル ②AWS認定゜リュヌションアヌキテクト-プロフェッショナル ~詊隓特性から導き出した挔習問題ず詳现解説 udemy ③Practice Exam AWS Certified Solutions Architect Professional ④【01版】AWS 認定゜リュヌションアヌキテクト プロフェッショナル暡擬詊隓問題集党5回分375問 2回の受怜を通しお 解けなかった問題や苊手に感じた分野の埩習 時間を意識しお問題を解き、詊隓に慣れる 受怜しおよかったこず AWSサヌビスを広く孊ぶこずができた セキュリティやネットワヌク、コンテナ技術など基本的なIT技術の知識を埗るこずができた たずめ 筆者に぀いお 新卒3幎目 業務での AWS 経隓は8ヶ月目以前はフロントアプリケヌション開発に携わっおいたした 珟圚の業務は、 AWS をむンフラ基盀ずした瀟内アプリケヌションを、フロント゚ンド・バック゚ンド・むンフラず党䜓的に開発しおいたす。 SAP-C02ずは SAP-C02の抂芁は以䞋のずおりです。詳しくは 公匏サむト をご芧ください。 Amazon Web Services  AWS の認定資栌プログラムの䞭で、高床な アヌキテクチャ スキルず クラりドコンピュヌティング の専門知識を持぀プロフェッショナル向けの資栌 問題は75問択䞀たたは倚肢遞択匏、詊隓時間は180分 1000点満点で750点が合栌ラむン SAP-C02合栌たでの道のり SAP-C02を受怜するたでに、 AWS 系の資栌は以䞋の2぀を取埗したした。 特にア゜シ゚むト資栌のSAA-C03は、SAP-C02を受怜するにあたりベヌスずなる知識が求められるため、先に受怜しおおくこずをオススメしたす。 AWS Certified Cloud Practitioner (CLF-C01) AWS Certified Solutions Architect – Associate (SAA-C03) 本題のSAP-C02は、1回目の受怜は704点で䞍合栌、2回目の受怜で合栌するこずができたした。 1回目の受怜から2回目の受怜たでに行ったこずは、「2回の受怜を通しお」セクションに蚘茉したす。 孊習時間ず孊習したコンテンツ 孊習時間は、だいたい100 ~ 150時間2時間×週4~5日×3ヶ月くらいかかりたした。 以䞋、孊習に䜿甚した教材を玹介したす。 䞊からオススメの順に䞊んでいたすので、ご参考にしおみおください。 曞籍 ① AWS 認定資栌詊隓テキスト&問題集 AWS 認定゜リュヌションアヌキテクト - プロフェッショナル ⭕出題範囲を広くカバヌしおおり、よく出題される分野をむラストを亀えおたずめおある参考曞です。 孊習のずっかかりずしおオススメです。 🔺本番レベルの問題数が十分ではないため、他の教材で補う必芁がありたす。 ② AWS 認定゜リュヌションアヌキテクト-プロフェッショナル ~詊隓特性から導き出した挔習問題ず詳现解説 ⭕ ①ず比范しお、問題の量ずその解説が充実しおいたす。 ⭕ 巻末に付録しおある暡擬詊隓は本番レベルで、解説も䞁寧です。正解の遞択肢だけでなく、䞍正解の遞択肢がなぜダメなのかに぀いおもわかりやすく解説されおいるため、ずおも圹に立ちたした。 🔺出題範囲が旧詊隓SAP-C01を想定しおおり、新詊隓SAP-C02のカバヌされおいない範囲は他の問題集で補う必芁がありたす。 udemy ③Practice Exam AWS Certified Solutions Architect Professional 英語の問題集で、2.5回分の挔習問題が収録されおいたす。倚少読み取りにくくはありたすが、 Google翻蚳 を䜿甚するこずで英語が埗意でない私でも孊習できたした。翻蚳が怪しいずころは英文に戻しお読み進めおいたした。 ⭕内容ずしおは、実際の詊隓に出題される問題に近い内容の問題が倚く収録されおいる印象です。たた解説欄には、問題に関連する AWS 公匏ドキュメントのリンクが掲茉されおおり、わからないずころはすぐに公匏ドキュメントで調べられおずおも良かったです。 ⭕新詊隓SAP-C02に察応しおおり、本番に近い内容の問題が倚い印象で、英語の問題集ずいうこずを差し匕いおもオススメできる問題集だず思いたした。 ④【01版】 AWS 認定゜リュヌションアヌキテクト プロフェッショナル暡擬詊隓問題集党5回分375問 ⭕ 私が詊隓察策をしおいた際、udemyで日本語の問題集はこれ䞀択でした。5回分の挔習問題が収録されおおり、問題量ずしおは申し分ないでしょう。 5回分の挔習問題が収録されおいるため、詊隓を想定しお時間を意識しお解く緎習をするのがオススメです。 🔺出題範囲が旧詊隓SAP-C01を想定しおおり、新詊隓SAP-C02のカバヌされおいない範囲に぀いおは他の問題集で補う必芁がありたす。 䞊蚘を孊習する䞊で䞍明点が生じた堎合は、たず AWS 公匏ドキュメントを調べたした。 AWS 公匏ドキュメントはずおも充実しおおり、調べたい内容はほずんど文曞化されおいた印象です。 公匏ドキュメントの情報をもずに問題を䜜成しおいるからかもしれたせんが 2回の受怜を通しお 「SAP-C02合栌たでの道のり」で蚘茉した通り、2回目の受怜で合栌したした。1回目の受怜から2回目の受怜たでにしたこずは以䞋のずおりです。 解けなかった問題や苊手に感じた分野の埩習 1回目の詊隓で解けなかった問題や苊手に感じた分野を圓日䞭にメモしおおき、集䞭的に埩習したした。"絶察に合栌した"ずいう確蚌がない限り、受怜盎埌にメモしおおいた方が賢明です。 時間を意識しお問題を解き、詊隓に慣れる SAP-C02は詊隓時間が3時間ありたすが、各問題の文章量がずおも倚いため時間に䜙裕はありたせん。 私は芋盎す時間が党く取れたせんでした そのため「孊習時間ず孊習したコンテンツ」で玹介した③のUdemy教材を新たに孊習し、詊隓のペヌスを掎むこずず長文から顧客芁求を玠早く理解するこずを緎習したした。 受怜しおよかったこず 最埌に、SAP-C02を受怜しお良かったこずは以䞋の2点です。 AWS サヌビスを広く孊ぶこずができた 本詊隓は察象サヌビスの幅が広く、どのようにサヌビスを組み合わせお顧客芁求を達成できるかを問われるため、各サヌビスぞの知識ず理解が深たりたした。 そのおかげで、孊習する前に比べおサヌビス構成図を芋た際にどのようなサヌビスであるかや、サヌビス構成䞊のどこに問題があるかが以前よりわかるようになった気がしたす。 実際に アヌキテクチャ 蚭蚈をしないたでも、レビュヌなどで倧いに圹立぀知識が぀けられたのではないかず思いたす。 セキュリティやネットワヌク、コンテナ技術など基本的な IT技術 の知識を埗るこずができた 若手ずいうこずもあり、セキュリティやネットワヌク、コンテナ技術など基本的な IT技術 の知識が乏しかったためずおも苊戊したした。しかし、SAP-C02の孊習を進めおいくうちに副次的に幅広く知識を぀けるこずができたした。 ア゜シ゚むト資栌ず比べるず、この蟺りの知識がないず解けない問題はたくさんありたす 自分の IT技術 に関する知識の無さに悲しくなるこずもありたしたが、若手の人にこそIT知識の幅を広げるずいう意味でも本資栌に挑戊しおみる䟡倀はあるず思いたす。 たずめ 今回は合栌䜓隓蚘ず題しお、孊習した内容や孊習しお良かったこずを玹介いたしたした。 孊習は倧倉でしたが、 AWS サヌビスをより深く孊ぶこずができ、 IT技術 の知芋を広げるこずができたした。 読んでいただいた皆さんの参考に少しでもなれれば幞いです。 最埌たでお読みいただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @suzuki.takuma 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
みなさんこんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌの鈎朚です。 この床「 AWS Certified Solutions Architect – Professional以降、SAP-C02」に合栌したした。 この蚘事では孊習した内容や、合栌のために必芁だず感じたこずに぀いおたずめたいず思いたす。 埌半には、若手瀟䌚人歎3幎目の私が、SAP-C02を受怜しお良かったず感じたこずも蚘茉したす。 読んでいただいた方の受怜の参考に、そしお孊習ぞのモチベヌションに぀ながれば幞いです。 筆者に぀いお SAP-C02ずは SAP-C02合栌たでの道のり 孊習時間ず孊習したコンテンツ 曞籍 ①AWS認定資栌詊隓テキスト&問題集 AWS認定゜リュヌションアヌキテクト - プロフェッショナル ②AWS認定゜リュヌションアヌキテクト-プロフェッショナル ~詊隓特性から導き出した挔習問題ず詳现解説 udemy ③Practice Exam AWS Certified Solutions Architect Professional ④【01版】AWS 認定゜リュヌションアヌキテクト プロフェッショナル暡擬詊隓問題集党5回分375問 2回の受怜を通しお 解けなかった問題や苊手に感じた分野の埩習 時間を意識しお問題を解き、詊隓に慣れる 受怜しおよかったこず AWSサヌビスを広く孊ぶこずができた セキュリティやネットワヌク、コンテナ技術など基本的なIT技術の知識を埗るこずができた たずめ 筆者に぀いお 新卒3幎目 業務での AWS 経隓は8ヶ月目以前はフロントアプリケヌション開発に携わっおいたした 珟圚の業務は、 AWS をむンフラ基盀ずした瀟内アプリケヌションを、フロント゚ンド・バック゚ンド・むンフラず党䜓的に開発しおいたす。 SAP-C02ずは SAP-C02の抂芁は以䞋のずおりです。詳しくは 公匏サむト をご芧ください。 Amazon Web Services  AWS の認定資栌プログラムの䞭で、高床な アヌキテクチャ スキルず クラりドコンピュヌティング の専門知識を持぀プロフェッショナル向けの資栌 問題は75問択䞀たたは倚肢遞択匏、詊隓時間は180分 1000点満点で750点が合栌ラむン SAP-C02合栌たでの道のり SAP-C02を受怜するたでに、 AWS 系の資栌は以䞋の2぀を取埗したした。 特にア゜シ゚むト資栌のSAA-C03は、SAP-C02を受怜するにあたりベヌスずなる知識が求められるため、先に受怜しおおくこずをオススメしたす。 AWS Certified Cloud Practitioner (CLF-C01) AWS Certified Solutions Architect – Associate (SAA-C03) 本題のSAP-C02は、1回目の受怜は704点で䞍合栌、2回目の受怜で合栌するこずができたした。 1回目の受怜から2回目の受怜たでに行ったこずは、「2回の受怜を通しお」セクションに蚘茉したす。 孊習時間ず孊習したコンテンツ 孊習時間は、だいたい100 ~ 150時間2時間×週4~5日×3ヶ月くらいかかりたした。 以䞋、孊習に䜿甚した教材を玹介したす。 䞊からオススメの順に䞊んでいたすので、ご参考にしおみおください。 曞籍 ① AWS 認定資栌詊隓テキスト&問題集 AWS 認定゜リュヌションアヌキテクト - プロフェッショナル ⭕出題範囲を広くカバヌしおおり、よく出題される分野をむラストを亀えおたずめおある参考曞です。 孊習のずっかかりずしおオススメです。 🔺本番レベルの問題数が十分ではないため、他の教材で補う必芁がありたす。 ② AWS 認定゜リュヌションアヌキテクト-プロフェッショナル ~詊隓特性から導き出した挔習問題ず詳现解説 ⭕ ①ず比范しお、問題の量ずその解説が充実しおいたす。 ⭕ 巻末に付録しおある暡擬詊隓は本番レベルで、解説も䞁寧です。正解の遞択肢だけでなく、䞍正解の遞択肢がなぜダメなのかに぀いおもわかりやすく解説されおいるため、ずおも圹に立ちたした。 🔺出題範囲が旧詊隓SAP-C01を想定しおおり、新詊隓SAP-C02のカバヌされおいない範囲は他の問題集で補う必芁がありたす。 udemy ③Practice Exam AWS Certified Solutions Architect Professional 英語の問題集で、2.5回分の挔習問題が収録されおいたす。倚少読み取りにくくはありたすが、 Google翻蚳 を䜿甚するこずで英語が埗意でない私でも孊習できたした。翻蚳が怪しいずころは英文に戻しお読み進めおいたした。 ⭕内容ずしおは、実際の詊隓に出題される問題に近い内容の問題が倚く収録されおいる印象です。たた解説欄には、問題に関連する AWS 公匏ドキュメントのリンクが掲茉されおおり、わからないずころはすぐに公匏ドキュメントで調べられおずおも良かったです。 ⭕新詊隓SAP-C02に察応しおおり、本番に近い内容の問題が倚い印象で、英語の問題集ずいうこずを差し匕いおもオススメできる問題集だず思いたした。 ④【01版】 AWS 認定゜リュヌションアヌキテクト プロフェッショナル暡擬詊隓問題集党5回分375問 ⭕ 私が詊隓察策をしおいた際、udemyで日本語の問題集はこれ䞀択でした。5回分の挔習問題が収録されおおり、問題量ずしおは申し分ないでしょう。 5回分の挔習問題が収録されおいるため、詊隓を想定しお時間を意識しお解く緎習をするのがオススメです。 🔺出題範囲が旧詊隓SAP-C01を想定しおおり、新詊隓SAP-C02のカバヌされおいない範囲に぀いおは他の問題集で補う必芁がありたす。 䞊蚘を孊習する䞊で䞍明点が生じた堎合は、たず AWS 公匏ドキュメントを調べたした。 AWS 公匏ドキュメントはずおも充実しおおり、調べたい内容はほずんど文曞化されおいた印象です。 公匏ドキュメントの情報をもずに問題を䜜成しおいるからかもしれたせんが 2回の受怜を通しお 「SAP-C02合栌たでの道のり」で蚘茉した通り、2回目の受怜で合栌したした。1回目の受怜から2回目の受怜たでにしたこずは以䞋のずおりです。 解けなかった問題や苊手に感じた分野の埩習 1回目の詊隓で解けなかった問題や苊手に感じた分野を圓日䞭にメモしおおき、集䞭的に埩習したした。"絶察に合栌した"ずいう確蚌がない限り、受怜盎埌にメモしおおいた方が賢明です。 時間を意識しお問題を解き、詊隓に慣れる SAP-C02は詊隓時間が3時間ありたすが、各問題の文章量がずおも倚いため時間に䜙裕はありたせん。 私は芋盎す時間が党く取れたせんでした そのため「孊習時間ず孊習したコンテンツ」で玹介した③のUdemy教材を新たに孊習し、詊隓のペヌスを掎むこずず長文から顧客芁求を玠早く理解するこずを緎習したした。 受怜しおよかったこず 最埌に、SAP-C02を受怜しお良かったこずは以䞋の2点です。 AWS サヌビスを広く孊ぶこずができた 本詊隓は察象サヌビスの幅が広く、どのようにサヌビスを組み合わせお顧客芁求を達成できるかを問われるため、各サヌビスぞの知識ず理解が深たりたした。 そのおかげで、孊習する前に比べおサヌビス構成図を芋た際にどのようなサヌビスであるかや、サヌビス構成䞊のどこに問題があるかが以前よりわかるようになった気がしたす。 実際に アヌキテクチャ 蚭蚈をしないたでも、レビュヌなどで倧いに圹立぀知識が぀けられたのではないかず思いたす。 セキュリティやネットワヌク、コンテナ技術など基本的な IT技術 の知識を埗るこずができた 若手ずいうこずもあり、セキュリティやネットワヌク、コンテナ技術など基本的な IT技術 の知識が乏しかったためずおも苊戊したした。しかし、SAP-C02の孊習を進めおいくうちに副次的に幅広く知識を぀けるこずができたした。 ア゜シ゚むト資栌ず比べるず、この蟺りの知識がないず解けない問題はたくさんありたす 自分の IT技術 に関する知識の無さに悲しくなるこずもありたしたが、若手の人にこそIT知識の幅を広げるずいう意味でも本資栌に挑戊しおみる䟡倀はあるず思いたす。 たずめ 今回は合栌䜓隓蚘ず題しお、孊習した内容や孊習しお良かったこずを玹介いたしたした。 孊習は倧倉でしたが、 AWS サヌビスをより深く孊ぶこずができ、 IT技術 の知芋を広げるこずができたした。 読んでいただいた皆さんの参考に少しでもなれれば幞いです。 最埌たでお読みいただきありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @suzuki.takuma 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDX むノベヌション 本郚゜フトりェアデザむンセンタヌの䜐藀倪䞀です。 皆さんは最近発売された 『実践プロパティベヌステスト ― PropErずErlang/Elixirではじめよう』 はもう読みたしたか この本は Erlang やElixirを䜿っおプロパティベヌステストずいうテスト手法に぀いお具䜓的なコヌドを䜿っお実践的に孊習できる本です。非垞に玠晎らしい本ですが、難しい郚分も倚いため私は少しず぀読んでいる所です。 この蚘事では、この本を読むにあたっおサンプルコヌドを動かすための環境を䜿っおいるOSに䟝存せずに䜜成する方法を説明したす。 事前の準備 最小限のDev Container devcontainer.jsonを線集する環境の構築 Erlang甹VS Code拡匵 テスト甚プロファむルで䜿うラむブラリを゚ディタに認識させる たずめ この蚘事で玹介しおいる開発環境の構成ファむル .devcontainer/devcontainer.json 事前の準備 この蚘事が前提ずする環境に぀いお軜く説明したす。 たず、  VS Code  を事前にむンストヌルしおおいおください。 次に、 Docker Desktop をむンストヌルしお動䜜する状態にしおください。基本的には単に むンストヌラ を実行すれば動䜜する状態になりたす。 そしお、 VS Code に  Dev Containers 拡匵をむンストヌルしおおいおください。 最埌に、䜜業甚のプロゞェクト ディレクト リを䜜成しおください。ここでは、pbt ずいう ディレクト リを䜜成しおプロゞェクトのルヌト ディレクト リずしおいたす。 最小限のDev Container たずは、Dev Containerを䜿っお Erlang が提䟛する公匏のDockerむメヌゞを䜿った開発環境を䜜成しおみたしょう。 プロゞェクトのルヌト ディレクト リに、  .devcontainer  ずいう ディレクト リを䜜っお、その䞭に  devcontainer.json  ずいうファむル名で以䞋の内容を保存したす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] } name の倀は、分かりやすい名前なら䜕でもいいです。ここでは、devcontainer- erlang ずしおいたす。 image の倀は、 erlang :slim ずしおいたす。これは公匏のむメヌゞ名です。 ベヌスむメヌゞや Erlang ランタむムのバヌゞョンを別なものにしたい堎合には、 https://hub.docker.com/_/erlang から探しおください。 containerEnv の倀は、コンテナ内で参照される 環境倉数 です。ここでは タむムゟヌン が  Asia/Tokyo になるよう蚭定しおいたす。時刻に起因する問題の調査は難しいので、ここで明瀺的に蚭定しおいたす。 runArgs の倀は、  --init  を枡すこずでDockerが  /dev/init  ずいうシグナルハンドリング甚のプロセスを起動しおくれたす。これによっおコンテナを安定的にシャットダりンできたす。 devcontainer. json を線集する環境の構築 ここから、devcontainer. json を線集しながら開発環境を構築しおいくので、たずは快適に json ファむルを線集できるようにしたしょう。 devcontainer. json には、Dev Containerずしお起動した VS Code を構成するための蚭定項目がありたすので、それらを線集したす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode " ] } } } customizations  ずいうキヌがDev Containerの構成を行うための蚭定項目です。この䞭に vscode  ずいう項目がありたすね。 settings の䞭では、 VS Code の蚭定項目を管理したす。 editor.renderWhitespace  の倀ずしお、  all  を蚭定しおいるのは、ファむルの䞭に玛れ蟌んだ党角スペヌスを芋぀けやすくするためです。私たちが IME を䜿っおいる以䞊、意図しない堎所に党角スペヌスが入り蟌んでしたい、それによっお理解が困難な゚ラヌメッセヌゞを読むこずになるのは避けられたせん。党角スペヌスが芋えおいれば、そういったドハマりから抜け出しやすくなりたす。 [json][jsonc]  の倀ずしお、いく぀か蚭定しおいたす。ちなみに、jsoncは、 JSON  with commentsの略称です。 editor.defaultFormatter  の倀ずしお、esbenp.prettier- vscode  を蚭定しおいたす。これによっおprettierを䜿ったフォヌマットが行われたす。 editor.formatOnSave  の倀ずしお、trueを蚭定するこずでファむル保存時にフォヌマットが行われるようにしおいたす。 editor.codeActionsOnSave  の倀ずしお、source.fixAll を有効化するこずで自動的に補正できるフォヌマット゚ラヌをprettierが積極的に補正しおくれたす。 extensions の䞭では、Dev Containerずしお起動された VS Code にむンストヌルされる VS Code 拡匵を列挙したす。ここでは、 JSON を自動フォヌマットするための  esbenp.prettier-vscode  を蚭定しおいたす。 Erlang 甹 VS Code 拡匵 次は、 Erlang 甚の VS Code 拡匵を远加したす。 マヌケットプレむス を確認するずいく぀かの拡匵がありたすが、䞀番利甚者の倚いものを今回は䜿いたす。 erlang devcontainer. json のextensionsに拡匵を远加するず、以䞋のようになりたす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } erlang.formattingLineLength の倀ずしお、200を蚭定しおいたす。この蚭定項目はドキュメントには蚘茉がないので、私の蚭定倀をここに曞いおいたす。 [erlang] の倀ずしお、いく぀か蚭定しおいたす。䜕をしおいるかは [json][jsonc]  の時ず同じです。 これで Erlang のアプリケヌション開発環境は完成です。しかし、本を読み進めおいくず早々に問題にぶ぀かりたす。 テスト甚プロファむルで䜿うラむブラリを゚ディタに認識させる 曞籍では、PropErずいうラむブラリをrebarずいうビルドツヌルに構成するように指瀺されたす。 その結果、rebar.configを以䞋のように構成したす。 { project_plugins , [ rebar3_proper ]} . { profiles , [ { test , [ { erl_opts , [ nowarn_export_all ]} , { deps , [ proper ]} ]} ]} . { erl_opts , [ debug_info ]} . { deps , []} . rebar3では、䟝存ラむブラリをプロファむル毎に管理できるようになっおいたす。 そしお、 proper は test プロファむルでのみ参照されたす。 ダりンロヌドされた䟝存ラむブラリは、プロゞェクトのルヌト ディレクト リにある _build ディレクト リ以䞋に栌玍されおいたす。 この状態だず、rebarによるビルドは成功するのですが、゚ディタ䞊で can't find include lib "proper/include/proper.hrl” ずいった゚ラヌが出力されたす。 この゚ラヌを解決するため VS Code の゚ディタ䞊でも、testプロファむル以䞋にダりンロヌドされたラむブラリを参照するように蚭定を远加したす。 倉曎した埌のdevcontainer. json は以䞋のようになりたす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " erlang.includePaths ": [ " _build/test/lib " ] , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } erlang.includePaths の倀ずしお、ラむブラリを栌玍しおいる ディレクト リの 盞察パス を蚘述しおいたす。 たずめ ここたで、Dev Containerで Erlang アプリケヌションの開発環境を構築する方法に぀いお説明しおきたした。 普段あたり䜿っおいない プログラミング蚀語 でも、Dockerベヌスのコンテナ技術を䜿えば簡単に開発環境を構築できるこずがお分かりいただけたんじゃないでしょうか。 特に私が普段䜿っおいる Windows では むンストヌラ を䜿ったバむナリのむンストヌルは埌腐れが残り易いので、本を読み終わったら党おを片付けられお副䜜甚のないDev Containerは非垞に䟿利です。 この蚘事を読んでいただいたあなたも是非、クリヌンな開発環境を構築しおプロパティベヌステストずいう応甚可胜性の高いテスト手法に習熟できるこずを願っおいたす。 この蚘事で玹介しおいる開発環境の構成ファむル 最埌に䜜った構成ファむルを玹介したす。 .devcontainer/devcontainer. json { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " erlang.includePaths ": [ " _build/test/lib " ] , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } 執筆 @sato.taichi  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDX むノベヌション 本郚゜フトりェアデザむンセンタヌの䜐藀倪䞀です。 皆さんは最近発売された 『実践プロパティベヌステスト ― PropErずErlang/Elixirではじめよう』 はもう読みたしたか この本は Erlang やElixirを䜿っおプロパティベヌステストずいうテスト手法に぀いお具䜓的なコヌドを䜿っお実践的に孊習できる本です。非垞に玠晎らしい本ですが、難しい郚分も倚いため私は少しず぀読んでいる所です。 この蚘事では、この本を読むにあたっおサンプルコヌドを動かすための環境を䜿っおいるOSに䟝存せずに䜜成する方法を説明したす。 事前の準備 最小限のDev Container devcontainer.jsonを線集する環境の構築 Erlang甹VS Code拡匵 テスト甚プロファむルで䜿うラむブラリを゚ディタに認識させる たずめ この蚘事で玹介しおいる開発環境の構成ファむル .devcontainer/devcontainer.json 事前の準備 この蚘事が前提ずする環境に぀いお軜く説明したす。 たず、  VS Code  を事前にむンストヌルしおおいおください。 次に、 Docker Desktop をむンストヌルしお動䜜する状態にしおください。基本的には単に むンストヌラ を実行すれば動䜜する状態になりたす。 そしお、 VS Code に  Dev Containers 拡匵をむンストヌルしおおいおください。 最埌に、䜜業甚のプロゞェクト ディレクト リを䜜成しおください。ここでは、pbt ずいう ディレクト リを䜜成しおプロゞェクトのルヌト ディレクト リずしおいたす。 最小限のDev Container たずは、Dev Containerを䜿っお Erlang が提䟛する公匏のDockerむメヌゞを䜿った開発環境を䜜成しおみたしょう。 プロゞェクトのルヌト ディレクト リに、  .devcontainer  ずいう ディレクト リを䜜っお、その䞭に  devcontainer.json  ずいうファむル名で以䞋の内容を保存したす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " containerEnv ": { " TZ ": " Asia/Tokyo " } , " runArgs ": [ " --init " ] } name の倀は、分かりやすい名前なら䜕でもいいです。ここでは、devcontainer- erlang ずしおいたす。 image の倀は、 erlang :slim ずしおいたす。これは公匏のむメヌゞ名です。 ベヌスむメヌゞや Erlang ランタむムのバヌゞョンを別なものにしたい堎合には、 https://hub.docker.com/_/erlang から探しおください。 containerEnv の倀は、コンテナ内で参照される 環境倉数 です。ここでは タむムゟヌン が  Asia/Tokyo になるよう蚭定しおいたす。時刻に起因する問題の調査は難しいので、ここで明瀺的に蚭定しおいたす。 runArgs の倀は、  --init  を枡すこずでDockerが  /dev/init  ずいうシグナルハンドリング甚のプロセスを起動しおくれたす。これによっおコンテナを安定的にシャットダりンできたす。 devcontainer. json を線集する環境の構築 ここから、devcontainer. json を線集しながら開発環境を構築しおいくので、たずは快適に json ファむルを線集できるようにしたしょう。 devcontainer. json には、Dev Containerずしお起動した VS Code を構成するための蚭定項目がありたすので、それらを線集したす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " esbenp.prettier-vscode " ] } } } customizations  ずいうキヌがDev Containerの構成を行うための蚭定項目です。この䞭に vscode  ずいう項目がありたすね。 settings の䞭では、 VS Code の蚭定項目を管理したす。 editor.renderWhitespace  の倀ずしお、  all  を蚭定しおいるのは、ファむルの䞭に玛れ蟌んだ党角スペヌスを芋぀けやすくするためです。私たちが IME を䜿っおいる以䞊、意図しない堎所に党角スペヌスが入り蟌んでしたい、それによっお理解が困難な゚ラヌメッセヌゞを読むこずになるのは避けられたせん。党角スペヌスが芋えおいれば、そういったドハマりから抜け出しやすくなりたす。 [json][jsonc]  の倀ずしお、いく぀か蚭定しおいたす。ちなみに、jsoncは、 JSON  with commentsの略称です。 editor.defaultFormatter  の倀ずしお、esbenp.prettier- vscode  を蚭定しおいたす。これによっおprettierを䜿ったフォヌマットが行われたす。 editor.formatOnSave  の倀ずしお、trueを蚭定するこずでファむル保存時にフォヌマットが行われるようにしおいたす。 editor.codeActionsOnSave  の倀ずしお、source.fixAll を有効化するこずで自動的に補正できるフォヌマット゚ラヌをprettierが積極的に補正しおくれたす。 extensions の䞭では、Dev Containerずしお起動された VS Code にむンストヌルされる VS Code 拡匵を列挙したす。ここでは、 JSON を自動フォヌマットするための  esbenp.prettier-vscode  を蚭定しおいたす。 Erlang 甹 VS Code 拡匵 次は、 Erlang 甚の VS Code 拡匵を远加したす。 マヌケットプレむス を確認するずいく぀かの拡匵がありたすが、䞀番利甚者の倚いものを今回は䜿いたす。 erlang devcontainer. json のextensionsに拡匵を远加するず、以䞋のようになりたす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } erlang.formattingLineLength の倀ずしお、200を蚭定しおいたす。この蚭定項目はドキュメントには蚘茉がないので、私の蚭定倀をここに曞いおいたす。 [erlang] の倀ずしお、いく぀か蚭定しおいたす。䜕をしおいるかは [json][jsonc]  の時ず同じです。 これで Erlang のアプリケヌション開発環境は完成です。しかし、本を読み進めおいくず早々に問題にぶ぀かりたす。 テスト甚プロファむルで䜿うラむブラリを゚ディタに認識させる 曞籍では、PropErずいうラむブラリをrebarずいうビルドツヌルに構成するように指瀺されたす。 その結果、rebar.configを以䞋のように構成したす。 { project_plugins , [ rebar3_proper ]} . { profiles , [ { test , [ { erl_opts , [ nowarn_export_all ]} , { deps , [ proper ]} ]} ]} . { erl_opts , [ debug_info ]} . { deps , []} . rebar3では、䟝存ラむブラリをプロファむル毎に管理できるようになっおいたす。 そしお、 proper は test プロファむルでのみ参照されたす。 ダりンロヌドされた䟝存ラむブラリは、プロゞェクトのルヌト ディレクト リにある _build ディレクト リ以䞋に栌玍されおいたす。 この状態だず、rebarによるビルドは成功するのですが、゚ディタ䞊で can't find include lib "proper/include/proper.hrl” ずいった゚ラヌが出力されたす。 この゚ラヌを解決するため VS Code の゚ディタ䞊でも、testプロファむル以䞋にダりンロヌドされたラむブラリを参照するように蚭定を远加したす。 倉曎した埌のdevcontainer. json は以䞋のようになりたす。 { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " erlang.includePaths ": [ " _build/test/lib " ] , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } erlang.includePaths の倀ずしお、ラむブラリを栌玍しおいる ディレクト リの 盞察パス を蚘述しおいたす。 たずめ ここたで、Dev Containerで Erlang アプリケヌションの開発環境を構築する方法に぀いお説明しおきたした。 普段あたり䜿っおいない プログラミング蚀語 でも、Dockerベヌスのコンテナ技術を䜿えば簡単に開発環境を構築できるこずがお分かりいただけたんじゃないでしょうか。 特に私が普段䜿っおいる Windows では むンストヌラ を䜿ったバむナリのむンストヌルは埌腐れが残り易いので、本を読み終わったら党おを片付けられお副䜜甚のないDev Containerは非垞に䟿利です。 この蚘事を読んでいただいたあなたも是非、クリヌンな開発環境を構築しおプロパティベヌステストずいう応甚可胜性の高いテスト手法に習熟できるこずを願っおいたす。 この蚘事で玹介しおいる開発環境の構成ファむル 最埌に䜜った構成ファむルを玹介したす。 .devcontainer/devcontainer. json { " name ": " devcontainer-erlang ", " image ": " erlang:slim ", " customizations ": { " vscode ": { " settings ": { " editor.renderWhitespace ": " all ", " erlang.formattingLineLength ": 200 , " erlang.includePaths ": [ " _build/test/lib " ] , " [erlang] ": { " editor.defaultFormatter ": " pgourlain.erlang ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } , " [json][jsonc] ": { " editor.defaultFormatter ": " esbenp.prettier-vscode ", " editor.formatOnSave ": true , " editor.codeActionsOnSave ": { " source.fixAll ": true } } } , " extensions ": [ " pgourlain.erlang ", " esbenp.prettier-vscode " ] } } } 執筆 @sato.taichi  Shodo で執筆されたした 
みなさんこんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌの鈎朚です。 デヌタベヌスに Amazon DynamoDB を採甚しおいるWebアプリケヌションを、 Amazon RDSを採甚したWebアプリケヌションにリプレむスしおいる際に、デヌタ移行で苊戊したこずを蚘事に残したす。 背景 実珟したいこずず、苊戊したこず 実珟したいこず アプリケヌションずテヌブル定矩 苊戊したこず 解決方法 芁点 DynamoDB→S3ぞの゚クスポヌト 開発環境ぞのダりンロヌド、倉換凊理 RDSぞのむンポヌト たずめ 背景 埓来のアプリケヌションでは、デヌタベヌス局にNoSQL型のデヌタベヌスであるDynamoDBを採甚しおいたした。 しかし、利甚ナヌザヌが増加しお パヌティション キヌ以倖での怜玢芁件が出おきたこずで、フルスキャンをせざるを埗ないケヌスがたびたび発生したためレスポンスタむムやコストの問題が発生しおいたした。 以䞊のこずから、NoSQL型のデヌタベヌスより柔軟に怜玢が可胜な、 RDB 型のデヌタベヌスであるRDSに移行するこずずなりたした。 実珟したいこずず、苊戊したこず 実珟したいこず 移行元のDynamoDBテヌブルからデヌタを゚クスポヌトし、移行先のアプリケヌションのデヌタベヌス PostgreSQL のテヌブル定矩に基づいおデヌタを倉換したす。最終的には、RDSぞデヌタをむンポヌトするこずを目指したす。 デヌタの倉換・移行には、 AWS Glueや AWS DMS(Database Migration Service)などの AWS サヌビスを利甚するこずもできたす。今回は、開発環境でデヌタの䞀郚を䜿いたかったこずもあり、開発環境でTypeScriptを甚いお倉換したす。 アプリケヌションずテヌブル定矩 アプリケヌションは、Next.js × Prisma を甚いお実装しおいたす。 デヌタベヌスには PostgreSQL を採甚しおおり、蚘事甚に簡略化した移行埌のテヌブル構成は以䞋のずおりです。 userテヌブルずaccountテヌブルがあり、userテヌブルのidを倖郚キヌに、accountテヌブルずリレヌションを築いおいたす。 苊戊したこず DynamoDBから゚クスポヌトしたデヌタを倉換しおデヌタベヌスにむンポヌトする過皋で、SERIAL型であるuserテヌブルのidはレコヌドが䜜成されるたで確定したせん。accountテヌブルにレコヌドを䜜成する際に、accountテヌブルの倖郚キヌであるuser_idは、userテヌブルのレコヌドを䜜成埌にuserテヌブルから取埗しなければなりたせん。 たた、Webアプリケヌションの ゜ヌスコヌド や、アプリケヌションが参照しおいるデヌタベヌスの スキヌマ にはなるべく手を加えないようにしたいです。 解決方法 芁点 今回は次の流れで解決したした。 ①accountテヌブルずは別に䞀時的なaccount_tmpテヌブルをデヌタベヌスに䜜成する。 ②userテヌブルずaccount_tmpテヌブルに倉換埌のデヌタをINSERTする。 ③userテヌブルからaccount_tmpテヌブルのレコヌドに察応したuser_idを取埗しお、account_tmpテヌブルのレコヌドをUPDATEする。 ④account_tmpテヌブルからaccountテヌブルにINSERTする。 以降、詳しくみおいきたす。 AWS の構成やデヌタ構造は蚘事甚に簡略化しおいたす DynamoDB→S3ぞの゚クスポヌト 蚘事甚にDynamoDBテヌブルを䜜成したした。 パヌティション キヌにはemailを蚭定しおいたす。 項目は、以䞋のずおりです。 email (S) account (L) updated_at (N) created_at (N) test-user1@ example.com [{"name": "test-user1-1"}, {"name": "test-user1-2"}] 1696129200 1696129200 test-user2@ example.com [{"name": "test-user2-1"}] 1696129200 1696129200 test-user3@ example.com [{"name": "test-user3-1"}, {"name": "test-user3-2"}] 1696129200 1696129200 このテヌ ブルデヌ タを開発環境に移動させるため、S3 バケット に゚クスポヌトしたす。 たず、゚クスポヌト甚にS3に バケット を䜜成したす。 その埌、DynamoDBのコン゜ヌル画面から、「゚クスポヌトおよびストリヌム」タブから「S3ぞの゚クスポヌト」を遞択するこずで、先ほど䜜成したS3 バケット にデヌタを゚クスポヌトしたす。 詳しい手順は、詳现は AWSの公匏蚘事 を参照しおください。 開発環境ぞのダりンロヌド、倉換凊理 S3のコン゜ヌル画面から、先ほど゚クスポヌトしたDynamoDBテヌブル情報をダりンロヌドしおください。 AWS CLI から aws s3 cp s3://[バケット名]/[デヌタが配眮されたフォルダパス] [ダりンロヌド先のフォルダパス] --recursive でもダりンロヌド可胜です。 ダりンロヌド埌のデヌタは解凍しおおいおください。DynamoDBのデヌタ量が倚い堎合は耇数ファむルに分かれおいるこずもありたす。 gunzip ./input/fsjiydg6by6o5cjalruephgpca.json.gz -k 解凍埌のデヌタを開くず、DynamoDBから出力したデヌタは以䞋のような圢匏ずなっおいたす。DynamoDB JSON 圢匏ず呌ばれるらしいです。 // fsjiydg6by6o5cjalruephgpca.json { " Item ": { " email ": { " S ":" test-user1@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user1-1 " }}} , { " M ": { " name ": { " S ":" test-user1-2 " }}}]} ," created_at ": { " N ":" 1696129200 " }} } { " Item ": { " email ": { " S ":" test-user2@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user2-1 " }}}]} ," created_at ": { " N ":" 1696129200 " }} } { " Item ": { " email ": { " S ":" test-user3@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user3-1 " }}} , { " M ": { " name ": { " S ":" test-user3-2 " }}}]} ," created_at ": { " N ":" 1696129200 " }}} デヌタベヌス( PostgreSQL )にデヌタをむンポヌトするため、 CSV 圢匏に倉換したす。倉換の過皋で、DynamoDB JSON 圢匏を扱いやすい JSON 圢匏に倉換するため @aws-sdk/util-dynamodb ずいうパッケヌゞを甚いたす。 倉換に甚いた自䜜の スクリプト を䞀䟋ずしお掲茉したす。 䞋蚘のコヌドをタヌミナル䞊で実行し、デヌタを CSV 圢匏で出力したす。 ./node_modules/.bin/ts-node convert.ts ./input ※「./input」はDynamoDBテヌブル情報があるフォルダ // convert.ts import * as fs from "fs" ; import * as readline from "readline" ; import { unmarshall } from "@aws-sdk/util-dynamodb" ; import { Parser } from "json2csv" ; // 型を定矩 type Account = { name: string ; } type UserTableFormat = { email: string ; createdAt: Date ; updatedAt: Date ; } ; type AccountTableFormat = { name: string ; createdAt: Date ; updateAt: Date ; email: string ; } ; // 出力先のcsvファむルのヘッダヌず倀を玐づける const userTableFields = [ { label: "email" , value: "email" } , { label: "createdAt" , value: "createdAt" } , { label: "updatedAt" , value: "updatedAt" } , ] ; const accountTableFields = [ { label: "name" , value: "name" } , { label: "createdAt" , value: "createdAt" } , { label: "updatedAt" , value: "updatedAt" } , { label: "email" , value: "email" } , ] ; // 各フォルダ・ファむルを定矩 const inputFolder = process .argv [ 2 ] ; const outputFilePath = "./output" ; const outputUserTable = outputFilePath + "/userTable.csv" ; const outputAccountTable = outputFilePath + "/accountTable.csv" ; // 出力先のディレクトリを䜜成 fs.mkdirSync ( outputFilePath , { recursive: true } ); // 出力ファむルの初期化 fs.writeFileSync ( outputUserTable , "" ); fs.writeFileSync ( outputAccountTable , "" ); // DynamoDBテヌブル情報ファむルの䞀芧を取埗 const fileList = fs.readdirSync ( inputFolder ) .filter (( f ) => f.endsWith ( ".json" )); // 倉換・曞き蟌み凊理 for ( const inputFile of fileList ) { const rs = fs.createReadStream ( inputFolder + "/" + inputFile ); const rl = readline.createInterface ( { input: rs } ); rl.on ( "line" , ( line ) => { // 倉換前に䜙分な文字列を削陀 const inputLine = line .slice ( 0 , -1 ) .replace ( /{"Item":/ , "" ) .replace ( /\r?\n/g , "" ); // DynamoDB JSON→JSONに倉換 const inputData = unmarshall ( JSON .parse ( inputLine )); // テヌブルごずにデヌタを分割 const userTableRecord: UserTableFormat = { email: inputData.email , createdAt: new Date ( inputData.created_at * 1000 ), updatedAt: new Date ( inputData.updated_at * 1000 ), } ; let accountTableRecords: AccountTableFormat [] | null ; if ( ! inputData.account ) { accountTableRecords = null ; } else { accountTableRecords = inputData.account.map (( a: Account ) => { return { name: a.name , createdAt: new Date ( inputData.created_at * 1000 ), updatedAt: new Date ( inputData.updated_at * 1000 ), email: inputData.email , } } ) } // csv圢匏にパヌス const userTableParser = new Parser ( { fields: userTableFields , header: false , withBOM: true } ); const userTableCsv = userTableParser.parse ( userTableRecord ); let accountTableCsv if ( accountTableRecords && accountTableRecords.length > 0 ) { const githubAccountTableParser = new Parser ( { fields: accountTableFields , header: false , withBOM: true } ); accountTableCsv = githubAccountTableParser.parse ( accountTableRecords ); } // テヌブルごずにファむル出力 fs.writeFileSync ( outputUserTable , userTableCsv.slice ( 1 ) + "\n" , { flag: "a" } ); if ( accountTableCsv ) { fs.writeFileSync ( outputAccountTable , accountTableCsv.slice ( 1 ) + "\n" , { flag: "a" } ); } } ); } 以䞊で、デヌタの倉換は完了し、outputフォルダに倉換埌のデヌタがテヌブル単䜍でファむルずしお出力されおいたす。 S3 バケット のルヌトに「upload」フォルダを䜜っお、これらのファむルをアップロヌドしたす。S3のコン゜ヌル画面からでも、次の AWS CLI から以䞋コマンドでもアップロヌド可胜です。 aws s3 cp ./output/ s3://[バケット名]/upload/ --recursive RDSぞのむンポヌト RDSに察しお、 psql コマンドラむン を䜿甚しおS3にアップロヌドした csv ファむルデヌタを反映させおいきたす。 詳现は省きたすが、RDSをプラむベヌトサブネット内に䜜成しおいる堎合、螏み台サヌバを䜿甚するなどでデヌタベヌスにアクセスしおください。今回は螏み台サヌバでポヌト フォワ ヌディングを行い、RDSの察象デヌタベヌスぞ通信できる状態で、以䞋のコマンドを実行しおデヌタベヌスに接続したす。 パスワヌドの入力が求められるため、デヌタベヌスナヌザヌに察応するパスワヌドを入力しおください。 psql --host=localhost --port=5432 --username=[RDSのナヌザヌ名] --dbname=[RDSのデヌタベヌス名] --password postgres 次に、 psql を甚いおS3のファむルデヌタをRDSにむンポヌトするため、以䞋のコマンドから aws _s3 拡匵機胜 をむンストヌルしたす。 CREATE EXTENSION aws_s3 CASCADE; \dx コマンドを実行し、 aws_s3 拡匵機胜 がむンストヌルされおいるこずを確認したす。 postgres=> \dx List of installed extensions Name | Version | Schema | Description -------------+---------+------------+--------------------------------------------- aws_commons | 1.2 | public | Common data types across AWS services aws_s3 | 1.1 | public | AWS S3 extension for importing data from S3 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows) ここが今回の本題です。 課題にも蚘茉したしたが、userテヌブルのidはレコヌドが䜜成されるたで生成されないため、accountテヌブルの倖郚キヌであるuser_idは CSV 圢匏に倉換するタむミングでは確定させるこずができたせんでした。 今回は以䞋の方法で解決したした。 userテヌブルのナニヌクカラム(email)をフィヌルドに持぀ account_tmpテヌブルを䜜成する。 S3にアップロヌドした csv ファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む。 userテヌブルに䜜成されたレコヌドからaccount_tmpテヌブルに蚭定したナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する。 account_tmpテヌブルのレコヌドをaccountテヌブルにINSERTする。 account_tmpテヌブルを削陀する。 具䜓的には以䞋の SQL ファむルを psql から実行したす。 \i data_migration.sql -- data_migration.sql -- 1. account_tmpテヌブルを䜜成する CREATE TABLE " account_tmp " ( " id " SERIAL NOT NULL , " name " TEXT NOT NULL , " user_id " INTEGER , " created_at " TIMESTAMP ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP , " updated_at " TIMESTAMP ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP , " email " TEXT NOT NULL , CONSTRAINT " account_tmp_pkey " PRIMARY KEY ( " id " ) ); -- 2. S3にアップロヌドしたcsvファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む SELECT aws_s3.table_import_from_s3( ' "account_tmp" ' , -- テヌブル名 ' "name", "user_id", "created_at", "updated_at", "email" ' , -- カラム名 ' (format csv) ' , -- ファむル圢匏 ' bucket-name ' , -- バケット名 ' upload/accountTable.csv ' , -- バケットルヌトからのファむルパス ' ap-northeast-1 ' -- リヌゞョン ); SELECT aws_s3.table_import_from_s3( ' "user" ' , ' "email", "created_at", "updated_at" ' , ' (format csv) ' , ' bucket-name ' , ' upload/userTable.csv ' , ' ap-northeast-1 ' ); -- 3. ナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する UPDATE " account_tmp " SET " userId " = " user " . " id " FROM " user " WHERE " account_tmp " . " email " = " user " . " email " ; -- 4. account_tmpテヌブルのレコヌドをaccountテヌブルにINSERTする INSERT INTO " account " ( " name " , " user_id " , " created_at " , " updated_at " ) SELECT " name " , " user_id " , " created_at " , " updated_at " FROM " account_tmp " ; -- 5. account_tmpテヌブルを削陀する DROP TABLE " account_tmp " ; 以䞊で無事にRDSぞデヌタを移行できたした。 ちなみに開発環境のデヌタベヌスに取り蟌む際は、以䞋2点を倉曎しおください。 psql でデヌタベヌスにログむンする際、開発環境のデヌタベヌスホスト名・ポヌト番号・デヌタベヌス名・ナヌザヌ名に眮き換えお実行する。 「data_migration. sql 」の「2. S3にアップロヌドした csv ファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む」郚分を開発環境の csv ファむルからデヌタを取り蟌むように修正しお、 \i data_migration.sql を実行する。 -- data_migration.sql -- (省略) -- 2. csvファむルをテヌブルに取り蟌む \COPY " account_tmp " ( " name " , " user_id " , " created_at " , " updated_at " , " email " ) FROM ' ./output/accountTable.csv ' DELIMITER ' , ' CSV \COPY " user " ( " email " , " created_at " , " updated_at " ) FROM ' ./output/userTable.csv ' DELIMITER ' , ' CSV -- 3. ナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する -- (省略) たずめ 今回は、DynamoDBからRDSぞデヌタを移行する際に苊戊したこずを蚘事に残したした。user_id問題以倖にも、DynamoDB JSON の倉換方法など色々ず勉匷になりたした。 同じ堎面に出くわす機䌚は少ないず思いたすが、どなたかの参考になれば幞いです。 最埌たでお読みいただきたしおありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @suzuki.takuma 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
みなさんこんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌの鈎朚です。 デヌタベヌスに Amazon DynamoDB を採甚しおいるWebアプリケヌションを、 Amazon RDSを採甚したWebアプリケヌションにリプレむスしおいる際に、デヌタ移行で苊戊したこずを蚘事に残したす。 背景 実珟したいこずず、苊戊したこず 実珟したいこず アプリケヌションずテヌブル定矩 苊戊したこず 解決方法 芁点 DynamoDB→S3ぞの゚クスポヌト 開発環境ぞのダりンロヌド、倉換凊理 RDSぞのむンポヌト たずめ 背景 埓来のアプリケヌションでは、デヌタベヌス局にNoSQL型のデヌタベヌスであるDynamoDBを採甚しおいたした。 しかし、利甚ナヌザヌが増加しお パヌティション キヌ以倖での怜玢芁件が出おきたこずで、フルスキャンをせざるを埗ないケヌスがたびたび発生したためレスポンスタむムやコストの問題が発生しおいたした。 以䞊のこずから、NoSQL型のデヌタベヌスより柔軟に怜玢が可胜な、 RDB 型のデヌタベヌスであるRDSに移行するこずずなりたした。 実珟したいこずず、苊戊したこず 実珟したいこず 移行元のDynamoDBテヌブルからデヌタを゚クスポヌトし、移行先のアプリケヌションのデヌタベヌス PostgreSQL のテヌブル定矩に基づいおデヌタを倉換したす。最終的には、RDSぞデヌタをむンポヌトするこずを目指したす。 デヌタの倉換・移行には、 AWS Glueや AWS DMS(Database Migration Service)などの AWS サヌビスを利甚するこずもできたす。今回は、開発環境でデヌタの䞀郚を䜿いたかったこずもあり、開発環境でTypeScriptを甚いお倉換したす。 アプリケヌションずテヌブル定矩 アプリケヌションは、Next.js × Prisma を甚いお実装しおいたす。 デヌタベヌスには PostgreSQL を採甚しおおり、蚘事甚に簡略化した移行埌のテヌブル構成は以䞋のずおりです。 userテヌブルずaccountテヌブルがあり、userテヌブルのidを倖郚キヌに、accountテヌブルずリレヌションを築いおいたす。 苊戊したこず DynamoDBから゚クスポヌトしたデヌタを倉換しおデヌタベヌスにむンポヌトする過皋で、SERIAL型であるuserテヌブルのidはレコヌドが䜜成されるたで確定したせん。accountテヌブルにレコヌドを䜜成する際に、accountテヌブルの倖郚キヌであるuser_idは、userテヌブルのレコヌドを䜜成埌にuserテヌブルから取埗しなければなりたせん。 たた、Webアプリケヌションの ゜ヌスコヌド や、アプリケヌションが参照しおいるデヌタベヌスの スキヌマ にはなるべく手を加えないようにしたいです。 解決方法 芁点 今回は次の流れで解決したした。 ①accountテヌブルずは別に䞀時的なaccount_tmpテヌブルをデヌタベヌスに䜜成する。 ②userテヌブルずaccount_tmpテヌブルに倉換埌のデヌタをINSERTする。 ③userテヌブルからaccount_tmpテヌブルのレコヌドに察応したuser_idを取埗しお、account_tmpテヌブルのレコヌドをUPDATEする。 ④account_tmpテヌブルからaccountテヌブルにINSERTする。 以降、詳しくみおいきたす。 AWS の構成やデヌタ構造は蚘事甚に簡略化しおいたす DynamoDB→S3ぞの゚クスポヌト 蚘事甚にDynamoDBテヌブルを䜜成したした。 パヌティション キヌにはemailを蚭定しおいたす。 項目は、以䞋のずおりです。 email (S) account (L) updated_at (N) created_at (N) test-user1@ example.com [{"name": "test-user1-1"}, {"name": "test-user1-2"}] 1696129200 1696129200 test-user2@ example.com [{"name": "test-user2-1"}] 1696129200 1696129200 test-user3@ example.com [{"name": "test-user3-1"}, {"name": "test-user3-2"}] 1696129200 1696129200 このテヌ ブルデヌ タを開発環境に移動させるため、S3 バケット に゚クスポヌトしたす。 たず、゚クスポヌト甚にS3に バケット を䜜成したす。 その埌、DynamoDBのコン゜ヌル画面から、「゚クスポヌトおよびストリヌム」タブから「S3ぞの゚クスポヌト」を遞択するこずで、先ほど䜜成したS3 バケット にデヌタを゚クスポヌトしたす。 詳しい手順は、詳现は AWSの公匏蚘事 を参照しおください。 開発環境ぞのダりンロヌド、倉換凊理 S3のコン゜ヌル画面から、先ほど゚クスポヌトしたDynamoDBテヌブル情報をダりンロヌドしおください。 AWS CLI から aws s3 cp s3://[バケット名]/[デヌタが配眮されたフォルダパス] [ダりンロヌド先のフォルダパス] --recursive でもダりンロヌド可胜です。 ダりンロヌド埌のデヌタは解凍しおおいおください。DynamoDBのデヌタ量が倚い堎合は耇数ファむルに分かれおいるこずもありたす。 gunzip ./input/fsjiydg6by6o5cjalruephgpca.json.gz -k 解凍埌のデヌタを開くず、DynamoDBから出力したデヌタは以䞋のような圢匏ずなっおいたす。DynamoDB JSON 圢匏ず呌ばれるらしいです。 // fsjiydg6by6o5cjalruephgpca.json { " Item ": { " email ": { " S ":" test-user1@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user1-1 " }}} , { " M ": { " name ": { " S ":" test-user1-2 " }}}]} ," created_at ": { " N ":" 1696129200 " }} } { " Item ": { " email ": { " S ":" test-user2@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user2-1 " }}}]} ," created_at ": { " N ":" 1696129200 " }} } { " Item ": { " email ": { " S ":" test-user3@example.com " } ," updated_at ": { " N ":" 1696129200 " } ," account ": { " L ": [{ " M ": { " name ": { " S ":" test-user3-1 " }}} , { " M ": { " name ": { " S ":" test-user3-2 " }}}]} ," created_at ": { " N ":" 1696129200 " }}} デヌタベヌス( PostgreSQL )にデヌタをむンポヌトするため、 CSV 圢匏に倉換したす。倉換の過皋で、DynamoDB JSON 圢匏を扱いやすい JSON 圢匏に倉換するため @aws-sdk/util-dynamodb ずいうパッケヌゞを甚いたす。 倉換に甚いた自䜜の スクリプト を䞀䟋ずしお掲茉したす。 䞋蚘のコヌドをタヌミナル䞊で実行し、デヌタを CSV 圢匏で出力したす。 ./node_modules/.bin/ts-node convert.ts ./input ※「./input」はDynamoDBテヌブル情報があるフォルダ // convert.ts import * as fs from "fs" ; import * as readline from "readline" ; import { unmarshall } from "@aws-sdk/util-dynamodb" ; import { Parser } from "json2csv" ; // 型を定矩 type Account = { name: string ; } type UserTableFormat = { email: string ; createdAt: Date ; updatedAt: Date ; } ; type AccountTableFormat = { name: string ; createdAt: Date ; updateAt: Date ; email: string ; } ; // 出力先のcsvファむルのヘッダヌず倀を玐づける const userTableFields = [ { label: "email" , value: "email" } , { label: "createdAt" , value: "createdAt" } , { label: "updatedAt" , value: "updatedAt" } , ] ; const accountTableFields = [ { label: "name" , value: "name" } , { label: "createdAt" , value: "createdAt" } , { label: "updatedAt" , value: "updatedAt" } , { label: "email" , value: "email" } , ] ; // 各フォルダ・ファむルを定矩 const inputFolder = process .argv [ 2 ] ; const outputFilePath = "./output" ; const outputUserTable = outputFilePath + "/userTable.csv" ; const outputAccountTable = outputFilePath + "/accountTable.csv" ; // 出力先のディレクトリを䜜成 fs.mkdirSync ( outputFilePath , { recursive: true } ); // 出力ファむルの初期化 fs.writeFileSync ( outputUserTable , "" ); fs.writeFileSync ( outputAccountTable , "" ); // DynamoDBテヌブル情報ファむルの䞀芧を取埗 const fileList = fs.readdirSync ( inputFolder ) .filter (( f ) => f.endsWith ( ".json" )); // 倉換・曞き蟌み凊理 for ( const inputFile of fileList ) { const rs = fs.createReadStream ( inputFolder + "/" + inputFile ); const rl = readline.createInterface ( { input: rs } ); rl.on ( "line" , ( line ) => { // 倉換前に䜙分な文字列を削陀 const inputLine = line .slice ( 0 , -1 ) .replace ( /{"Item":/ , "" ) .replace ( /\r?\n/g , "" ); // DynamoDB JSON→JSONに倉換 const inputData = unmarshall ( JSON .parse ( inputLine )); // テヌブルごずにデヌタを分割 const userTableRecord: UserTableFormat = { email: inputData.email , createdAt: new Date ( inputData.created_at * 1000 ), updatedAt: new Date ( inputData.updated_at * 1000 ), } ; let accountTableRecords: AccountTableFormat [] | null ; if ( ! inputData.account ) { accountTableRecords = null ; } else { accountTableRecords = inputData.account.map (( a: Account ) => { return { name: a.name , createdAt: new Date ( inputData.created_at * 1000 ), updatedAt: new Date ( inputData.updated_at * 1000 ), email: inputData.email , } } ) } // csv圢匏にパヌス const userTableParser = new Parser ( { fields: userTableFields , header: false , withBOM: true } ); const userTableCsv = userTableParser.parse ( userTableRecord ); let accountTableCsv if ( accountTableRecords && accountTableRecords.length > 0 ) { const githubAccountTableParser = new Parser ( { fields: accountTableFields , header: false , withBOM: true } ); accountTableCsv = githubAccountTableParser.parse ( accountTableRecords ); } // テヌブルごずにファむル出力 fs.writeFileSync ( outputUserTable , userTableCsv.slice ( 1 ) + "\n" , { flag: "a" } ); if ( accountTableCsv ) { fs.writeFileSync ( outputAccountTable , accountTableCsv.slice ( 1 ) + "\n" , { flag: "a" } ); } } ); } 以䞊で、デヌタの倉換は完了し、outputフォルダに倉換埌のデヌタがテヌブル単䜍でファむルずしお出力されおいたす。 S3 バケット のルヌトに「upload」フォルダを䜜っお、これらのファむルをアップロヌドしたす。S3のコン゜ヌル画面からでも、次の AWS CLI から以䞋コマンドでもアップロヌド可胜です。 aws s3 cp ./output/ s3://[バケット名]/upload/ --recursive RDSぞのむンポヌト RDSに察しお、 psql コマンドラむン を䜿甚しおS3にアップロヌドした csv ファむルデヌタを反映させおいきたす。 詳现は省きたすが、RDSをプラむベヌトサブネット内に䜜成しおいる堎合、螏み台サヌバを䜿甚するなどでデヌタベヌスにアクセスしおください。今回は螏み台サヌバでポヌト フォワ ヌディングを行い、RDSの察象デヌタベヌスぞ通信できる状態で、以䞋のコマンドを実行しおデヌタベヌスに接続したす。 パスワヌドの入力が求められるため、デヌタベヌスナヌザヌに察応するパスワヌドを入力しおください。 psql --host=localhost --port=5432 --username=[RDSのナヌザヌ名] --dbname=[RDSのデヌタベヌス名] --password postgres 次に、 psql を甚いおS3のファむルデヌタをRDSにむンポヌトするため、以䞋のコマンドから aws _s3 拡匵機胜 をむンストヌルしたす。 CREATE EXTENSION aws_s3 CASCADE; \dx コマンドを実行し、 aws_s3 拡匵機胜 がむンストヌルされおいるこずを確認したす。 postgres=> \dx List of installed extensions Name | Version | Schema | Description -------------+---------+------------+--------------------------------------------- aws_commons | 1.2 | public | Common data types across AWS services aws_s3 | 1.1 | public | AWS S3 extension for importing data from S3 plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows) ここが今回の本題です。 課題にも蚘茉したしたが、userテヌブルのidはレコヌドが䜜成されるたで生成されないため、accountテヌブルの倖郚キヌであるuser_idは CSV 圢匏に倉換するタむミングでは確定させるこずができたせんでした。 今回は以䞋の方法で解決したした。 userテヌブルのナニヌクカラム(email)をフィヌルドに持぀ account_tmpテヌブルを䜜成する。 S3にアップロヌドした csv ファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む。 userテヌブルに䜜成されたレコヌドからaccount_tmpテヌブルに蚭定したナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する。 account_tmpテヌブルのレコヌドをaccountテヌブルにINSERTする。 account_tmpテヌブルを削陀する。 具䜓的には以䞋の SQL ファむルを psql から実行したす。 \i data_migration.sql -- data_migration.sql -- 1. account_tmpテヌブルを䜜成する CREATE TABLE " account_tmp " ( " id " SERIAL NOT NULL , " name " TEXT NOT NULL , " user_id " INTEGER , " created_at " TIMESTAMP ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP , " updated_at " TIMESTAMP ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP , " email " TEXT NOT NULL , CONSTRAINT " account_tmp_pkey " PRIMARY KEY ( " id " ) ); -- 2. S3にアップロヌドしたcsvファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む SELECT aws_s3.table_import_from_s3( ' "account_tmp" ' , -- テヌブル名 ' "name", "user_id", "created_at", "updated_at", "email" ' , -- カラム名 ' (format csv) ' , -- ファむル圢匏 ' bucket-name ' , -- バケット名 ' upload/accountTable.csv ' , -- バケットルヌトからのファむルパス ' ap-northeast-1 ' -- リヌゞョン ); SELECT aws_s3.table_import_from_s3( ' "user" ' , ' "email", "created_at", "updated_at" ' , ' (format csv) ' , ' bucket-name ' , ' upload/userTable.csv ' , ' ap-northeast-1 ' ); -- 3. ナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する UPDATE " account_tmp " SET " userId " = " user " . " id " FROM " user " WHERE " account_tmp " . " email " = " user " . " email " ; -- 4. account_tmpテヌブルのレコヌドをaccountテヌブルにINSERTする INSERT INTO " account " ( " name " , " user_id " , " created_at " , " updated_at " ) SELECT " name " , " user_id " , " created_at " , " updated_at " FROM " account_tmp " ; -- 5. account_tmpテヌブルを削陀する DROP TABLE " account_tmp " ; 以䞊で無事にRDSぞデヌタを移行できたした。 ちなみに開発環境のデヌタベヌスに取り蟌む際は、以䞋2点を倉曎しおください。 psql でデヌタベヌスにログむンする際、開発環境のデヌタベヌスホスト名・ポヌト番号・デヌタベヌス名・ナヌザヌ名に眮き換えお実行する。 「data_migration. sql 」の「2. S3にアップロヌドした csv ファむルを、userテヌブルずaccount_tmpテヌブルに取り蟌む」郚分を開発環境の csv ファむルからデヌタを取り蟌むように修正しお、 \i data_migration.sql を実行する。 -- data_migration.sql -- (省略) -- 2. csvファむルをテヌブルに取り蟌む \COPY " account_tmp " ( " name " , " user_id " , " created_at " , " updated_at " , " email " ) FROM ' ./output/accountTable.csv ' DELIMITER ' , ' CSV \COPY " user " ( " email " , " created_at " , " updated_at " ) FROM ' ./output/userTable.csv ' DELIMITER ' , ' CSV -- 3. ナニヌクフィヌルドをもずにidを取埗し、account_tmpテヌブルのuser_idを曎新する -- (省略) たずめ 今回は、DynamoDBからRDSぞデヌタを移行する際に苊戊したこずを蚘事に残したした。user_id問題以倖にも、DynamoDB JSON の倉換方法など色々ず勉匷になりたした。 同じ堎面に出くわす機䌚は少ないず思いたすが、どなたかの参考になれば幞いです。 最埌たでお読みいただきたしおありがずうございたした。 私たちは䞀緒に働いおくれる仲間を募集しおいたす フルサむクル゚ンゞニア 執筆 @suzuki.takuma 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS WAF には AWS マネヌゞドルヌル が耇数提䟛されおおり、利甚するこずで AWS が定めた条件に䞀臎するリク ゚ス トをブロックしおくれたす。各マネヌゞドルヌルグルヌプには、耇数の個別のルヌルが含たれおいたす。䟋えば コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ には、v1.6 時点で 22 個の個別ルヌルが含たれおいたす。 マネヌゞドルヌルグルヌプの個別ルヌルには、アプリケヌションによっおは条件が厳しすぎるものもありたす。䟋えば以䞋の個別ルヌルによっおリク ゚ス トをブロックしお欲しくない堎合があるかもしれたせん。 マネヌゞドルヌル名 怜出条件 SizeRestrictions_BODY リク ゚ス トボディサむズが 8 KB を超える堎合はブロック EC2MetaDataSSRF_BODY リク ゚ス トボディに「 localhost 」「 127.0.0.1 」の文字列が含たれおいる堎合はブロック泚1 GenericLFI_BODY リク ゚ス トボディに「../../」の文字列が含たれおいる堎合はブロック、など (泚1) 筆者が確認した条件であり、公匏のアナりンスではありたせん。たた他にも条件があるかもしれたせん。 マネヌゞドルヌルがアプリケヌションの芁件に合わない時は、個別のルヌルのアクションを Count にオヌバヌラむドするこずができたす。 しかしこれではあらゆる状況においおそのルヌルによるブロックが無効化されおしたい、マネヌゞドルヌルを䜿っおいる効果が薄れおしたいたす。そうではなく、「特定の条件においおのみ」マネヌゞドルヌルのアクションを Count に倉曎したい堎合があるず思いたす。 こちら でも玹介されおいるような方法であり、 AWS WAF の ラベル を利甚しお実珟したす。 マネヌゞドルヌルに条件を远加する仕組み たず、特定の条件においお「のみ」マネヌゞドルヌルのアクションを倉曎するための仕組みを説明したす。 マネヌゞドルヌルの刀定条件に䞀臎した堎合、䞀臎した目印ずしお特定の「ラベル」がリク ゚ス トに付䞎されたす。ルヌルアクションを Count にオヌバヌラむドした堎合も、ブロックはされなくなりたすが「ラベル」は Block の時ず倉わらず付䞎されたす。䟋えば EC2MetaDataSSRF_BODY ルヌルに䞀臎した堎合は awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body ずいうラベルが付䞎されたす。付䞎されたラベルは Web ACL 内の埌続のルヌルからも確認するこずができたす。 マネヌゞドルヌルグルヌプの埌に評䟡される自䜜ルヌルを远加し、Statement に「 Count にオヌバヌラむドしたマネヌゞドルヌルに䞀臎した堎合に付䞎されるラベル」ず「ブロックを有効にしたい条件」を AND 条件で評䟡させるこずで、「特定の条件においおのみ」アクションを Count に倉曎するこずができたす。䟋えば、リク ゚ス トの URI パスが /api/* であれば EC2MetaDataSSRF_BODY ルヌルによるブロックを無効にしたいが、他の URI パスではそのたた有効にしたい堎合、次の2぀の Statement を AND 条件で繋げ、アクションを Block ずした自䜜ルヌルを远加したす。 リク ゚ス トに「awswaf:managed: aws :core-rule-set:EC2MetaDataSSRF_Body」ラベルがある か぀ URI パスが /api/* ではない (NotStatement) 堎合に、 Block ここからは、これを実際にマネゞメントコン゜ヌルで詊しおみたす。 準備ALBの䜜成 WAF Web ACL を関連付けるための ALB を䜜成し、固定レスポンスを返すようにしたす。 WAF Web ACL 䜜成 WAF Web ACL を䜜成し、ALB に関連付けたす。 「Create web ACL 」をクリック Web ACL の名前を入力し、前のステップで䜜成した ALB を関連付け、「Next」をクリック 「Add managed rule groups」をクリック 「 AWS managed rule groups」にある「Core rule set」のスむッチをオン あずはデフォルト蚭定のたた Web ACL の䜜成を完了させたす。 WAFの動䜜確認①マネヌゞドルヌルの動䜜確認 WAF Web ACL が関連付けられた状態の ALB にリク ゚ス トを送っおみたす。 ボディに䜕も含たれおいない POST リク ゚ス トは、ブロックされるこずなく ALB に蚭定した固定レスポンスが返っおきたす。 しかしリク ゚ス トボディに「 localhost 」を含めるず、WAF にブロックされ 403 が返されたす。 個別ルヌルのアクションのオヌバヌラむド EC2MetaDataSSRF_BODY ルヌルのアクションを Count にオヌバヌラむドし、リク ゚ス トボディに「 localhost 」があっおもブロックされないようにしおいきたす。 先ほど䜜成した WAF Web ACL に远加したマネヌゞドルヌルをチェックし、「Edit」を遞択 EC2MetaDataSSRF_BODY ルヌルアクションを Override to Count に倉曎し、「Save rule」をクリック 次の画面でも「Save」をクリック WAFの動䜜確認②マネヌゞドルヌル無効化の確認 再びリク ゚ス トボディに「 localhost 」を含めるリク ゚ス トを送信するず、今床はブロックされずに固定レスポンスが返っおきたす。 珟圚、あらゆる状況においお EC2MetaDataSSRF_BODY ルヌルによるブロックが無効化されおいる状態です。次のステップからは「 URI パスが /api/ から始たる堎合に限り、ブロックを無効化する」ようにカスタマむズしおいきたす。 自䜜ルヌルの远加 「Add my own rules and rule groups」をクリック ビゞュアル゚ディタで次のように Statement を組み立お、「Add rule」をクリック 優先順䜍がマネヌゞドルヌルグルヌプよりも埌ろであるこずを確認し、「Save」をクリック WAFの動䜜確認③自䜜ルヌルの確認 再びリク ゚ス トボディに「 localhost 」を含めるリク ゚ス トを送信するず、今床はブロックされたした。 しかし、リク ゚ス ト URI を「/ api /hello」ずするず、ブロックされずに通過したした。 以䞊で、マネヌゞドルヌルグルヌプの個別ルヌルに条件を远加するこずができたした。 より耇雑な条件の堎合 以䞊はシンプルな条件に぀いお確認したしたが、条件が耇雑な堎合の自䜜ルヌルの組み方を簡単に説明したす。䟋ずしお以䞋の堎合です。 マネヌゞドルヌルグルヌプの EC2MetaDataSSRF_BODY ルヌルず GenericLFI_BODY ルヌルを察象にしたい リク ゚ス トがこれらのルヌルに䞀臎した堎合、「リク ゚ス ト URI が /api/* 」か぀「 content-type ヘッダヌが application/json 」の堎合はブロックされないようにしたい。それ以倖の堎合はブロックしたい このような自䜜ルヌルは次のように実珟できたす。 今のずころ AND 条件や OR 条件が倚重になるルヌルはビゞュアル゚ディタで䜜成できたせんので、 JSON ゚ディタに切り替えおルヌルを線集するこずになりたす。 䟋に瀺した耇雑な条件の自䜜ルヌルは、以䞋のような JSON で䜜れたす。 { " Name ": " custom-body-block ", " Priority ": 1 , " Statement ": { " AndStatement ": { " Statements ": [ { " OrStatement ": { " Statements ": [ { " LabelMatchStatement ": { " Scope ": " LABEL ", " Key ": " awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body " } } , { " LabelMatchStatement ": { " Scope ": " LABEL ", " Key ": " awswaf:managed:aws:core-rule-set:GenericLFI_Body " } } ] } } , { " NotStatement ": { " Statement ": { " AndStatement ": { " Statements ": [ { " ByteMatchStatement ": { " SearchString ": " /api/ ", " FieldToMatch ": { " UriPath ": {} } , " TextTransformations ": [ { " Priority ": 0 , " Type ": " NONE " } ] , " PositionalConstraint ": " STARTS_WITH " } } , { " ByteMatchStatement ": { " SearchString ": " application/json ", " FieldToMatch ": { " SingleHeader ": { " Name ": " content-type " } } , " TextTransformations ": [ { " Priority ": 0 , " Type ": " NONE " } ] , " PositionalConstraint ": " EXACTLY " } } ] } } } } ] } } , " Action ": { " Block ": {} } , " VisibilityConfig ": { " SampledRequestsEnabled ": true , " CloudWatchMetricsEnabled ": true , " MetricName ": " custom-body-block " } } さいごに AWS WAF マネヌゞドルヌルグルヌプの個別ルヌルの適甚条件を、ラベルず自䜜ルヌルを䜿っおカスタマむズする方法を詊したした。最初は難しそうに芋えるかもしれたせんが、理屈を理解するず柔軟にマネヌゞドルヌルをカスタマむズできるようになるので、 AWS WAF をより䜿いこなしたい方はぜひ詊しおみおください。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア 執筆 @kou.kinyo 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS WAF には AWS マネヌゞドルヌル が耇数提䟛されおおり、利甚するこずで AWS が定めた条件に䞀臎するリク ゚ス トをブロックしおくれたす。各マネヌゞドルヌルグルヌプには、耇数の個別のルヌルが含たれおいたす。䟋えば コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ には、v1.6 時点で 22 個の個別ルヌルが含たれおいたす。 マネヌゞドルヌルグルヌプの個別ルヌルには、アプリケヌションによっおは条件が厳しすぎるものもありたす。䟋えば以䞋の個別ルヌルによっおリク ゚ス トをブロックしお欲しくない堎合があるかもしれたせん。 マネヌゞドルヌル名 怜出条件 SizeRestrictions_BODY リク ゚ス トボディサむズが 8 KB を超える堎合はブロック EC2MetaDataSSRF_BODY リク ゚ス トボディに「 localhost 」「 127.0.0.1 」の文字列が含たれおいる堎合はブロック泚1 GenericLFI_BODY リク ゚ス トボディに「../../」の文字列が含たれおいる堎合はブロック、など (泚1) 筆者が確認した条件であり、公匏のアナりンスではありたせん。たた他にも条件があるかもしれたせん。 マネヌゞドルヌルがアプリケヌションの芁件に合わない時は、個別のルヌルのアクションを Count にオヌバヌラむドするこずができたす。 しかしこれではあらゆる状況においおそのルヌルによるブロックが無効化されおしたい、マネヌゞドルヌルを䜿っおいる効果が薄れおしたいたす。そうではなく、「特定の条件においおのみ」マネヌゞドルヌルのアクションを Count に倉曎したい堎合があるず思いたす。 こちら でも玹介されおいるような方法であり、 AWS WAF の ラベル を利甚しお実珟したす。 マネヌゞドルヌルに条件を远加する仕組み たず、特定の条件においお「のみ」マネヌゞドルヌルのアクションを倉曎するための仕組みを説明したす。 マネヌゞドルヌルの刀定条件に䞀臎した堎合、䞀臎した目印ずしお特定の「ラベル」がリク ゚ス トに付䞎されたす。ルヌルアクションを Count にオヌバヌラむドした堎合も、ブロックはされなくなりたすが「ラベル」は Block の時ず倉わらず付䞎されたす。䟋えば EC2MetaDataSSRF_BODY ルヌルに䞀臎した堎合は awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body ずいうラベルが付䞎されたす。付䞎されたラベルは Web ACL 内の埌続のルヌルからも確認するこずができたす。 マネヌゞドルヌルグルヌプの埌に評䟡される自䜜ルヌルを远加し、Statement に「 Count にオヌバヌラむドしたマネヌゞドルヌルに䞀臎した堎合に付䞎されるラベル」ず「ブロックを有効にしたい条件」を AND 条件で評䟡させるこずで、「特定の条件においおのみ」アクションを Count に倉曎するこずができたす。䟋えば、リク ゚ス トの URI パスが /api/* であれば EC2MetaDataSSRF_BODY ルヌルによるブロックを無効にしたいが、他の URI パスではそのたた有効にしたい堎合、次の2぀の Statement を AND 条件で繋げ、アクションを Block ずした自䜜ルヌルを远加したす。 リク ゚ス トに「awswaf:managed: aws :core-rule-set:EC2MetaDataSSRF_Body」ラベルがある か぀ URI パスが /api/* ではない (NotStatement) 堎合に、 Block ここからは、これを実際にマネゞメントコン゜ヌルで詊しおみたす。 準備ALBの䜜成 WAF Web ACL を関連付けるための ALB を䜜成し、固定レスポンスを返すようにしたす。 WAF Web ACL 䜜成 WAF Web ACL を䜜成し、ALB に関連付けたす。 「Create web ACL 」をクリック Web ACL の名前を入力し、前のステップで䜜成した ALB を関連付け、「Next」をクリック 「Add managed rule groups」をクリック 「 AWS managed rule groups」にある「Core rule set」のスむッチをオン あずはデフォルト蚭定のたた Web ACL の䜜成を完了させたす。 WAFの動䜜確認①マネヌゞドルヌルの動䜜確認 WAF Web ACL が関連付けられた状態の ALB にリク ゚ス トを送っおみたす。 ボディに䜕も含たれおいない POST リク ゚ス トは、ブロックされるこずなく ALB に蚭定した固定レスポンスが返っおきたす。 しかしリク ゚ス トボディに「 localhost 」を含めるず、WAF にブロックされ 403 が返されたす。 個別ルヌルのアクションのオヌバヌラむド EC2MetaDataSSRF_BODY ルヌルのアクションを Count にオヌバヌラむドし、リク ゚ス トボディに「 localhost 」があっおもブロックされないようにしおいきたす。 先ほど䜜成した WAF Web ACL に远加したマネヌゞドルヌルをチェックし、「Edit」を遞択 EC2MetaDataSSRF_BODY ルヌルアクションを Override to Count に倉曎し、「Save rule」をクリック 次の画面でも「Save」をクリック WAFの動䜜確認②マネヌゞドルヌル無効化の確認 再びリク ゚ス トボディに「 localhost 」を含めるリク ゚ス トを送信するず、今床はブロックされずに固定レスポンスが返っおきたす。 珟圚、あらゆる状況においお EC2MetaDataSSRF_BODY ルヌルによるブロックが無効化されおいる状態です。次のステップからは「 URI パスが /api/ から始たる堎合に限り、ブロックを無効化する」ようにカスタマむズしおいきたす。 自䜜ルヌルの远加 「Add my own rules and rule groups」をクリック ビゞュアル゚ディタで次のように Statement を組み立お、「Add rule」をクリック 優先順䜍がマネヌゞドルヌルグルヌプよりも埌ろであるこずを確認し、「Save」をクリック WAFの動䜜確認③自䜜ルヌルの確認 再びリク ゚ス トボディに「 localhost 」を含めるリク ゚ス トを送信するず、今床はブロックされたした。 しかし、リク ゚ス ト URI を「/ api /hello」ずするず、ブロックされずに通過したした。 以䞊で、マネヌゞドルヌルグルヌプの個別ルヌルに条件を远加するこずができたした。 より耇雑な条件の堎合 以䞊はシンプルな条件に぀いお確認したしたが、条件が耇雑な堎合の自䜜ルヌルの組み方を簡単に説明したす。䟋ずしお以䞋の堎合です。 マネヌゞドルヌルグルヌプの EC2MetaDataSSRF_BODY ルヌルず GenericLFI_BODY ルヌルを察象にしたい リク ゚ス トがこれらのルヌルに䞀臎した堎合、「リク ゚ス ト URI が /api/* 」か぀「 content-type ヘッダヌが application/json 」の堎合はブロックされないようにしたい。それ以倖の堎合はブロックしたい このような自䜜ルヌルは次のように実珟できたす。 今のずころ AND 条件や OR 条件が倚重になるルヌルはビゞュアル゚ディタで䜜成できたせんので、 JSON ゚ディタに切り替えおルヌルを線集するこずになりたす。 䟋に瀺した耇雑な条件の自䜜ルヌルは、以䞋のような JSON で䜜れたす。 { " Name ": " custom-body-block ", " Priority ": 1 , " Statement ": { " AndStatement ": { " Statements ": [ { " OrStatement ": { " Statements ": [ { " LabelMatchStatement ": { " Scope ": " LABEL ", " Key ": " awswaf:managed:aws:core-rule-set:EC2MetaDataSSRF_Body " } } , { " LabelMatchStatement ": { " Scope ": " LABEL ", " Key ": " awswaf:managed:aws:core-rule-set:GenericLFI_Body " } } ] } } , { " NotStatement ": { " Statement ": { " AndStatement ": { " Statements ": [ { " ByteMatchStatement ": { " SearchString ": " /api/ ", " FieldToMatch ": { " UriPath ": {} } , " TextTransformations ": [ { " Priority ": 0 , " Type ": " NONE " } ] , " PositionalConstraint ": " STARTS_WITH " } } , { " ByteMatchStatement ": { " SearchString ": " application/json ", " FieldToMatch ": { " SingleHeader ": { " Name ": " content-type " } } , " TextTransformations ": [ { " Priority ": 0 , " Type ": " NONE " } ] , " PositionalConstraint ": " EXACTLY " } } ] } } } } ] } } , " Action ": { " Block ": {} } , " VisibilityConfig ": { " SampledRequestsEnabled ": true , " CloudWatchMetricsEnabled ": true , " MetricName ": " custom-body-block " } } さいごに AWS WAF マネヌゞドルヌルグルヌプの個別ルヌルの適甚条件を、ラベルず自䜜ルヌルを䜿っおカスタマむズする方法を詊したした。最初は難しそうに芋えるかもしれたせんが、理屈を理解するず柔軟にマネヌゞドルヌルをカスタマむズできるようになるので、 AWS WAF をより䜿いこなしたい方はぜひ詊しおみおください。 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア 執筆 @kou.kinyo 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の孫です。 珟圚、我々はChatGPT党般の掻甚を積極的に怜蚎しおおり、その倚様な可胜性の䞭には メタバヌス におけるChatGPTの利甚も含たれおいたす。 この芳点から、 AWS 䞊にサヌバヌレス アヌキテクチャ を採甚したChatGPT掻甚アプリケヌションの蚭蚈ず構築を実斜いたしたした。 はじめに むンフラストラクチャの党䜓像 実装手順 構築手順 事前準備 手順1. Lambda関数の䜜成 手順2. DynamoDBの䜜成 手順3. WebSocket API Gatewayの䜜成 手順4. SNSトピックの䜜成 機胜怜蚌 セッションテスト 耇数のクラむアントが同時にセッションを持぀テスト 終わりに はじめに ChatGPTベヌスのアプリケヌションを構築する際には、2぀の䞀般的な遞択肢がありたす。 䞀぀は既存のアプリケヌションにOpenAI API を盎接統合するこず、もう䞀぀はOpenAI API をラップしおむンフラサヌビス化にするこずです。 今回は、以䞋の点を考慮しお、埌者の遞択をしたした セキュリティリスクアプリケヌション偎でOpenAI API Keyを管理する必芁があるこず コスト管理OpenAIずのやり取りは有料で、ナヌザヌの質問の頻床ず単語数を制埡する必芁があるこず 再利甚可胜性開発した゜リュヌションは他のプロゞェクトに適甚可胜で、コストを節玄できるこず 今回は、むンフラスト ラク チャを蚭蚈する前に、以䞋の芁件を明確にしたした 耇数のナヌザヌが同時に䞀぀のOpenAIアカりントを䜿甚できるこず 埓量課金制を実装し、コストを削枛するこず サヌバヌの維持コストを削枛するこず API トラフィック 制埡を実装するこず OpenAIぞのリク ゚ス トの同時実行数を制限するこず これらの芁件に基づいお、今回は以䞋のむンフラスト ラク チャ蚭蚈を完成させたした。 むンフラスト ラク チャの党䜓像 本蚘事では、䞋蚘の構成図に基づき、構築䜜業を進めおいきたす。 WebSocket API Gateway クラむアントのリク ゚ス トをバック゚ンドサヌビスにルヌティングするために䜿甚したす。 API リク ゚ス トの トラフィック 制埡ができたす HTTPの30秒の タむムアりト 制限を解決し、503゚ラヌを枛らすために、WebSocket接続方匏を遞択したした meta_connect_handler ナヌザヌの認蚌機胜を提䟛したす。 本蚘事では、むンフラ構築に焊点を圓おるため、認蚌に関する実装は察象倖ずしおおりたす meta_handler_chat ナヌザヌのリク ゚ス トを Amazon SNS サヌビスに転送する機胜を提䟛したす。 ナヌザヌのリク ゚ス トは SNS を介しお凊理されるため、OpenAIサヌバヌぞの即時リク ゚ス トが䞍芁ずなり、非同期凊理になりたす meta_chat ナヌザヌからのリク ゚ス トをOpenAIサヌバヌに送信し、その結果を受け取る機胜を提䟛したす。 本蚘事においおは、 LangChain version: 0.0.317 フレヌムワヌク を掻甚しお、OpenAI API を介しおOpenAIずのやり取りを行いたす LangChain フレヌムワヌク を䜿甚するこずで、OpenAI API を盎接利甚するこずなく、LLMLarge Language Modelsアプリケヌションの開発を高速化できたす ただし、LangChainのバヌゞョン曎新は頻繁に行われるため、本蚘事で䜿甚しおいる API が将来的に非掚奚deprecatedになる可胜性にご泚意ください。そのため、特定のバヌゞョンを固定するこずをお勧めしたす。 meta_disconnect_handler ナヌザヌがログアりトした埌、その䌚話履歎を削陀する機胜を提䟛したす。 Dynamodb ナヌザヌの䌚話履歎を保存するテヌブルを䜜成したす。 SNS ナヌザヌのリク ゚ス トを非同期に凊理するために䜿甚したす。 䞊蚘の AWS アヌキテクチャ 図に蚘茉した番号①〜⑚に沿っお、凊理の流れを説明したす。 ① ナヌザヌはWebSocket URL接続を介しおChatGPTサヌビスの利甚を開始する ② 接続は最初にWebSocketのデフォルトの /$Connect ルヌトにルヌティングされ、 meta_connect_handler で接続の認蚌を実斜する ③ ナヌザヌは /sendprompt ルヌトを通じおチャット内容を meta_handler_chat に送信する ④ meta_handler_chat が凊理した埌、ナヌザヌリク ゚ス トは SNS サヌビスのトピックに送信する ⑀ SNS はナヌザヌリク ゚ス トを サブスクリプション meta_chat Functionに送信する ⑥ meta_chat は Langchain を利甚し、OpenAIずの察話機胜をそろえ、䌚話の文脈はDynamoDBに保存される ⑊ OpenAIサヌバヌは質問回答を返し、WebSocket接続を介しおナヌザヌに返华する ⑧ ナヌザヌがLogoutしたら、 /$disconnect ルヌトがトリガヌされる ⑚ meta_disconnect_handler はDynamoDBのナヌザヌ䌚話の文脈を削陀し、プロセスが終了する 実装手順 構築手順 以䞋の手順で構築を行いたす。 Lambda関数の䜜成 DynamoDBの䜜成 WebSocket API Gateway の䜜成 SNS トピックの䜜成 事前準備 NodeJS開発環境のセットアップ ロヌカルに Node.js をダりンロヌドしおむンストヌルしたす18.xバヌゞョンを掚奚 本蚘事で提䟛されたコヌドは、Lambdaにコピヌするこずでそのたた クラりド 環境でビルド・運甚が可胜です ただし、埌述するLangChainレむダヌの䜜成プロセスにおいおロヌカル環境でLangChainパッケヌゞをダりンロヌドする必芁があり、その際にはNodeJS環境が䜿甚されるこずにご泚意ください AWS アカりントの䜜成 AWS アカりントを持っおいる堎合は、察応䞍芁です AWS アカりントをお持ちでない堎合は、 カりント䜜成の流れ を参考に、アカりントを䜜成しおください ※本怜蚌を行う堎合、䜿甚する AWS リ゜ヌスの利甚料金が発生する点にご泚意ください OpenAIアカりントの䜜成 OpenAI API のアカりントを䜜成し API KEYを入手したす API KEYの発行手順は こちら を参照しおください 手順1. Lambda関数の䜜成 meta_connect_handler AWS Lambdaコン゜ヌルで meta_connect_handler ずいう名前のLambda関数を䜜成し、ランタむムずしおNode.js 18.xを遞択したす。 ※䞊述した通り、本蚘事ではむンフラ構築に焊点を圓おるため、認蚌に関する実装は察象倖です。デフォルトで生成されたコヌドをそのたた䜿甚しおください。 meta_handler_chat 䞊蚘ず同様に AWS Lambdaコン゜ヌルで meta_handler_chat ずいう名前のLambda関数を䜜成したす。 この関数はナヌザヌリク ゚ス トを受け取り、 SNS サヌビスのトピックに送信する圹割を果たしたす。 この関数に SNS のPublic暩限を远加し、 環境倉数 で SNS のARN倀 SNS_TOPIC_ARN を蚭定しおください。 具䜓的な実装コヌドは以䞋のずおりで、ナヌザヌのメッセヌゞ( event.body.user_msg )を取埗し、ナヌザヌ接続情報ずメッセヌゞ内容を含む SNS のトピックを発行したす。 // aws-sdkパッケヌゞをむンポヌトしたす import { SNSClient, PublishCommand } from "@aws-sdk/client-sns"; const client = new SNSClient(); const topicArn = process.env.SNS_TOPIC_ARN; export const handler = async(event) => { let body; if (typeof event.body === 'string') { body = JSON.parse(event.body); } else { body = event.body; } // ナヌザヌ接続情報ずメッセヌゞ内容を含むSNSのトピックを発行したす const command = new PublishCommand({ TopicArn:topicArn, Message:JSON.stringify({ requestContext:event.requestContext, payload: body.user_msg, }) }); let response; try{ await client.send(command); }catch (error) { console.log("Error:", JSON.stringify(error)); } }; meta_chat 同様な手順で AWS Lambdaコン゜ヌルで meta_chat ずいう名前のLambda関数を䜜成したす。 この関数はLangchainを䜿甚しおOpenAIサヌバヌずのむンタ ラク ションする圹割を果たしたす。 DynamoDBおよびAPIGatewayぞのアクセス暩限を远加し、OpenAI API KEYを 環境倉数 ずしお蚭定しおください。 たた、Lambdaではlangchainパッケヌゞがないため、ロヌカルでダりンロヌドし、Layerずしお関数にアップロヌドする必芁がありたす。 具䜓的な手順は以䞋のずおりです ロヌカルで npm install langchain を実行し、langchainをむンストヌルしたす。 生成された node_module フォルダをZIPのパッケヌゞ化したす。 ZIPファむルをLayerにアップロヌドし、関数でlayer䟝存関係を蚭定したす。 泚意OpenAIサヌビスの実行時間は3秒を超える可胜性があるため、関数の実行時間蚭定を調敎し(3秒 → 1分 )、 タむムアりト の問題を回避しおください。 「コヌド」タブにお、䞋蚘のコヌドをコピヌしおください。 // Langchainずaws-sdkパッケヌゞをむンポヌトしたす import { ChatOpenAI } from "langchain/chat_models/openai"; import { ConversationChain } from "langchain/chains"; import { BufferMemory } from "langchain/memory"; import { DynamoDBChatMessageHistory } from "langchain/stores/message/dynamodb"; import { ApiGatewayManagementApiClient, PostToConnectionCommand } from "@aws-sdk/client-apigatewaymanagementapi"; export const handler = async (event) => { console.log(JSON.stringify(event)); const body = JSON.parse(event.Records[0].Sns.Message); //SNSのトピックから必芁な情報クラむアントの接続情報、ナヌザヌの質問内容のpayloadを読み取りたす const requestContext = body.requestContext; const connectionId = requestContext.connectionId; const user_request = body.payload; // apigateway クラむアントの初期化 const apigateway_client = new ApiGatewayManagementApiClient({ endpoint: 'https://'+requestContext.domainName + '/' + requestContext.stage, });  // 文脈保存先ずしおのDynamoDBを蚭定し、DynamoDBChatMessageHistoryを初期化したす const chatHistory = new DynamoDBChatMessageHistory({ tableName: "Conversations", partitionKey: "ConnectionId", sessionId: connectionId, config: { region: "ap-northeast-1", }, }); // const memory = new BufferMemory({ chatHistory: chatHistory, }); // OpenAI model の初期化 const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0.5 }); // 初期化されたメモリおよびモデルを利甚しお、ConversationChainを初期化したす。 const chain = new ConversationChain({ memory: memory, llm: model, verbose: true }); try { // OpenAIサヌバヌにリク゚ストを送信したす const response = await chain.call({ input: user_request, }); // OpenAIからの回答を受け取り、それをクラむアントに返华したす const api_gateway_input = { ConnectionId: connectionId, Data: JSON.stringify(response) };    const command = new PostToConnectionCommand(api_gateway_input); await apigateway_client.send(command); } catch (error) { console.log("Error:", JSON.stringify(error)); } }; meta_disconnect_handler meta_disconnect_handler ずいう名前のLambda関数を䜜成し、䞻にナヌザヌの䌚話履歎をクリアするために䜿甚されたす。 meta_chat ず同様に、DynamoDBぞのアクセス暩限を远加しおください。 具䜓的なコヌドは以䞋のずおりです。 // Langchainパッケヌゞをむンポヌトしたす import { BufferMemory } from "langchain/memory"; import { DynamoDBChatMessageHistory } from "langchain/stores/message/dynamodb"; export const handler = async (event) => { console.log(JSON.stringify(event)); const requestContext = event.requestContext; const connectionId = requestContext.connectionId; const chatHistory = new DynamoDBChatMessageHistory({ tableName: "Conversations", partitionKey: "ConnectionId", sessionId: connectionId, config: { region: "ap-northeast-1", }, }); const memory = new BufferMemory({ chatHistory: chatHistory, }); //DynamoDBから該圓するナヌザヌの䌚話文脈を削陀したす await memory.chatHistory.clear(); }; 手順2. DynamoDBの䜜成 AWS 管理コン゜ヌル䞊で Amazon DynamoDB コン゜ヌルを開き、 Conversations ずいう名前のテヌブルず パヌティション キヌを ConnectionId に蚭定したす。 通垞、 パヌティション キヌはナヌザヌIDにすべきですが、今回ではログむン機胜がないため、クラむアント接続IDを パヌティション キヌずしお䜿甚したす。 手順3. WebSocket API Gateway の䜜成 コン゜ヌルからWebSocket API Gateway を䜜成したす。 ルヌティングキヌ $connect 、 $disconnect 、および sendprompt を远加したす。 Lambda関数の統合をそれぞれ蚭定したす。 WebSocket URL( wss ://)を蚘録したす。 手順4. SNS トピックの䜜成 暙準の SNS トピックを䜜成したす。 サブスクリプション を䜜成し、ポリシヌのフィヌルドでlambdaを遞択し、 meta_chat のARNリンクを゚ンドポむントのフィヌルドに貌り付けたす。 SNS トピックARNをコピヌし、 lambda_handle_chat の 環境倉数 SNS_TOPIC_ARN の倀に貌り付けたす。 機胜怜蚌 セッションテスト wscatツヌルのむンストヌル npm install -g wscat を実行し、wscatツヌルをむンストヌルしたす。これは AWS が提䟛するWebSocket API をテストするツヌルです。 参考資料 。 WebSocket URLぞの接続 以䞋のコマンドを䜿甚しお API Gateway に接続したす wscat -c 「WebSocket URL(wss://)」 セッションの開始 質問1「what is your name?」および質問2「What did I ask you just now?」に察する回答の関連性を確認したす文脈確認。 DynamoDBのデヌタを確認 DynamoDBで䌚話履歎を確認したす。 セッションの終了 [ctrl + c]を抌しおセッションを終了し、再床DynamoDBを確認しお、以前のセッション蚘録が削陀されたこずを確認したす。 耇数のクラむアントが同時にセッションを持぀テスト 2぀のクラむアントで実斜しおいる䌚話がそれぞれ独立しお行われるこずを確認するためのシミュレヌションを行いたす。 終わりに この蚘事では、 AWS 䞊でChatGPTベヌスのむンフラスト ラク チャの蚭蚈および構築に぀いお取り䞊げたした。 今埌、本むンフラ構成においお以䞋の点に぀いおさらなる改善を行う予定です。 OpenAIのアクセスキヌを保護するために AWS Secret Serviceを䜿甚したす ナヌザヌ数が増えるに぀れお、OpenAIの䜿甚制限に達した堎合に備えお、シヌムレスなアカりント切り替えを実装したす より正確な回答を提䟛するためにVectorDBを統合するこずを怜蚎しおいたす より察話型のナヌザヌ゚クス ペリ゚ ンスを提䟛するために、ストリヌミング応答モデルに移行したす これからもChatGPTの応甚シナリオに぀いおさらに探求し、その結果をAIに興味を持぀読者ず継続的に共有し続ける予定です。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 執筆 @chen.sun 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の孫です。 珟圚、我々はChatGPT党般の掻甚を積極的に怜蚎しおおり、その倚様な可胜性の䞭には メタバヌス におけるChatGPTの利甚も含たれおいたす。 この芳点から、 AWS 䞊にサヌバヌレス アヌキテクチャ を採甚したChatGPT掻甚アプリケヌションの蚭蚈ず構築を実斜いたしたした。 はじめに むンフラストラクチャの党䜓像 実装手順 構築手順 事前準備 手順1. Lambda関数の䜜成 手順2. DynamoDBの䜜成 手順3. WebSocket API Gatewayの䜜成 手順4. SNSトピックの䜜成 機胜怜蚌 セッションテスト 耇数のクラむアントが同時にセッションを持぀テスト 終わりに はじめに ChatGPTベヌスのアプリケヌションを構築する際には、2぀の䞀般的な遞択肢がありたす。 䞀぀は既存のアプリケヌションにOpenAI API を盎接統合するこず、もう䞀぀はOpenAI API をラップしおむンフラサヌビス化にするこずです。 今回は、以䞋の点を考慮しお、埌者の遞択をしたした セキュリティリスクアプリケヌション偎でOpenAI API Keyを管理する必芁があるこず コスト管理OpenAIずのやり取りは有料で、ナヌザヌの質問の頻床ず単語数を制埡する必芁があるこず 再利甚可胜性開発した゜リュヌションは他のプロゞェクトに適甚可胜で、コストを節玄できるこず 今回は、むンフラスト ラク チャを蚭蚈する前に、以䞋の芁件を明確にしたした 耇数のナヌザヌが同時に䞀぀のOpenAIアカりントを䜿甚できるこず 埓量課金制を実装し、コストを削枛するこず サヌバヌの維持コストを削枛するこず API トラフィック 制埡を実装するこず OpenAIぞのリク ゚ス トの同時実行数を制限するこず これらの芁件に基づいお、今回は以䞋のむンフラスト ラク チャ蚭蚈を完成させたした。 むンフラスト ラク チャの党䜓像 本蚘事では、䞋蚘の構成図に基づき、構築䜜業を進めおいきたす。 WebSocket API Gateway クラむアントのリク ゚ス トをバック゚ンドサヌビスにルヌティングするために䜿甚したす。 API リク ゚ス トの トラフィック 制埡ができたす HTTPの30秒の タむムアりト 制限を解決し、503゚ラヌを枛らすために、WebSocket接続方匏を遞択したした meta_connect_handler ナヌザヌの認蚌機胜を提䟛したす。 本蚘事では、むンフラ構築に焊点を圓おるため、認蚌に関する実装は察象倖ずしおおりたす meta_handler_chat ナヌザヌのリク ゚ス トを Amazon SNS サヌビスに転送する機胜を提䟛したす。 ナヌザヌのリク ゚ス トは SNS を介しお凊理されるため、OpenAIサヌバヌぞの即時リク ゚ス トが䞍芁ずなり、非同期凊理になりたす meta_chat ナヌザヌからのリク ゚ス トをOpenAIサヌバヌに送信し、その結果を受け取る機胜を提䟛したす。 本蚘事においおは、 LangChain version: 0.0.317 フレヌムワヌク を掻甚しお、OpenAI API を介しおOpenAIずのやり取りを行いたす LangChain フレヌムワヌク を䜿甚するこずで、OpenAI API を盎接利甚するこずなく、LLMLarge Language Modelsアプリケヌションの開発を高速化できたす ただし、LangChainのバヌゞョン曎新は頻繁に行われるため、本蚘事で䜿甚しおいる API が将来的に非掚奚deprecatedになる可胜性にご泚意ください。そのため、特定のバヌゞョンを固定するこずをお勧めしたす。 meta_disconnect_handler ナヌザヌがログアりトした埌、その䌚話履歎を削陀する機胜を提䟛したす。 Dynamodb ナヌザヌの䌚話履歎を保存するテヌブルを䜜成したす。 SNS ナヌザヌのリク ゚ス トを非同期に凊理するために䜿甚したす。 䞊蚘の AWS アヌキテクチャ 図に蚘茉した番号①〜⑚に沿っお、凊理の流れを説明したす。 ① ナヌザヌはWebSocket URL接続を介しおChatGPTサヌビスの利甚を開始する ② 接続は最初にWebSocketのデフォルトの /$Connect ルヌトにルヌティングされ、 meta_connect_handler で接続の認蚌を実斜する ③ ナヌザヌは /sendprompt ルヌトを通じおチャット内容を meta_handler_chat に送信する ④ meta_handler_chat が凊理した埌、ナヌザヌリク ゚ス トは SNS サヌビスのトピックに送信する ⑀ SNS はナヌザヌリク ゚ス トを サブスクリプション meta_chat Functionに送信する ⑥ meta_chat は Langchain を利甚し、OpenAIずの察話機胜をそろえ、䌚話の文脈はDynamoDBに保存される ⑊ OpenAIサヌバヌは質問回答を返し、WebSocket接続を介しおナヌザヌに返华する ⑧ ナヌザヌがLogoutしたら、 /$disconnect ルヌトがトリガヌされる ⑚ meta_disconnect_handler はDynamoDBのナヌザヌ䌚話の文脈を削陀し、プロセスが終了する 実装手順 構築手順 以䞋の手順で構築を行いたす。 Lambda関数の䜜成 DynamoDBの䜜成 WebSocket API Gateway の䜜成 SNS トピックの䜜成 事前準備 NodeJS開発環境のセットアップ ロヌカルに Node.js をダりンロヌドしおむンストヌルしたす18.xバヌゞョンを掚奚 本蚘事で提䟛されたコヌドは、Lambdaにコピヌするこずでそのたた クラりド 環境でビルド・運甚が可胜です ただし、埌述するLangChainレむダヌの䜜成プロセスにおいおロヌカル環境でLangChainパッケヌゞをダりンロヌドする必芁があり、その際にはNodeJS環境が䜿甚されるこずにご泚意ください AWS アカりントの䜜成 AWS アカりントを持っおいる堎合は、察応䞍芁です AWS アカりントをお持ちでない堎合は、 カりント䜜成の流れ を参考に、アカりントを䜜成しおください ※本怜蚌を行う堎合、䜿甚する AWS リ゜ヌスの利甚料金が発生する点にご泚意ください OpenAIアカりントの䜜成 OpenAI API のアカりントを䜜成し API KEYを入手したす API KEYの発行手順は こちら を参照しおください 手順1. Lambda関数の䜜成 meta_connect_handler AWS Lambdaコン゜ヌルで meta_connect_handler ずいう名前のLambda関数を䜜成し、ランタむムずしおNode.js 18.xを遞択したす。 ※䞊述した通り、本蚘事ではむンフラ構築に焊点を圓おるため、認蚌に関する実装は察象倖です。デフォルトで生成されたコヌドをそのたた䜿甚しおください。 meta_handler_chat 䞊蚘ず同様に AWS Lambdaコン゜ヌルで meta_handler_chat ずいう名前のLambda関数を䜜成したす。 この関数はナヌザヌリク ゚ス トを受け取り、 SNS サヌビスのトピックに送信する圹割を果たしたす。 この関数に SNS のPublic暩限を远加し、 環境倉数 で SNS のARN倀 SNS_TOPIC_ARN を蚭定しおください。 具䜓的な実装コヌドは以䞋のずおりで、ナヌザヌのメッセヌゞ( event.body.user_msg )を取埗し、ナヌザヌ接続情報ずメッセヌゞ内容を含む SNS のトピックを発行したす。 // aws-sdkパッケヌゞをむンポヌトしたす import { SNSClient, PublishCommand } from "@aws-sdk/client-sns"; const client = new SNSClient(); const topicArn = process.env.SNS_TOPIC_ARN; export const handler = async(event) => { let body; if (typeof event.body === 'string') { body = JSON.parse(event.body); } else { body = event.body; } // ナヌザヌ接続情報ずメッセヌゞ内容を含むSNSのトピックを発行したす const command = new PublishCommand({ TopicArn:topicArn, Message:JSON.stringify({ requestContext:event.requestContext, payload: body.user_msg, }) }); let response; try{ await client.send(command); }catch (error) { console.log("Error:", JSON.stringify(error)); } }; meta_chat 同様な手順で AWS Lambdaコン゜ヌルで meta_chat ずいう名前のLambda関数を䜜成したす。 この関数はLangchainを䜿甚しおOpenAIサヌバヌずのむンタ ラク ションする圹割を果たしたす。 DynamoDBおよびAPIGatewayぞのアクセス暩限を远加し、OpenAI API KEYを 環境倉数 ずしお蚭定しおください。 たた、Lambdaではlangchainパッケヌゞがないため、ロヌカルでダりンロヌドし、Layerずしお関数にアップロヌドする必芁がありたす。 具䜓的な手順は以䞋のずおりです ロヌカルで npm install langchain を実行し、langchainをむンストヌルしたす。 生成された node_module フォルダをZIPのパッケヌゞ化したす。 ZIPファむルをLayerにアップロヌドし、関数でlayer䟝存関係を蚭定したす。 泚意OpenAIサヌビスの実行時間は3秒を超える可胜性があるため、関数の実行時間蚭定を調敎し(3秒 → 1分 )、 タむムアりト の問題を回避しおください。 「コヌド」タブにお、䞋蚘のコヌドをコピヌしおください。 // Langchainずaws-sdkパッケヌゞをむンポヌトしたす import { ChatOpenAI } from "langchain/chat_models/openai"; import { ConversationChain } from "langchain/chains"; import { BufferMemory } from "langchain/memory"; import { DynamoDBChatMessageHistory } from "langchain/stores/message/dynamodb"; import { ApiGatewayManagementApiClient, PostToConnectionCommand } from "@aws-sdk/client-apigatewaymanagementapi"; export const handler = async (event) => { console.log(JSON.stringify(event)); const body = JSON.parse(event.Records[0].Sns.Message); //SNSのトピックから必芁な情報クラむアントの接続情報、ナヌザヌの質問内容のpayloadを読み取りたす const requestContext = body.requestContext; const connectionId = requestContext.connectionId; const user_request = body.payload; // apigateway クラむアントの初期化 const apigateway_client = new ApiGatewayManagementApiClient({ endpoint: 'https://'+requestContext.domainName + '/' + requestContext.stage, });  // 文脈保存先ずしおのDynamoDBを蚭定し、DynamoDBChatMessageHistoryを初期化したす const chatHistory = new DynamoDBChatMessageHistory({ tableName: "Conversations", partitionKey: "ConnectionId", sessionId: connectionId, config: { region: "ap-northeast-1", }, }); // const memory = new BufferMemory({ chatHistory: chatHistory, }); // OpenAI model の初期化 const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo", temperature: 0.5 }); // 初期化されたメモリおよびモデルを利甚しお、ConversationChainを初期化したす。 const chain = new ConversationChain({ memory: memory, llm: model, verbose: true }); try { // OpenAIサヌバヌにリク゚ストを送信したす const response = await chain.call({ input: user_request, }); // OpenAIからの回答を受け取り、それをクラむアントに返华したす const api_gateway_input = { ConnectionId: connectionId, Data: JSON.stringify(response) };    const command = new PostToConnectionCommand(api_gateway_input); await apigateway_client.send(command); } catch (error) { console.log("Error:", JSON.stringify(error)); } }; meta_disconnect_handler meta_disconnect_handler ずいう名前のLambda関数を䜜成し、䞻にナヌザヌの䌚話履歎をクリアするために䜿甚されたす。 meta_chat ず同様に、DynamoDBぞのアクセス暩限を远加しおください。 具䜓的なコヌドは以䞋のずおりです。 // Langchainパッケヌゞをむンポヌトしたす import { BufferMemory } from "langchain/memory"; import { DynamoDBChatMessageHistory } from "langchain/stores/message/dynamodb"; export const handler = async (event) => { console.log(JSON.stringify(event)); const requestContext = event.requestContext; const connectionId = requestContext.connectionId; const chatHistory = new DynamoDBChatMessageHistory({ tableName: "Conversations", partitionKey: "ConnectionId", sessionId: connectionId, config: { region: "ap-northeast-1", }, }); const memory = new BufferMemory({ chatHistory: chatHistory, }); //DynamoDBから該圓するナヌザヌの䌚話文脈を削陀したす await memory.chatHistory.clear(); }; 手順2. DynamoDBの䜜成 AWS 管理コン゜ヌル䞊で Amazon DynamoDB コン゜ヌルを開き、 Conversations ずいう名前のテヌブルず パヌティション キヌを ConnectionId に蚭定したす。 通垞、 パヌティション キヌはナヌザヌIDにすべきですが、今回ではログむン機胜がないため、クラむアント接続IDを パヌティション キヌずしお䜿甚したす。 手順3. WebSocket API Gateway の䜜成 コン゜ヌルからWebSocket API Gateway を䜜成したす。 ルヌティングキヌ $connect 、 $disconnect 、および sendprompt を远加したす。 Lambda関数の統合をそれぞれ蚭定したす。 WebSocket URL( wss ://)を蚘録したす。 手順4. SNS トピックの䜜成 暙準の SNS トピックを䜜成したす。 サブスクリプション を䜜成し、ポリシヌのフィヌルドでlambdaを遞択し、 meta_chat のARNリンクを゚ンドポむントのフィヌルドに貌り付けたす。 SNS トピックARNをコピヌし、 lambda_handle_chat の 環境倉数 SNS_TOPIC_ARN の倀に貌り付けたす。 機胜怜蚌 セッションテスト wscatツヌルのむンストヌル npm install -g wscat を実行し、wscatツヌルをむンストヌルしたす。これは AWS が提䟛するWebSocket API をテストするツヌルです。 参考資料 。 WebSocket URLぞの接続 以䞋のコマンドを䜿甚しお API Gateway に接続したす wscat -c 「WebSocket URL(wss://)」 セッションの開始 質問1「what is your name?」および質問2「What did I ask you just now?」に察する回答の関連性を確認したす文脈確認。 DynamoDBのデヌタを確認 DynamoDBで䌚話履歎を確認したす。 セッションの終了 [ctrl + c]を抌しおセッションを終了し、再床DynamoDBを確認しお、以前のセッション蚘録が削陀されたこずを確認したす。 耇数のクラむアントが同時にセッションを持぀テスト 2぀のクラむアントで実斜しおいる䌚話がそれぞれ独立しお行われるこずを確認するためのシミュレヌションを行いたす。 終わりに この蚘事では、 AWS 䞊でChatGPTベヌスのむンフラスト ラク チャの蚭蚈および構築に぀いお取り䞊げたした。 今埌、本むンフラ構成においお以䞋の点に぀いおさらなる改善を行う予定です。 OpenAIのアクセスキヌを保護するために AWS Secret Serviceを䜿甚したす ナヌザヌ数が増えるに぀れお、OpenAIの䜿甚制限に達した堎合に備えお、シヌムレスなアカりント切り替えを実装したす より正確な回答を提䟛するためにVectorDBを統合するこずを怜蚎しおいたす より察話型のナヌザヌ゚クス ペリ゚ ンスを提䟛するために、ストリヌミング応答モデルに移行したす これからもChatGPTの応甚シナリオに぀いおさらに探求し、その結果をAIに興味を持぀読者ず継続的に共有し続ける予定です。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 執筆 @chen.sun 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
皆さんこんにちは。グルヌプ経営゜リュヌション事業郚グルヌプ経営 コンサルティング 第2ナニット䞀般䌚蚈 コンサルティング 郚第2グルヌプFAC郚に所属しおいる小林です。 FAC郚では自瀟補品である「Ci X (サむクロス)」ずいう䌚蚈システムパッケヌゞの新芏開発・導入・保守を行っおおり、私は䞻にその保守業務を担圓しおいたす。 この蚘事ではISIDに興味をお持ちの就掻生の方々向けに私がISIDに入瀟しお初めお担圓した業務から孊んだこずに぀いお、自身の振り返りの意味も蟌めおご玹介したいず思いたす。 あず、Ci Xに関しおは こちら も参考にしおみおください 自己玹介 たずは自己玹介いたしたす。 私は2022幎に新卒入瀟し、半幎の研修を経お、珟圚は2幎目の勀務になりたす。 倧孊では院たで進孊し、 攟射線 系の研究をしおいたした。 そのたたの進路でいくのならば、メヌカヌ勀務や 原子力 関係の䌁業に就職するのが王道でした。 物理ずいう孊問は奜きでしたし、研究宀も自分で望んで所属したしたが、倧孊4幎間で勉匷した物理の理論を、研究宀で応甚するこずは少なく、愚盎に地味な実隓を繰り返す成果の芋えない生掻が率盎に自分には合っおいたせんでした。そんな時にHP係を担圓したしお、孊べば孊ぶほど、スキルが身に付くのを感じ、研究宀のHPを管理したり、孊䌚のHPを䜜成するこずが楜しかったのを芚えおいたす。 ささいな理由ではありたしたが、本圓に自分のやりたいこずっお䜕だろうず考えた時に気づいたらIT業界を志すようになっおいたした。就掻では䞊手くいかないこずだらけでしたが、自分の率盎な思いを面癜いず聞いおくれたのがISIDで、IT経隓が特にない私でも垌望しおいた開発の郚眲に配属させおくれたした。 そしお珟圚、私は自瀟補品の保守業務からスタヌトしおいたす。 配属されおから䞀幎も経過はしおいたせんが、業務はかなり幅広いです。 今回はそれに぀いお広く浅く玹介いたしたす。 保守の仕事内容に぀いお 保守業務のおおたかな流れは補品のリリヌス埌、たず、お客様が補品を䜿甚しおいお䜕かしらお問い合わせが生じた際にその旚を保守窓口が受け取り、保守チヌムに察応を芁求したす。そしおその埌、保守チヌムは再珟調査や原因究明を行っお䞍具合かどうかを刀断し、必芁があれば蚭蚈を倉曎したり、䞭身の実装を修正したりしお仕様倉曎察応を行い、テストをしたす。 以䞋では私が携わった範囲で担圓した業務プロセスを私自身の所感も含めお説明したす。 1原因調査 トラブルシュヌティング の入り口になるプロセスです。起こっおしたったトラブルに察しお䜕が原因だったのか監査ログやシステムログなどを通しお原因を探りたす。 このプロセスはいざやっおみるずどの工皋の䞭でも盎感ずスキル、刀断力が必芁で、これを即座にできる人は保守ずしおの力が特に匷い人なのだず個人的に思っおいたす。 2蚭蚈 もし、仕様倉曎が必芁な堎合、蚭蚈を修正するこずがありたす。欠陥修正に該圓する蚭蚈曞の内容を読み蟌んで画面定矩やロゞックなどどこを修正すべきなのか刀断し、修正したす。特にロゞックが難しく、簿蚘の知識も絡む箇所もあるので、䜕床芋返しおも䞍明な郚分に関しおは先茩瀟員に聞きながら進めおいたした。 3実装 䞊蚘の蚭蚈修正が完了したあず、その蚭蚈に基づいお実際に内郚の実装も倉曎したす。 実装で甚いる技術芁玠は以䞋です。 バック゚ンド技術 Java , Spring Boot, Thymeleaf, PostgreSQL 等 フロント゚ンド技術 HTML5 、TypeScript、Vue.js 等 業務は新卒の研修で孊んだこずが盎接生きおおり、改めお研修の倧切さを実感したした。 4テスト 実装が完了した埌はテストを行い、機胜に問題がないか䞍具合チェックをしたす。盎接倉曎しおはいなくずもその倉曎の圱響を受けたずころに察しおバグが出おしたうこずもあるため、機胜のテストだけでなく、その呚蟺に関しおもテストをしたす。配属盎埌はこのプロセスから携わり、Ci*Xがどういう機胜を有しおいるのか孊びながらこれらのテストを行っおいたした。 5その他 䞊蚘以倖にも SQL を曎新したり、サヌバヌの管理者ずしおの業務もありたす。 SQL にはデヌタを定矩する DDL やデヌタを操䜜する DML など皮類がありたすが、フォルダごずに配眮され、䞀括しお リポゞトリ にたずめられおいたす。 私はGitを䜿甚しおチヌムメンバヌが線集や新芏䜜成した SQL を曎新しおいたす。Gitの勉匷にもなりたすし、 SQL を取り蟌む際に゚ラヌになるこずは倚々あるので、 SQL の内容に぀いお考える機䌚も倚いです。 たた、Ci*Xのテスト環境は AWS で運甚しおおり、アプリケヌションが動䜜しおいる環境は Amazon EC2 を䜿っおいたす。チヌム内から䟝頌されたサヌバヌの容量拡匵や棚卞、新芏䜜成、耇補などの業務を担圓しおいたす。たた、手動で行っおいたこれらの業務も今は AWS CDK ず GitHub Actionsを甚いお ゜ヌスコヌド から自動で行えるように取り組んでいたす。 AWS は未経隓でしたが、觊っおみるず楜しいこずも倚く、 AWS Certified Cloud Practitioner ずいう初玚の資栌を取り぀぀、もっず知識を深めお業務に応甚できたらいいなず思っおいたす。 䞀日の流れ 毎朝、 Jira のチケットの進捗状況を確認したす。 朝䌚終了埌はチケットの䜜業に取り組むこずが倚いです。 隔週で勉匷䌚があったり、毎週、䞀般䌚蚈 コンサルティング 郚の方たちず雑談するような時間もありたす。 配属圓初は䞍明点を䞊叞に盞談できるような倕䌚の時間も蚭けおもらっおいたした。 FAC郚保守業務での働き方の特城 配属前、開発は蚭蚈や実装などある皋床の期間を蚭定し、段階を螏みながら業務を進めおいくむメヌゞを持っおいたしたが、保守業務の特城は倚皮倚様な角床から䞍具合の察凊やテストを求められるこずが倚く、内容の異なるチケットを抱えおいるこずはよくあるこずなので、その点においお配属盎埌から幅広い業務に携われおいるず感じおいたす。 チケットも自分で遞択しながら進められたすし、先茩瀟員ずの1on1で業務やそれ以倖に困っおいるこずなどを適宜聞いおくれる堎もありたすので裁量を持っお仕事させおもらえる環境だなず日々感じおいたす。 たた、基本的にテレワヌクがメむンになりたす。出瀟する必芁がないので、そういう点で気楜さを感じおいたす。ただ、テレワヌクにおけるコミュニケヌションはテキストやメヌルが䞻ずなるため、個人の文章力や読解力の差で情報䌝達内容の認識に差異や時差が生じおしたったり、情報収集が必芁最䜎限になるこずが倚いなど、難しさも感じおいたす。䌚議を蚭定しお、あらかじめ質問をたずめ、限られた時間で情報収集する力が求められるなず日々感じおいたす。 最埌に 今回は、Ci*Xシリヌズの保守業務の内容ずその仕事や働き方の特城に぀いおお䌝えしたした。 テクニカルな話題が倚い䞭で、少し異色なブログではありたしたが、いかがでしたか 保守業務は様々な角床から問題点が切り蟌たれるので倧倉な思いをするこずもたくさんありたすが、その分、身に぀くスキルは倚いず思いたす。 これを芋おくださっおいる就掻生のみなさんずも共に仕事ができたらなず思いたす ありがずうございたした www.isid.co.jp 執筆 @kobayashi.shun 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
皆さんこんにちは。グルヌプ経営゜リュヌション事業郚グルヌプ経営 コンサルティング 第2ナニット䞀般䌚蚈 コンサルティング 郚第2グルヌプFAC郚に所属しおいる小林です。 FAC郚では自瀟補品である「Ci X (サむクロス)」ずいう䌚蚈システムパッケヌゞの新芏開発・導入・保守を行っおおり、私は䞻にその保守業務を担圓しおいたす。 この蚘事ではISIDに興味をお持ちの就掻生の方々向けに私がISIDに入瀟しお初めお担圓した業務から孊んだこずに぀いお、自身の振り返りの意味も蟌めおご玹介したいず思いたす。 あず、Ci Xに関しおは こちら も参考にしおみおください 自己玹介 たずは自己玹介いたしたす。 私は2022幎に新卒入瀟し、半幎の研修を経お、珟圚は2幎目の勀務になりたす。 倧孊では院たで進孊し、 攟射線 系の研究をしおいたした。 そのたたの進路でいくのならば、メヌカヌ勀務や 原子力 関係の䌁業に就職するのが王道でした。 物理ずいう孊問は奜きでしたし、研究宀も自分で望んで所属したしたが、倧孊4幎間で勉匷した物理の理論を、研究宀で応甚するこずは少なく、愚盎に地味な実隓を繰り返す成果の芋えない生掻が率盎に自分には合っおいたせんでした。そんな時にHP係を担圓したしお、孊べば孊ぶほど、スキルが身に付くのを感じ、研究宀のHPを管理したり、孊䌚のHPを䜜成するこずが楜しかったのを芚えおいたす。 ささいな理由ではありたしたが、本圓に自分のやりたいこずっお䜕だろうず考えた時に気づいたらIT業界を志すようになっおいたした。就掻では䞊手くいかないこずだらけでしたが、自分の率盎な思いを面癜いず聞いおくれたのがISIDで、IT経隓が特にない私でも垌望しおいた開発の郚眲に配属させおくれたした。 そしお珟圚、私は自瀟補品の保守業務からスタヌトしおいたす。 配属されおから䞀幎も経過はしおいたせんが、業務はかなり幅広いです。 今回はそれに぀いお広く浅く玹介いたしたす。 保守の仕事内容に぀いお 保守業務のおおたかな流れは補品のリリヌス埌、たず、お客様が補品を䜿甚しおいお䜕かしらお問い合わせが生じた際にその旚を保守窓口が受け取り、保守チヌムに察応を芁求したす。そしおその埌、保守チヌムは再珟調査や原因究明を行っお䞍具合かどうかを刀断し、必芁があれば蚭蚈を倉曎したり、䞭身の実装を修正したりしお仕様倉曎察応を行い、テストをしたす。 以䞋では私が携わった範囲で担圓した業務プロセスを私自身の所感も含めお説明したす。 1原因調査 トラブルシュヌティング の入り口になるプロセスです。起こっおしたったトラブルに察しお䜕が原因だったのか監査ログやシステムログなどを通しお原因を探りたす。 このプロセスはいざやっおみるずどの工皋の䞭でも盎感ずスキル、刀断力が必芁で、これを即座にできる人は保守ずしおの力が特に匷い人なのだず個人的に思っおいたす。 2蚭蚈 もし、仕様倉曎が必芁な堎合、蚭蚈を修正するこずがありたす。欠陥修正に該圓する蚭蚈曞の内容を読み蟌んで画面定矩やロゞックなどどこを修正すべきなのか刀断し、修正したす。特にロゞックが難しく、簿蚘の知識も絡む箇所もあるので、䜕床芋返しおも䞍明な郚分に関しおは先茩瀟員に聞きながら進めおいたした。 3実装 䞊蚘の蚭蚈修正が完了したあず、その蚭蚈に基づいお実際に内郚の実装も倉曎したす。 実装で甚いる技術芁玠は以䞋です。 バック゚ンド技術 Java , Spring Boot, Thymeleaf, PostgreSQL 等 フロント゚ンド技術 HTML5 、TypeScript、Vue.js 等 業務は新卒の研修で孊んだこずが盎接生きおおり、改めお研修の倧切さを実感したした。 4テスト 実装が完了した埌はテストを行い、機胜に問題がないか䞍具合チェックをしたす。盎接倉曎しおはいなくずもその倉曎の圱響を受けたずころに察しおバグが出おしたうこずもあるため、機胜のテストだけでなく、その呚蟺に関しおもテストをしたす。配属盎埌はこのプロセスから携わり、Ci*Xがどういう機胜を有しおいるのか孊びながらこれらのテストを行っおいたした。 5その他 䞊蚘以倖にも SQL を曎新したり、サヌバヌの管理者ずしおの業務もありたす。 SQL にはデヌタを定矩する DDL やデヌタを操䜜する DML など皮類がありたすが、フォルダごずに配眮され、䞀括しお リポゞトリ にたずめられおいたす。 私はGitを䜿甚しおチヌムメンバヌが線集や新芏䜜成した SQL を曎新しおいたす。Gitの勉匷にもなりたすし、 SQL を取り蟌む際に゚ラヌになるこずは倚々あるので、 SQL の内容に぀いお考える機䌚も倚いです。 たた、Ci*Xのテスト環境は AWS で運甚しおおり、アプリケヌションが動䜜しおいる環境は Amazon EC2 を䜿っおいたす。チヌム内から䟝頌されたサヌバヌの容量拡匵や棚卞、新芏䜜成、耇補などの業務を担圓しおいたす。たた、手動で行っおいたこれらの業務も今は AWS CDK ず GitHub Actionsを甚いお ゜ヌスコヌド から自動で行えるように取り組んでいたす。 AWS は未経隓でしたが、觊っおみるず楜しいこずも倚く、 AWS Certified Cloud Practitioner ずいう初玚の資栌を取り぀぀、もっず知識を深めお業務に応甚できたらいいなず思っおいたす。 䞀日の流れ 毎朝、 Jira のチケットの進捗状況を確認したす。 朝䌚終了埌はチケットの䜜業に取り組むこずが倚いです。 隔週で勉匷䌚があったり、毎週、䞀般䌚蚈 コンサルティング 郚の方たちず雑談するような時間もありたす。 配属圓初は䞍明点を䞊叞に盞談できるような倕䌚の時間も蚭けおもらっおいたした。 FAC郚保守業務での働き方の特城 配属前、開発は蚭蚈や実装などある皋床の期間を蚭定し、段階を螏みながら業務を進めおいくむメヌゞを持っおいたしたが、保守業務の特城は倚皮倚様な角床から䞍具合の察凊やテストを求められるこずが倚く、内容の異なるチケットを抱えおいるこずはよくあるこずなので、その点においお配属盎埌から幅広い業務に携われおいるず感じおいたす。 チケットも自分で遞択しながら進められたすし、先茩瀟員ずの1on1で業務やそれ以倖に困っおいるこずなどを適宜聞いおくれる堎もありたすので裁量を持っお仕事させおもらえる環境だなず日々感じおいたす。 たた、基本的にテレワヌクがメむンになりたす。出瀟する必芁がないので、そういう点で気楜さを感じおいたす。ただ、テレワヌクにおけるコミュニケヌションはテキストやメヌルが䞻ずなるため、個人の文章力や読解力の差で情報䌝達内容の認識に差異や時差が生じおしたったり、情報収集が必芁最䜎限になるこずが倚いなど、難しさも感じおいたす。䌚議を蚭定しお、あらかじめ質問をたずめ、限られた時間で情報収集する力が求められるなず日々感じおいたす。 最埌に 今回は、Ci*Xシリヌズの保守業務の内容ずその仕事や働き方の特城に぀いおお䌝えしたした。 テクニカルな話題が倚い䞭で、少し異色なブログではありたしたが、いかがでしたか 保守業務は様々な角床から問題点が切り蟌たれるので倧倉な思いをするこずもたくさんありたすが、その分、身に぀くスキルは倚いず思いたす。 これを芋おくださっおいる就掻生のみなさんずも共に仕事ができたらなず思いたす ありがずうございたした www.isid.co.jp 執筆 @kobayashi.shun 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS WAF は簡単に Web アプリに WAF を远加でき、か぀倀段も他の WAF 補品より安いため、奜きな AWS サヌビスの䞀぀です。そんな AWS WAF ですがしばらく構築・運甚し、これを最初から知っおおけば・・・ず思ったこずがあるので 8぀ご玹介したす。 AWS WAF の基本に぀いおは分かっおいる前提で、特に説明はいたしたせん。たた2023幎10月珟圚の最新バヌゞョンである、いわゆる「 AWS WAF v2」を察象ずしおいたす。 その1: AWS マネヌゞドルヌルのボディサむズ制限が厳しい その2: ファむルアップロヌドが AWS マネヌゞドルヌルの XSS に匕っかかるこずがある その3: マネヌゞドルヌルにはバヌゞョンがある その4: CloudWatch Logs のロググルヌプ名に決たりがある その5: 35個のログストリヌムに分割される その6: ログに Cookie ヘッダヌが蚘録されおしたう その7: ログ出力条件の EXCLUDED_AS_COUNT ずは䜕か その8: コン゜ヌルで䜜成したルヌルを JSON 出力するず IaC での曞き方がわかる さいごに その1: AWS マネヌゞドルヌルのボディサむズ制限が厳しい AWS WAF を利甚する際に AWS マネヌゞドルヌル はずおも䟿利です。その䞭の コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ には SizeRestrictions_BODY ずいうリク ゚ス トボディのサむズを怜査するルヌルがあり、 8 KB を超えるボディを持぀リク ゚ス トをブロック したす。 ボディサむズが倧きいリク ゚ス トや、ファむルアップロヌドにおいおは 8 KB を簡単に超えおしたう こずがあるので、本番環境に導入する前に想定するサむズのリク ゚ス トがブロックされないかしっかりテストが必芁です。 ※このようなルヌルが蚭定されおいる理由は、 AWS WAF は リク゚ストボディの最初の 8 KB しか怜査できない ずいう制玄があるためです。リク ゚ス トボディの 8 KB 以降の䜍眮に攻撃文字列が含たれおいおも怜査できないため、コアルヌルセットでは 8 KB を超えるリク ゚ス トを䞀埋でブロックするこずで察応しおいたす。 想定する正圓なリク ゚ス トが 8 KB を超えおしたう堎合、ルヌルグルヌプ内の SizeRestrictions_BODY ルヌルのアクションを「Count」にオヌバヌラむドするこずで、実質的に陀倖するこずができたす。ただしボディサむズ制限が党くないのは心蚱ないので、次のように WAF Web ACL を䜜るこずが考えられたす。 コアルヌルセットマネヌゞドルヌルグルヌプでは SizeRestrictions_BODY を「Count」にオヌバヌラむドする 適切な倀でボディサむズ制限を行う独自ルヌルを䜜成する このようなルヌルを耇数䜜り、リク ゚ス トパスに応じお異なるボディサむズの 閟倀 を蚭定するこずも可胜です䟋えばファむルアップロヌドを受け付ける URI パスに察しおは 100 KB に制限し、それ以倖の URI パスに察しおは 8 KB に制限するなど ボディサむズ制限の 閟倀 を 8 KB より倧きくする堎合、前述の通り、それを超える郚分のリク ゚ス トボディの䞭身は他のルヌルでも怜査されないこずに留意しおください なお、re:Post の次の投皿でも SizeRestrictions_BODY でブロックされた堎合の察応方法が蚘茉されおいたす。マネヌゞドルヌルに䞀臎した際に远加されるラベルず独自ルヌルを組み合わせお、特定の URI パス=ファむルアップロヌドを行う URI パスではない堎合のみブロックを発動させる方法です。 AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files その2: ファむルアップロヌドが AWS マネヌゞドルヌルの XSS に匕っかかるこずがある Web アプリに察しおバむナリファむルのアップロヌドをした時に、運悪く コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ の CrossSiteScripting_BODY ルヌルに匕っかかっおしたったこずがありたした。そのずきのログの䞀郚は次の通りです。バむナリデヌタが XSS の シグネチャ に䞀臎しおしたったようです。 " terminatingRuleMatchDetails ": [ { " conditionType ": " XSS ", " location ": " BODY ", " matchedData ": [ " < ", " \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 " ] } ] , re:Post の次の投皿によるず、 ファむルアップロヌドでは CrossSiteScripting_BODY 以倖にも SQLi_BODY 、 WindowsShellCommands_BODY 、 GenericLFI_BODY 、 SizeRestrictions_BODY ルヌルによっおブロックされる可胜性がある ようです。 AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files 投皿では察応方法ずしお「文字列たたは 正芏衚珟 ( regex ) 䞀臎条件が蚭定されたセヌフリストを䜿甚しお、リク ゚ス トを蚱可したす。」が玹介されおいたす。マネヌゞドルヌルに䞀臎した際に远加されるラベルず独自ルヌルを組み合わせお、リク ゚ス トボディに特定の文字列ファむル拡匵子などを想定しおいるず解釈したしたが含たれおいない堎合のみブロックを発動する方法です。泚日本語の投皿ではなぜかリク ゚ス トヘッダヌから特定の文字列を探すずありたすが、 英語の投皿 ではリク ゚ス トボディから探すず曞いおありたす。リク ゚ス トボディの方がしっくりきおいたす。 あるいは「その1」の SizeRestrictions_BODY の堎合ず同じように、特定の URI パス=ファむルアップロヌドを行う URI パスではない堎合のみブロックを発動させる方法を取っおも良さそうです。 その3: マネヌゞドルヌルにはバヌゞョンがある マネゞメントコン゜ヌルでマネヌゞドルヌルを䜿っおいたらすぐに気が付いたず思うのですが、筆者は CDK で Web ACL を䜜っおいたのでずっず知りたせんでした。 マネヌゞドルヌルにはバヌゞョンが存圚したす 。  AWS マネヌゞドルヌルのうち「IP レピュテヌション、 Bot Control、アカりント乗っ取り防止のルヌルグルヌプ」にはバヌゞョンが存圚したせん。バヌゞョンに関わらず、日ごろから頻繁にルヌルが曎新されるためでしょう。 バヌゞョンを特に指定しない堎合、そのマネヌゞドルヌルがデフォルトず蚭定したバヌゞョンが利甚され、ルヌルプロバむダヌがデフォルトバヌゞョンを倉曎するず構築した Web ACL でも自動的に新しいバヌゞョンに曎新されたす。自動的に曎新されるこずを避けたい堎合は、「静的バヌゞョン」を明瀺的に指定したす。ただしこの堎合も、「緊急時の必須の曎新」がされる可胜性があるそうです。たたバヌゞョンの有効期限が切れるず、次のような扱いになるようです。 AWS マネヌゞドルヌルルヌルグルヌプの堎合、 AWS WAF は、有効期限切れのバヌゞョンを䜿甚しおいるりェブ ACL を、ルヌルグルヌプのデフォルトバヌゞョンに移動したす。 AWS Marketplace ルヌルグルヌプの堎合、プロバむダヌは有効期限の凊理方法を決定したす。詳现に぀いおは、マネヌゞドルヌルグルヌププロバむダヌに問い合わせおください。 マネヌゞドルヌルには SNS トピックが甚意されおいる堎合があり、サブスクラむブするこずでバヌゞョンを含めたルヌルの曎新情報を受け取るこずができたす。特に静的バヌゞョンを䜿甚する堎合はルヌルバヌゞョンを手動曎新するこずになるので、 SNS トピックをサブスクラむブしおおくず良いでしょう。 その4: CloudWatch Logs のロググルヌプ名に決たりがある AWS WAF を利甚する堎合はログをぜひ取っおおきたいずころですが、CloudWatch Logs に出力する堎合、 ロググルヌプ名は aws-waf-logs- で始たる必芁がありたす 。 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging-cw-logs.html#logging-cw-logs-naming マネゞメントコン゜ヌルでロググルヌプを指定する堎合は画面にこの条件が曞いおありたすし、 aws-waf-logs- で始たるロググルヌプ以倖は遞択肢に衚瀺されないのでただ分かりやすいです。 しかし CloudFormation もちろん CDK もを利甚する堎合、 aws-waf-logs- で始たるロググルヌプ以倖を Web ACL に関連付けしようずするず、デプロむ時に次のような゚ラヌになりたす。「ARN が有効でない」ずいう゚ラヌメッセヌゞでは䜕がいけないのか党く分からず、どハマりしたこずがあるのは自分だけではないはずです。 Resource handler returned message: "Error reason: The ARN isn't valid. A valid ARN begins with arn: and includes other information separated by colons or slashes., field: LOG_ DESTINATION , parameter: arn: aws :logs:ap-northeast-1:111122223333:log-group:waf-logs-xxxxx ちなみにログの出力先が S3 バケット の堎合も、 バケット 名は aws-waf-logs- で始たる必芁がありたす。 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging-s3.html#logging-s3-naming その5: 35個のログストリヌムに分割される CloudWatch Logs にログを出力するず、 35個のログストリヌムに分割 され、この数を枛らすこずはできたせん 。出力の スルヌプット を高めるためのようです。 近い時刻で発生したログメッセヌゞでも、耇数のログストリヌムに分散しお出力されるため、ロググルヌプから特定のログを探すのは難しいです。ログストリヌムを暪断しお時系列にログを芋たり、特定のログを探したい堎合は CloudWatch Logs Insights を利甚するのが䟿利です。以䞋の公匏ブログや re:Post 投皿が参考になりたす。 Amazon CloudWatch Logs による AWS WAF ログの分析 https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/ CloudWatch たたは Amazon S3 に保存されおいる AWS WAF ログを分析するオプションは䜕ですか? https://repost.aws/ja/knowledge-center/waf-analyze-logs-stored-cloudwatch-s3 その6: ログに Cookie ヘッダヌが蚘録されおしたう WAF Web ACL のログを出力するず、 httpRequest.headers フィヌルドにリク ゚ス トヘッダヌが蚘録されたす。぀たり、 クラむアントが送信した Cookie も蚘録されおしたいたす 。 スクリヌンキャプチャの倀はダミヌです 䟋えば分析のためにログを出力したり、共有したりするず有効なセッション ID などセンシティブな情報が挏えいするリスクがありたす。 この問題ぞの察応ずしお、ログ出力時に 特定フィヌルドをマスキング するこずが可胜です。䟋えば cookie ヘッダヌをマスキングするには次のように蚭定したす。 このように蚭定するず、出力されるログの cookie ヘッダヌは REDACTED ずいう文字列に眮き換えられたす。 その7: ログ出力条件の EXCLUDED_AS_COUNT ずは䜕か ログを出力する堎合、アクションが特定の条件に該圓する堎合のみ出力するように蚭定できたす。リク ゚ス トが蚱可された堎合のログも党お蚘録するず量が倚くなっおしたうので、「ブロック」時ず「カりント」時のみ出力したいこずがありたす。 カりント時の条件は、実は COUNT ず EXCLUDED_AS_COUNT の2皮類がありたす 。基本的には COUNT 扱いず考えお良いですが、 EXCLUDED_AS_COUNT ずしお扱われるケヌスが2぀、以䞋のブログで説明されおいたす。 AWS WAF のログ分析に関する考慮事項 https://aws.amazon.com/jp/blogs/news/aws-waf-log-analysis-considerations/ マネヌゞドルヌルグルヌプで ”Set all rule actions to count” で Count に蚭定した堎合 マネヌゞドルヌルグルヌプで個別のルヌルを Count に蚭定した堎合 ただし䞊の AWS のブログは情報が叀く、珟圚個別のルヌルを Count に蚭定した堎合の動きは少々異なるようです 参照 。簡単にたずめるず、以䞋のようになるず理解しおいたす 2022 幎 10 月 27 日より前に、 WAF ルヌルの JSON では ExcludedRules が利甚でき、これに含めた個別ルヌルは EXCLUDED_AS_COUNT 扱いになる マネゞメントコン゜ヌルで個別ルヌルを Count に蚭定するず、 EXCLUDED_AS_COUNT 扱いになる 2022 幎 10 月 27 日以降は、 WAF ルヌルの JSON で ExcludedRules に含めた個別ルヌルは倉わらず EXCLUDED_AS_COUNT 扱いになる WAF ルヌルの JSON で RuleActionOverrides が新しく利甚でき、オヌバヌラむド先をカりントにした堎合は COUNT 扱いになる マネゞメントコン゜ヌルで個別ルヌルを Count に蚭定過去に䜜成したルヌルの線集も含めおするず、 COUNT 扱いに倉わる この動きを意識しおログ出力条件を䜜成するず良いず思いたす。 その8: コン゜ヌルで䜜成したルヌルを JSON 出力するず IaC での曞き方がわかる CloudFormation もしくは CDK で耇雑な条件の Web ACL を䜜成する堎合、曞き方が分からずに困るこずがありたす。 䟋えば「 URI パスが /file/upload 以倖ぞのリク ゚ス トでボディサむズが 100 KB 以䞊の堎合にブロックする」ルヌルは、CDK だずこんな感じで曞くこずになりたす。ルヌル郚分のみ { name: "SizeConstraint" , priority: 10 , statement: { andStatement: { statements: [ { notStatement: { statement: { byteMatchStatement: { searchString: "/file/upload" , fieldToMatch: { uriPath: {} , } , textTransformations: [ { priority: 0 , type : "NONE" , } , ] , positionalConstraint: "EXACTLY" , } , } , } , } , { sizeConstraintStatement: { fieldToMatch: { body: { oversizeHandling: "CONTINUE" , } , } , comparisonOperator: "GE" , size: 100 * 1000 , textTransformations: [ { priority: 0 , type : "NONE" , } , ] , } , } , ] , } , } , action: { block: {} } , visibilityConfig: { sampledRequestsEnabled: true , cloudWatchMetricsEnabled: true , metricName: "SizeConstraint" , } , } , これをヒントなしで正しく曞ける気がしたせん。䞀方でマネゞメントコン゜ヌルでルヌルを䜜成すれば、画面の説明に埓っお割ず分かりやすく䜜成できたす。 そこで IaC で WAF のルヌルを䜜る堎合も、たずはマネゞメントコン゜ヌルで詊しに䜜成しおみお、画面で「ルヌル JSON ゚ディタ」に切り替えたしょう 。 JSON でのルヌルの曞き方を衚瀺しおくれたす。これをコピヌしお IaC で利甚するず良いでしょう。CDK に䜿う堎合はプロパティ名の頭文字を倧文字から小文字に倉換する必芁がありたすが、自前で曞くよりはずっず楜です。 ちなみにルヌル JSON ゚ディタ画面の説明にもある通り、 JSON を䜿えばビゞュアル゚ディタではサポヌトされおいないような、深い階局の条件を持぀ルヌルを䜜るこずもできたす。以䞋の re:Post 投皿も参考になりたす。 耇雑なカスタム AWS WAF JSON ルヌルを䜜成する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-create-complex-custom-rules さいごに ご玹介した内容はいずれも公匏ドキュメントやブログに曞いおあるこずなのですが、WAF を䜿い始める時は早く構成したい気持ちが先走っおなかなか網矅的にチェックはできたせんね。今振り返るず最初に知っおおきたかったず感じたこずをたずめおみたした。誰かの参考になれば嬉しいです。 蚘事の䞭に掲茉したリンクで特におすすめのものを再掲しおおきたす。 コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-baseline.html#aws-managed-rule-groups-baseline-crs どのようなルヌルで怜査を行うのか、利甚前に䞀通り把握しおおきたしょう AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files Amazon CloudWatch Logs による AWS WAF ログの分析 https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/ CloudWatch たたは Amazon S3 に保存されおいる AWS WAF ログを分析するオプションは䜕ですか? https://repost.aws/ja/knowledge-center/waf-analyze-logs-stored-cloudwatch-s3 ルヌルグルヌプ内のアクションオヌバヌラむド https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-rule-group-override-options.html 耇雑なカスタム AWS WAF JSON ルヌルを䜜成する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-create-complex-custom-rules 以䞋は、この蚘事では觊れたせんでしたが参考ずなる re:Post の投皿です。 AWS WAF ルヌルでブロックされおいるファむルのアップロヌドを、ルヌルを陀倖せずに明瀺的に蚱可するには、どうすればよいですか https://repost.aws/ja/knowledge-center/waf-explicit-allow-file-uploads AWS WAF の HTTP リク ゚ス トの XSS たたは SQLi 怜査から特定の URI を陀倖する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-exclude-specific-requests-inspection AWS WAF を利甚しお DDoS 攻撃を緩和するにはどうすればいいですか? https://repost.aws/ja/knowledge-center/waf-mitigate-ddos-attacks 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募をお埅ちしおいたす。 セキュリティ゚ンゞニア 執筆 @kou.kinyo 、レビュヌ 寺山 茝 (@terayama.akira)  Shodo で執筆されたした 
こんにちは。Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの耿です。 AWS WAF は簡単に Web アプリに WAF を远加でき、か぀倀段も他の WAF 補品より安いため、奜きな AWS サヌビスの䞀぀です。そんな AWS WAF ですがしばらく構築・運甚し、これを最初から知っおおけば・・・ず思ったこずがあるので 8぀ご玹介したす。 AWS WAF の基本に぀いおは分かっおいる前提で、特に説明はいたしたせん。たた2023幎10月珟圚の最新バヌゞョンである、いわゆる「 AWS WAF v2」を察象ずしおいたす。 その1: AWS マネヌゞドルヌルのボディサむズ制限が厳しい その2: ファむルアップロヌドが AWS マネヌゞドルヌルの XSS に匕っかかるこずがある その3: マネヌゞドルヌルにはバヌゞョンがある その4: CloudWatch Logs のロググルヌプ名に決たりがある その5: 35個のログストリヌムに分割される その6: ログに Cookie ヘッダヌが蚘録されおしたう その7: ログ出力条件の EXCLUDED_AS_COUNT ずは䜕か その8: コン゜ヌルで䜜成したルヌルを JSON 出力するず IaC での曞き方がわかる さいごに その1: AWS マネヌゞドルヌルのボディサむズ制限が厳しい AWS WAF を利甚する際に AWS マネヌゞドルヌル はずおも䟿利です。その䞭の コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ には SizeRestrictions_BODY ずいうリク゚ストボディのサむズを怜査するルヌルがあり、 8 KB を超えるボディを持぀リク゚ストをブロック したす。 ボディサむズが倧きいリク゚ストや、ファむルアップロヌドにおいおは 8 KB を簡単に超えおしたう こずがあるので、本番環境に導入する前に想定するサむズのリク゚ストがブロックされないかしっかりテストが必芁です。 ※このようなルヌルが蚭定されおいる理由は、 AWS WAF は リク゚ストボディの最初の 8 KB しか怜査できない ずいう制玄があるためです。リク゚ストボディの 8 KB 以降の䜍眮に攻撃文字列が含たれおいおも怜査できないため、コアルヌルセットでは 8 KB を超えるリク゚ストを䞀埋でブロックするこずで察応しおいたす。 ※(2024/3/11远蚘)ALB以倖に関連付けるWAF Web ACL のリク゚ストボディの怜査サむズ制限が 16 KB64 KBに匕き䞊げ可胜に増えたした。 https://aws.amazon.com/about-aws/whats-new/2024/03/aws-waf-larger-body-inspections-regional-resources/ 想定する正圓なリク゚ストが 8 KB を超えおしたう堎合、ルヌルグルヌプ内の SizeRestrictions_BODY ルヌルのアクションを「Count」にオヌバヌラむドするこずで、実質的に陀倖するこずができたす。ただしボディサむズ制限が党くないのは心蚱ないので、次のように WAF Web ACL を䜜るこずが考えられたす。 コアルヌルセットマネヌゞドルヌルグルヌプでは SizeRestrictions_BODY を「Count」にオヌバヌラむドする 適切な倀でボディサむズ制限を行う独自ルヌルを䜜成する このようなルヌルを耇数䜜り、リク゚ストパスに応じお異なるボディサむズの 閟倀 を蚭定するこずも可胜です䟋えばファむルアップロヌドを受け付ける URI パスに察しおは 100 KB に制限し、それ以倖の URI パスに察しおは 8 KB に制限するなど ボディサむズ制限の 閟倀 を 8 KB より倧きくする堎合、前述の通り、それを超える郚分のリク゚ストボディの䞭身は他のルヌルでも怜査されないこずに留意しおください なお、re:Post の次の投皿でも SizeRestrictions_BODY でブロックされた堎合の察応方法が蚘茉されおいたす。マネヌゞドルヌルに䞀臎した際に远加されるラベルず独自ルヌルを組み合わせお、特定の URI パス=ファむルアップロヌドを行う URI パスではない堎合のみブロックを発動させる方法です。 AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files その2: ファむルアップロヌドが AWS マネヌゞドルヌルの XSS に匕っかかるこずがある Web アプリに察しおバむナリファむルのアップロヌドをした時に、運悪く コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ の CrossSiteScripting_BODY ルヌルに匕っかかっおしたったこずがありたした。そのずきのログの䞀郚は次の通りです。バむナリデヌタが XSS の シグネチャ に䞀臎しおしたったようです。 " terminatingRuleMatchDetails ": [ { " conditionType ": " XSS ", " location ": " BODY ", " matchedData ": [ " < ", " \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000 " ] } ] , re:Post の次の投皿によるず、 ファむルアップロヌドでは CrossSiteScripting_BODY 以倖にも SQLi_BODY 、 WindowsShellCommands_BODY 、 GenericLFI_BODY 、 SizeRestrictions_BODY ルヌルによっおブロックされる可胜性がある ようです。 AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files 投皿では察応方法ずしお「文字列たたは 正芏衚珟 ( regex ) 䞀臎条件が蚭定されたセヌフリストを䜿甚しお、リク゚ストを蚱可したす。」が玹介されおいたす。マネヌゞドルヌルに䞀臎した際に远加されるラベルず独自ルヌルを組み合わせお、リク゚ストボディに特定の文字列ファむル拡匵子などを想定しおいるず解釈したしたが含たれおいない堎合のみブロックを発動する方法です。泚日本語の投皿ではなぜかリク゚ストヘッダヌから特定の文字列を探すずありたすが、 英語の投皿 ではリク゚ストボディから探すず曞いおありたす。リク゚ストボディの方がしっくりきおいたす。 あるいは「その1」の SizeRestrictions_BODY の堎合ず同じように、特定の URI パス=ファむルアップロヌドを行う URI パスではない堎合のみブロックを発動させる方法を取っおも良さそうです。 その3: マネヌゞドルヌルにはバヌゞョンがある マネゞメントコン゜ヌルでマネヌゞドルヌルを䜿っおいたらすぐに気が付いたず思うのですが、筆者は CDK で Web ACL を䜜っおいたのでずっず知りたせんでした。 マネヌゞドルヌルにはバヌゞョンが存圚したす 。  AWS マネヌゞドルヌルのうち「IP レピュテヌション、 Bot Control、アカりント乗っ取り防止のルヌルグルヌプ」にはバヌゞョンが存圚したせん。バヌゞョンに関わらず、日ごろから頻繁にルヌルが曎新されるためでしょう。 バヌゞョンを特に指定しない堎合、そのマネヌゞドルヌルがデフォルトず蚭定したバヌゞョンが利甚され、ルヌルプロバむダヌがデフォルトバヌゞョンを倉曎するず構築した Web ACL でも自動的に新しいバヌゞョンに曎新されたす。自動的に曎新されるこずを避けたい堎合は、「静的バヌゞョン」を明瀺的に指定したす。ただしこの堎合も、「緊急時の必須の曎新」がされる可胜性があるそうです。たたバヌゞョンの有効期限が切れるず、次のような扱いになるようです。 AWS マネヌゞドルヌルルヌルグルヌプの堎合、 AWS WAF は、有効期限切れのバヌゞョンを䜿甚しおいるりェブ ACL を、ルヌルグルヌプのデフォルトバヌゞョンに移動したす。 AWS Marketplace ルヌルグルヌプの堎合、プロバむダヌは有効期限の凊理方法を決定したす。詳现に぀いおは、マネヌゞドルヌルグルヌププロバむダヌに問い合わせおください。 マネヌゞドルヌルには SNS トピックが甚意されおいる堎合があり、サブスクラむブするこずでバヌゞョンを含めたルヌルの曎新情報を受け取るこずができたす。特に静的バヌゞョンを䜿甚する堎合はルヌルバヌゞョンを手動曎新するこずになるので、 SNS トピックをサブスクラむブしおおくず良いでしょう。 その4: CloudWatch Logs のロググルヌプ名に決たりがある AWS WAF を利甚する堎合はログをぜひ取っおおきたいずころですが、CloudWatch Logs に出力する堎合、 ロググルヌプ名は aws-waf-logs- で始たる必芁がありたす 。 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging-cw-logs.html#logging-cw-logs-naming マネゞメントコン゜ヌルでロググルヌプを指定する堎合は画面にこの条件が曞いおありたすし、 aws-waf-logs- で始たるロググルヌプ以倖は遞択肢に衚瀺されないのでただ分かりやすいです。 しかし CloudFormation もちろん CDK もを利甚する堎合、 aws-waf-logs- で始たるロググルヌプ以倖を Web ACL に関連付けしようずするず、デプロむ時に次のような゚ラヌになりたす。「ARN が有効でない」ずいう゚ラヌメッセヌゞでは䜕がいけないのか党く分からず、どハマりしたこずがあるのは自分だけではないはずです。 Resource handler returned message: "Error reason: The ARN isn't valid. A valid ARN begins with arn: and includes other information separated by colons or slashes., field: LOG_ DESTINATION , parameter: arn: aws :logs:ap-northeast-1:111122223333:log-group:waf-logs-xxxxx ちなみにログの出力先が S3 バケット の堎合も、 バケット 名は aws-waf-logs- で始たる必芁がありたす。 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/logging-s3.html#logging-s3-naming その5: 35個のログストリヌムに分割される 2025/9/5曎新い぀倉わったのか分かりたせんが、今はWAFのログストリヌムが分割されなくなっおいるようです。なお、それでもログの怜玢はCloudWatch Logs Insightsを利甚するのが䟿利であるこずには倉わりたせん。 CloudWatch Logs にログを出力するず、 35個のログストリヌムに分割 され、この数を枛らすこずはできたせん 。出力の スルヌプット を高めるためのようです。 近い時刻で発生したログメッセヌゞでも、耇数のログストリヌムに分散しお出力されるため、ロググルヌプから特定のログを探すのは難しいです。ログストリヌムを暪断しお時系列にログを芋たり、特定のログを探したい堎合は CloudWatch Logs Insights を利甚するのが䟿利です。以䞋の公匏ブログや re:Post 投皿が参考になりたす。 Amazon CloudWatch Logs による AWS WAF ログの分析 https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/ CloudWatch たたは Amazon S3 に保存されおいる AWS WAF ログを分析するオプションは䜕ですか? https://repost.aws/ja/knowledge-center/waf-analyze-logs-stored-cloudwatch-s3 その6: ログに Cookie ヘッダヌが蚘録されおしたう WAF Web ACL のログを出力するず、 httpRequest.headers フィヌルドにリク゚ストヘッダヌが蚘録されたす。぀たり、 クラむアントが送信した Cookie も蚘録されおしたいたす 。 スクリヌンキャプチャの倀はダミヌです 䟋えば分析のためにログを出力したり、共有したりするず有効なセッション ID などセンシティブな情報が挏えいするリスクがありたす。 この問題ぞの察応ずしお、ログ出力時に 特定フィヌルドをマスキング するこずが可胜です。䟋えば cookie ヘッダヌをマスキングするには次のように蚭定したす。 このように蚭定するず、出力されるログの cookie ヘッダヌは REDACTED ずいう文字列に眮き換えられたす。 ※远蚘 Cookie ヘッダヌをマスキングするデヌタ保護機胜が増匷されたした。セッションIDなど特定の Cookie のみを察象ずしたり、マスキングの代わりにハッシュ化を行うこずもできるようになっおいたす。 https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/data-protection-masking.html その7: ログ出力条件の EXCLUDED_AS_COUNT ずは䜕か ログを出力する堎合、アクションが特定の条件に該圓する堎合のみ出力するように蚭定できたす。リク゚ストが蚱可された堎合のログも党お蚘録するず量が倚くなっおしたうので、「ブロック」時ず「カりント」時のみ出力したいこずがありたす。 カりント時の条件は、実は COUNT ず EXCLUDED_AS_COUNT の2皮類がありたす 。基本的には COUNT 扱いず考えお良いですが、 EXCLUDED_AS_COUNT ずしお扱われるケヌスが2぀、以䞋のブログで説明されおいたす。 AWS WAF のログ分析に関する考慮事項 https://aws.amazon.com/jp/blogs/news/aws-waf-log-analysis-considerations/ マネヌゞドルヌルグルヌプで ”Set all rule actions to count” で Count に蚭定した堎合 マネヌゞドルヌルグルヌプで個別のルヌルを Count に蚭定した堎合 ただし䞊の AWS のブログは情報が叀く、珟圚個別のルヌルを Count に蚭定した堎合の動きは少々異なるようです 参照 。簡単にたずめるず、以䞋のようになるず理解しおいたす 2022 幎 10 月 27 日より前に、 WAF ルヌルの JSON では ExcludedRules が利甚でき、これに含めた個別ルヌルは EXCLUDED_AS_COUNT 扱いになる マネゞメントコン゜ヌルで個別ルヌルを Count に蚭定するず、 EXCLUDED_AS_COUNT 扱いになる 2022 幎 10 月 27 日以降は、 WAF ルヌルの JSON で ExcludedRules に含めた個別ルヌルは倉わらず EXCLUDED_AS_COUNT 扱いになる WAF ルヌルの JSON で RuleActionOverrides が新しく利甚でき、オヌバヌラむド先をカりントにした堎合は COUNT 扱いになる マネゞメントコン゜ヌルで個別ルヌルを Count に蚭定過去に䜜成したルヌルの線集も含めおするず、 COUNT 扱いに倉わる この動きを意識しおログ出力条件を䜜成するず良いず思いたす。 その8: コン゜ヌルで䜜成したルヌルを JSON 出力するず IaC での曞き方がわかる CloudFormation もしくは CDK で耇雑な条件の Web ACL を䜜成する堎合、曞き方が分からずに困るこずがありたす。 䟋えば「 URI パスが /file/upload 以倖ぞのリク゚ストでボディサむズが 100 KB 以䞊の堎合にブロックする」ルヌルは、CDK だずこんな感じで曞くこずになりたす。ルヌル郚分のみ { name : "SizeConstraint" , priority: 10 , statement: { andStatement: { statements: [ { notStatement : { statement : { byteMatchStatement : { searchString : "/file/upload" , fieldToMatch : { uriPath : {} , } , textTransformations : [ { priority : 0 , type : "NONE" , } , ] , positionalConstraint : "EXACTLY" , } , } , } , } , { sizeConstraintStatement : { fieldToMatch : { body : { oversizeHandling : "CONTINUE" , } , } , comparisonOperator : "GE" , size : 100 * 1000 , textTransformations : [ { priority : 0 , type : "NONE" , } , ] , } , } , ] , } , } , action: { block: {} } , visibilityConfig: { sampledRequestsEnabled: true , cloudWatchMetricsEnabled: true , metricName: "SizeConstraint" , } , } , これをヒントなしで正しく曞ける気がしたせん。䞀方でマネゞメントコン゜ヌルでルヌルを䜜成すれば、画面の説明に埓っお割ず分かりやすく䜜成できたす。 そこで IaC で WAF のルヌルを䜜る堎合も、たずはマネゞメントコン゜ヌルで詊しに䜜成しおみお、画面で「ルヌル JSON ゚ディタ」に切り替えたしょう 。 JSON でのルヌルの曞き方を衚瀺しおくれたす。これをコピヌしお IaC で利甚するず良いでしょう。CDK に䜿う堎合はプロパティ名の頭文字を倧文字から小文字に倉換する必芁がありたすが、自前で曞くよりはずっず楜です。 ちなみにルヌル JSON ゚ディタ画面の説明にもある通り、 JSON を䜿えばビゞュアル゚ディタではサポヌトされおいないような、深い階局の条件を持぀ルヌルを䜜るこずもできたす。以䞋の re:Post 投皿も参考になりたす。 耇雑なカスタム AWS WAF JSON ルヌルを䜜成する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-create-complex-custom-rules さいごに ご玹介した内容はいずれも公匏ドキュメントやブログに曞いおあるこずなのですが、WAF を䜿い始める時は早く構成したい気持ちが先走っおなかなか網矅的にチェックはできたせんね。今振り返るず最初に知っおおきたかったず感じたこずをたずめおみたした。誰かの参考になれば嬉しいです。 蚘事の䞭に掲茉したリンクで特におすすめのものを再掲しおおきたす。 コアルヌルセット (CRS) マネヌゞドルヌルグルヌプ https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/aws-managed-rule-groups-baseline.html#aws-managed-rule-groups-baseline-crs どのようなルヌルで怜査を行うのか、利甚前に䞀通り把握しおおきたしょう AWS WAF によっおブロックされおいるファむルをアップロヌドするにはどうすればよいですか? https://repost.aws/ja/knowledge-center/waf-upload-blocked-files Amazon CloudWatch Logs による AWS WAF ログの分析 https://aws.amazon.com/jp/blogs/news/analyzing-aws-waf-logs-in-amazon-cloudwatch-logs/ CloudWatch たたは Amazon S3 に保存されおいる AWS WAF ログを分析するオプションは䜕ですか? https://repost.aws/ja/knowledge-center/waf-analyze-logs-stored-cloudwatch-s3 ルヌルグルヌプ内のアクションオヌバヌラむド https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/web-acl-rule-group-override-options.html 耇雑なカスタム AWS WAF JSON ルヌルを䜜成する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-create-complex-custom-rules 以䞋は、この蚘事では觊れたせんでしたが参考ずなる re:Post の投皿です。 AWS WAF ルヌルでブロックされおいるファむルのアップロヌドを、ルヌルを陀倖せずに明瀺的に蚱可するには、どうすればよいですか https://repost.aws/ja/knowledge-center/waf-explicit-allow-file-uploads AWS WAF の HTTP リク゚ストの XSS たたは SQLi 怜査から特定の URI を陀倖する方法を教えおください。 https://repost.aws/ja/knowledge-center/waf-exclude-specific-requests-inspection AWS WAF を利甚しお DDoS 攻撃を緩和するにはどうすればいいですか? https://repost.aws/ja/knowledge-center/waf-mitigate-ddos-attacks 私たちは䞀緒に働いおくれる仲間を募集しおいたす 電通総研䞭途採甚ペヌゞ 電通総研新卒採甚ペヌゞ 執筆 @kou.kinyo 、レビュヌ 寺山 茝 (@terayama.akira)  Shodo で執筆されたした 
こんにちは、ISID 金融゜リュヌション事業郚の岡厎です。 今回はUE5.2の新機胜であるプロシヌゞャルコンテンツ生成 フレヌムワヌク PCGProcedural Content Generation Frameworkの玹介を行いたす。 はじめに PCGずはコンテンツ生成に関するルヌルを䜜成し、そのルヌルに沿っお怍物や岩などのアセットを倧量に配眮できる機胜です。 アセットの皮類や䜍眮、倧きさなどを指瀺するルヌルを䜜成するこずで制䜜時間を倧幅に削枛でき、 ルヌルを流甚するこずで倧芏暡なワヌルド䜜成なども行えたす。 たた、倉曎に察しお柔軟に察応しやすいずいう点もメリットになりたす。 今回は Gaea ずいう3D地圢生成ツヌルを䜿甚しお ランドスケヌプ を䜜成しながら、PCGを䜿甚しおフォトリアルな森の䜜り方を説明したす。 怜蚌環境/ツヌル OS Windows 11 pro GPU  NVIDIA GeForce RTX 4070 Ti Game Engine Unreal Engine 5.2.0 実装手順 Gaea䞊で ランドスケヌプ を䜜成 ハむトマップをUE5プロゞェクトにむンポヌト PCGを䜿甚しお森を生成 1. Gaea䞊で ランドスケヌプ を䜜成 たずはUE䞊でPCGを䜿甚する前に、朚々を生やすための土地 ランドスケヌプ を䜜成したす。 UEにも ランドスケヌプ を造圢するツヌルは搭茉しおいるのですが、今回は Gaea ずいう3D地圢生成を䜿甚しお ランドスケヌプ を生成したす。 こちらの蚘事 でUEの ランドスケヌプ 機胜を玹介しおいるので、ぜひこちらもご芧ください。 たずは Gaea をむンストヌルしたす。 解像床が1024x1024たでは無料で䜿うこずができるので、今回は無料版を䜿甚したす。 Gaeaを開くず䞋蚘のような画面になりたす。 巊のタブの「Geo Primitives」から䜿甚したい地圢のモデルを ドラッグ&ドロップ したす。 たた、いく぀かの地圢モデルを組み合わせるこずもできたす。 䞋の図では「Range山岳」ず「Rocky岩肌」のノヌドを「Combine」を䜿甚しお組み合わせおみたした。 「Range山岳」 「Rocky岩肌」 組み合わせた地圢 今回の ランドスケヌプ では、もう少し平地の郚分も欲しかったので、 「Range」ず「Worselands」の地圢ノヌドを組み合わせお䜿甚したした。 たた組み合わせた地圢に「FractalTerraces地局」のノヌドや「Erosion浞食」のノヌドを組み合わせ、 よりむメヌゞに近い地圢を䜜成したした。 詳しい地圢ノヌドや効果のノヌドに関しおは こちらの公匏リファレンス を参照したした。 次にこれたで䜜成した地圢をUEで䜿甚するために゚クスポヌト䜜業を行いたす。 最終的に䜜成した「Erosion浞食」のノヌドを右クリックし、Renameを行いたす。 今回私は「MyWorld」ずいう名前に倉曎したした。 続いお「MyWorld」を再床右クリックし、Mark for Exportを抌䞋したす。 右偎のタブに゚クスポヌトの詳现が衚瀺されるので、出力圢匏を「. png 」に倉曎したす。 たた、 UEで掚奚しおいるランドスケヌプの解像床の倀 は1009なので、「Resolution」を「1009」に倉曎したす。 GaeaからUEにデヌタを移行する際、瞊暪の比率の倉曎をする必芁がありたす。 右偎の詳现画面のタブを「MyWorld Properties」に切り替え、地圢の瞊暪・高䜎比率を調査するための「Lv」のボタンを抌䞋したす。 するず䞋蚘画面のように䜜成した地圢の瞊暪比率が倉わった状態のサンプルが衚瀺されたす。 デフォルトのたた゚クスポヌトをするず、この状態の地圢がUEに入っおしたうので蚭定を倉えおいきたす。 「Lv」の䞋にある「Clmp」ボタンを抌䞋し、「Clmp Max」の倀を「25%」に倉曎したす。 この倀は䜜成した ランドスケヌプ を芋ながら適宜調敎したす これで元のモデルず同じ瞊暪比率になるので、このたたBuildタブに戻り、「Start Build」を行いファむルを出力したす。 続いお出力したファむルをUEにむンポヌトしたす。 2. ハむトマップをUE5プロゞェクトにむンポヌト UEを開き遞択モヌドから ランドスケヌプ モヌドに倉曎したす。 新しい ランドスケヌプ のタブから、「ファむルからむンポヌト」を遞択したす。 先ほどGaeaで゚クスポヌトした「. png 」ファむルを遞択したす。 むンポヌト蚭定画面で、解像床をGaeaで蚭定した「1009x1009」に倉曎しおむンポヌトしたす。 むンポヌト埌、 ランドスケヌプ が出珟しおいないように芋えたすが、「ExponentalHeight」が画面にモダをかけおしたっおおり、遠くの ランドスケヌプ が芋えなくなっおいるだけなので、 遞択モヌドに倉曎埌、䞊䞋の䜍眮を倉えるこずで ランドスケヌプ が芋えるようになりたす。 これでGaeaで䜜成した ランドスケヌプ をUE䞊で䜿うこずができたす。 続いお䜜成した ランドスケヌプ にPCGで森を䜜成したす。 3. PCGを䜿甚しお森を生成 たずPCGで森を䜜成する前に、䜜成された ランドスケヌプ のマテリアルがデフォルトのたたで味気ないので、マテリアルを割り圓おたす。 今回は簡易的に行うため、 アりトラむナヌ で ランドスケヌプ を遞択し、 ランドスケヌプ マテリアルに任意のマテリアルを遞択したした。 次にPCGを䜿甚するために プラグむン の蚭定をする必芁がありたす。 プラグむン 蚭定画面から「Procedural Content Generation Framework」をオンにしたす。UEを再起動させお蚭定を反映させたす。 次に今回フォトリアルな森を䜜成するために䜿甚するアセットのダりンロヌドを行いたす。 Unreal マヌケットプレむス から「Megascans Trees(早期アクセス)」を開きダりンロヌドしたす。 今回はペヌロッパ颚の朚を䜿甚したしたが、他に䜕皮類かあったので自分の䜜りたいむメヌゞに合ったものをダりンロヌドしたす。 ダりンロヌドが完了するずプロゞェクトのコンテンツブラりザからダりンロヌドした朚々のアセットを衚瀺できたす。 このアセットは埌で䜿うので䞀旊このたた眮いおおきたす。 UEの線集画面より、PCGで森を生成するための範囲を決めるために「PCGVolume」ずいうアセットを生成したす。 画面䞊郚よりアセット远加ボタンを抌し、怜玢しお生成しおください。 生成した範囲をワヌルド䞊に蚭眮し、森を䜜成したい倧きさに任意で蚭定したす。 次に、この範囲ずPCGで䜜成するルヌルを蚘茉するアセットを玐づけたす。 たずルヌルを蚘茉するためにコンテンツブラりザ内に「PCGグラフ」を䜜成したす。今回は「MyWorldPCG」ず 呜名 したした。 次に線集画面で アりトラむナヌ より先ほど範囲を決めるために䜜成した「PCGVolume」を遞択し、子芁玠の「PCGComponent」を遞択したす。 遞択するず、 むンスタンス 盎䞋にGraphを遞択する欄があるので、先ほど䜜成した「MyWorldPCG」を遞択し、ルヌルず範囲を玐づけたす。 続いお「MyWorldPCG」を線集しおルヌルを䜜成したす。 「MyWorldPCG」を開くずブルヌプリントの線集画面のようなものがでおきたす。 たずは「 Surface Sampler」ずいうノヌドを䜜成し、「Input」の「Landscape」ピンず繋ぎたす。 このノヌドは Surface 面に察しおルヌルを適応させおいくこずができたす。 「 Surface Sampler」を遞択し、右偎の蚭定画面から「Points Per Squared Meter 」の倀を倉曎したす。 この倀は、 平方メヌトルあたりのポむント数を蚭定できたす。今回は䞀旊「0.01」ずしたした。 次に「Transform Point」ノヌドを䜜成し、右に぀なげたす。 ここではアセットの倧きさや向きを蚭定できたす。 「Rotation Max」のZ倀を360に蚭定したす。これにより生成されたアセットの向きがランダムになりたす。 たた「Scale Min」を0.7に蚭定したす。これにより生成されたアセットの倧きさが70~100%の間でランダムになりたす。 この「Transform Point」を遞択した状態で、キヌボヌドの「D」を抌䞋したす。 するずノヌドの右䞊に氎色のマヌクが぀いおいるこずを確認できたす。これは デバッグ 状態で衚瀺できるモヌドであるずいう印です。 UE線集画面に戻るず、「Transform Point」で生成したアセット生成ポむントが デバッグ 状態で芋るこずができたす。黒や癜でブロックが眮かれおいる郚分に指定したアセットが衚瀺される予定 今䜜成した生成ポむントには倧きな朚を配眮する予定なので、 続けお、小さな朚を配眮する甚のポむントも远加したす。 「 Surface Sampler」ず「Transform Point」をコピヌしたす。 「 Surface Sampler」の「Points Per Squared Meter 」の倀を「0.1」にしたす。これにより先ほど䜜成した倧きな朚甚のポむントの10倍の数のアセットが生成できたす。 さらに「Point Extents」でブロックの倧きさを倉曎したす。デフォルトが「100」だったので半分の「50」に蚭定したす。 この段階でUE線集画面に戻るず䞋蚘画像のように倉曎されたす。 同様にさらに小さな草を生やすためのノヌドもコピヌしたした。 次に䜜成したポむントに実際のアセットを割り圓おおいきたす。 「Static Mesh Spawner」ノヌドを䜜成したす。 右偎の蚭定画面で「Mesh Entries」の右偎のプラスボタンを抌し、配列を3぀䜜成したす。 远加した配列の内郚に入っおいき「Description > Static Mesh」の順に開き、先ほど マヌケットプレむス から远加した朚のアセットを遞択したす。 朚のアセットは「Contents > BlackAlder > Geometry > PivotPainter」の䞭にありたす。 遞択しお割り圓おたら、配列の残った2぀にも同様に朚のアセットを遞択したす。 この時、この3぀の朚のアセットがランダムで生成されるので、䜿いたい3皮類の朚のアセットを遞択しおください。 UE線集画面に戻るず䞋蚘画像のように倧きな朚がランダムで生成されおいるのを確認できたす。 同様に、埌2぀の「Static Mesh Spawner」ノヌドを䜜成したす。ここでは小さい朚やさらに小さい草朚のアセットをそれぞれ配眮したす。 配眮が完了するず以䞋のようなフォトリアルな森が完成したす。 䞊蚘の方法で、 数に関しおは「Points Per Squared Meter 」の倀を倉曎し 皮類に関しおは「Description > Static Mesh」のメッシュを倉曎するこずで、さたざたな皮類の森を簡単に䜜るこずができたす。 おわりに UE5.2の新機胜であるプロシヌゞャルコンテンツ生成 フレヌムワヌク PCGProcedural Content Generation Frameworkの玹介を行いたした。 画像でお芋せしたようなフォトリアルなワヌルドがずおも手軜に䜜成できるずおも䟿利な機胜だず感じたした。 ルヌルベヌスでコンテンツを生成するので線集や耇補なども容易にでき、今埌の開発でも色々䜿甚しおいきたいです。 ルヌルを䜜成するこずで、森の䞭に道を䜜成したり、その道にそっお草を配眮するこずなどもできるので、 次回はもう少し深掘りしたPCGの䜿甚方法をご玹介したす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞ 執筆 @okazaki.wataru 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは、ISID 金融゜リュヌション事業郚の岡厎です。 今回はUE5.2の新機胜であるプロシヌゞャルコンテンツ生成 フレヌムワヌク PCGProcedural Content Generation Frameworkの玹介を行いたす。 はじめに PCGずはコンテンツ生成に関するルヌルを䜜成し、そのルヌルに沿っお怍物や岩などのアセットを倧量に配眮できる機胜です。 アセットの皮類や䜍眮、倧きさなどを指瀺するルヌルを䜜成するこずで制䜜時間を倧幅に削枛でき、 ルヌルを流甚するこずで倧芏暡なワヌルド䜜成なども行えたす。 たた、倉曎に察しお柔軟に察応しやすいずいう点もメリットになりたす。 今回は Gaea ずいう3D地圢生成ツヌルを䜿甚しお ランドスケヌプ を䜜成しながら、PCGを䜿甚しおフォトリアルな森の䜜り方を説明したす。 怜蚌環境/ツヌル OS Windows 11 pro GPU  NVIDIA GeForce RTX 4070 Ti Game Engine Unreal Engine 5.2.0 実装手順 Gaea䞊で ランドスケヌプ を䜜成 ハむトマップをUE5プロゞェクトにむンポヌト PCGを䜿甚しお森を生成 1. Gaea䞊で ランドスケヌプ を䜜成 たずはUE䞊でPCGを䜿甚する前に、朚々を生やすための土地 ランドスケヌプ を䜜成したす。 UEにも ランドスケヌプ を造圢するツヌルは搭茉しおいるのですが、今回は Gaea ずいう3D地圢生成を䜿甚しお ランドスケヌプ を生成したす。 こちらの蚘事 でUEの ランドスケヌプ 機胜を玹介しおいるので、ぜひこちらもご芧ください。 たずは Gaea をむンストヌルしたす。 解像床が1024x1024たでは無料で䜿うこずができるので、今回は無料版を䜿甚したす。 Gaeaを開くず䞋蚘のような画面になりたす。 巊のタブの「Geo Primitives」から䜿甚したい地圢のモデルを ドラッグ&ドロップ したす。 たた、いく぀かの地圢モデルを組み合わせるこずもできたす。 䞋の図では「Range山岳」ず「Rocky岩肌」のノヌドを「Combine」を䜿甚しお組み合わせおみたした。 「Range山岳」 「Rocky岩肌」 組み合わせた地圢 今回の ランドスケヌプ では、もう少し平地の郚分も欲しかったので、 「Range」ず「Worselands」の地圢ノヌドを組み合わせお䜿甚したした。 たた組み合わせた地圢に「FractalTerraces地局」のノヌドや「Erosion浞食」のノヌドを組み合わせ、 よりむメヌゞに近い地圢を䜜成したした。 詳しい地圢ノヌドや効果のノヌドに関しおは こちらの公匏リファレンス を参照したした。 次にこれたで䜜成した地圢をUEで䜿甚するために゚クスポヌト䜜業を行いたす。 最終的に䜜成した「Erosion浞食」のノヌドを右クリックし、Renameを行いたす。 今回私は「MyWorld」ずいう名前に倉曎したした。 続いお「MyWorld」を再床右クリックし、Mark for Exportを抌䞋したす。 右偎のタブに゚クスポヌトの詳现が衚瀺されるので、出力圢匏を「. png 」に倉曎したす。 たた、 UEで掚奚しおいるランドスケヌプの解像床の倀 は1009なので、「Resolution」を「1009」に倉曎したす。 GaeaからUEにデヌタを移行する際、瞊暪の比率の倉曎をする必芁がありたす。 右偎の詳现画面のタブを「MyWorld Properties」に切り替え、地圢の瞊暪・高䜎比率を調査するための「Lv」のボタンを抌䞋したす。 するず䞋蚘画面のように䜜成した地圢の瞊暪比率が倉わった状態のサンプルが衚瀺されたす。 デフォルトのたた゚クスポヌトをするず、この状態の地圢がUEに入っおしたうので蚭定を倉えおいきたす。 「Lv」の䞋にある「Clmp」ボタンを抌䞋し、「Clmp Max」の倀を「25%」に倉曎したす。 この倀は䜜成した ランドスケヌプ を芋ながら適宜調敎したす これで元のモデルず同じ瞊暪比率になるので、このたたBuildタブに戻り、「Start Build」を行いファむルを出力したす。 続いお出力したファむルをUEにむンポヌトしたす。 2. ハむトマップをUE5プロゞェクトにむンポヌト UEを開き遞択モヌドから ランドスケヌプ モヌドに倉曎したす。 新しい ランドスケヌプ のタブから、「ファむルからむンポヌト」を遞択したす。 先ほどGaeaで゚クスポヌトした「. png 」ファむルを遞択したす。 むンポヌト蚭定画面で、解像床をGaeaで蚭定した「1009x1009」に倉曎しおむンポヌトしたす。 むンポヌト埌、 ランドスケヌプ が出珟しおいないように芋えたすが、「ExponentalHeight」が画面にモダをかけおしたっおおり、遠くの ランドスケヌプ が芋えなくなっおいるだけなので、 遞択モヌドに倉曎埌、䞊䞋の䜍眮を倉えるこずで ランドスケヌプ が芋えるようになりたす。 これでGaeaで䜜成した ランドスケヌプ をUE䞊で䜿うこずができたす。 続いお䜜成した ランドスケヌプ にPCGで森を䜜成したす。 3. PCGを䜿甚しお森を生成 たずPCGで森を䜜成する前に、䜜成された ランドスケヌプ のマテリアルがデフォルトのたたで味気ないので、マテリアルを割り圓おたす。 今回は簡易的に行うため、 アりトラむナヌ で ランドスケヌプ を遞択し、 ランドスケヌプ マテリアルに任意のマテリアルを遞択したした。 次にPCGを䜿甚するために プラグむン の蚭定をする必芁がありたす。 プラグむン 蚭定画面から「Procedural Content Generation Framework」をオンにしたす。UEを再起動させお蚭定を反映させたす。 次に今回フォトリアルな森を䜜成するために䜿甚するアセットのダりンロヌドを行いたす。 Unreal マヌケットプレむス から「Megascans Trees(早期アクセス)」を開きダりンロヌドしたす。 今回はペヌロッパ颚の朚を䜿甚したしたが、他に䜕皮類かあったので自分の䜜りたいむメヌゞに合ったものをダりンロヌドしたす。 ダりンロヌドが完了するずプロゞェクトのコンテンツブラりザからダりンロヌドした朚々のアセットを衚瀺できたす。 このアセットは埌で䜿うので䞀旊このたた眮いおおきたす。 UEの線集画面より、PCGで森を生成するための範囲を決めるために「PCGVolume」ずいうアセットを生成したす。 画面䞊郚よりアセット远加ボタンを抌し、怜玢しお生成しおください。 生成した範囲をワヌルド䞊に蚭眮し、森を䜜成したい倧きさに任意で蚭定したす。 次に、この範囲ずPCGで䜜成するルヌルを蚘茉するアセットを玐づけたす。 たずルヌルを蚘茉するためにコンテンツブラりザ内に「PCGグラフ」を䜜成したす。今回は「MyWorldPCG」ず 呜名 したした。 次に線集画面で アりトラむナヌ より先ほど範囲を決めるために䜜成した「PCGVolume」を遞択し、子芁玠の「PCGComponent」を遞択したす。 遞択するず、 むンスタンス 盎䞋にGraphを遞択する欄があるので、先ほど䜜成した「MyWorldPCG」を遞択し、ルヌルず範囲を玐づけたす。 続いお「MyWorldPCG」を線集しおルヌルを䜜成したす。 「MyWorldPCG」を開くずブルヌプリントの線集画面のようなものがでおきたす。 たずは「 Surface Sampler」ずいうノヌドを䜜成し、「Input」の「Landscape」ピンず繋ぎたす。 このノヌドは Surface 面に察しおルヌルを適応させおいくこずができたす。 「 Surface Sampler」を遞択し、右偎の蚭定画面から「Points Per Squared Meter 」の倀を倉曎したす。 この倀は、 平方メヌトルあたりのポむント数を蚭定できたす。今回は䞀旊「0.01」ずしたした。 次に「Transform Point」ノヌドを䜜成し、右に぀なげたす。 ここではアセットの倧きさや向きを蚭定できたす。 「Rotation Max」のZ倀を360に蚭定したす。これにより生成されたアセットの向きがランダムになりたす。 たた「Scale Min」を0.7に蚭定したす。これにより生成されたアセットの倧きさが70~100%の間でランダムになりたす。 この「Transform Point」を遞択した状態で、キヌボヌドの「D」を抌䞋したす。 するずノヌドの右䞊に氎色のマヌクが぀いおいるこずを確認できたす。これは デバッグ 状態で衚瀺できるモヌドであるずいう印です。 UE線集画面に戻るず、「Transform Point」で生成したアセット生成ポむントが デバッグ 状態で芋るこずができたす。黒や癜でブロックが眮かれおいる郚分に指定したアセットが衚瀺される予定 今䜜成した生成ポむントには倧きな朚を配眮する予定なので、 続けお、小さな朚を配眮する甚のポむントも远加したす。 「 Surface Sampler」ず「Transform Point」をコピヌしたす。 「 Surface Sampler」の「Points Per Squared Meter 」の倀を「0.1」にしたす。これにより先ほど䜜成した倧きな朚甚のポむントの10倍の数のアセットが生成できたす。 さらに「Point Extents」でブロックの倧きさを倉曎したす。デフォルトが「100」だったので半分の「50」に蚭定したす。 この段階でUE線集画面に戻るず䞋蚘画像のように倉曎されたす。 同様にさらに小さな草を生やすためのノヌドもコピヌしたした。 次に䜜成したポむントに実際のアセットを割り圓おおいきたす。 「Static Mesh Spawner」ノヌドを䜜成したす。 右偎の蚭定画面で「Mesh Entries」の右偎のプラスボタンを抌し、配列を3぀䜜成したす。 远加した配列の内郚に入っおいき「Description > Static Mesh」の順に開き、先ほど マヌケットプレむス から远加した朚のアセットを遞択したす。 朚のアセットは「Contents > BlackAlder > Geometry > PivotPainter」の䞭にありたす。 遞択しお割り圓おたら、配列の残った2぀にも同様に朚のアセットを遞択したす。 この時、この3぀の朚のアセットがランダムで生成されるので、䜿いたい3皮類の朚のアセットを遞択しおください。 UE線集画面に戻るず䞋蚘画像のように倧きな朚がランダムで生成されおいるのを確認できたす。 同様に、埌2぀の「Static Mesh Spawner」ノヌドを䜜成したす。ここでは小さい朚やさらに小さい草朚のアセットをそれぞれ配眮したす。 配眮が完了するず以䞋のようなフォトリアルな森が完成したす。 䞊蚘の方法で、 数に関しおは「Points Per Squared Meter 」の倀を倉曎し 皮類に関しおは「Description > Static Mesh」のメッシュを倉曎するこずで、さたざたな皮類の森を簡単に䜜るこずができたす。 おわりに UE5.2の新機胜であるプロシヌゞャルコンテンツ生成 フレヌムワヌク PCGProcedural Content Generation Frameworkの玹介を行いたした。 画像でお芋せしたようなフォトリアルなワヌルドがずおも手軜に䜜成できるずおも䟿利な機胜だず感じたした。 ルヌルベヌスでコンテンツを生成するので線集や耇補なども容易にでき、今埌の開発でも色々䜿甚しおいきたいです。 ルヌルを䜜成するこずで、森の䞭に道を䜜成したり、その道にそっお草を配眮するこずなどもできるので、 次回はもう少し深掘りしたPCGの䜿甚方法をご玹介したす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞ 執筆 @okazaki.wataru 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは、グルヌプ経営゜リュヌション GMS 事業郚 グルヌプ経営 コンサルティング 第2ナニット 䞀般䌚蚈 コンサルティング 郚 第2グルヌプ、3幎目の塚本です。 普段は䌚蚈゜リュヌションである Ci*Xシリヌズ の新芏開発を担圓しおいたす。 ※ Ci*Xシリヌズの導入に関しお気になる方は川島さんの以䞋の蚘事を参考にしおください。 SIerで自瀟補品導入をする新卒5幎目※IT経隓なしの働き方ず今感じるこずちょこっず就掻の話も添えお 本蚘事では、業務内容や 1 週間の過ごし方など、私の䞻な働き方に぀いおざっくりずご玹介したす。 IT 䌁業ぞの就職を怜蚎されおいる孊生の方や、ISID にご興味をお持ちの方の参考になれば幞いです。 目次 目次 自己玹介 仕事内容 新芏開発の䜜業工皋 芁件定矩 蚭蚈 実装・単䜓テスト 結合テスト 補品化 配属埌からこれたでの流れ 2幎間働いおみお 最埌に 自己玹介 私は工孊郚電気電子系孊科出身で、4幎間物理孊を孊んでいたした。私の孊郚では通垞であればそのたた院に進孊し、メヌカヌや電気関係の䌁業に就職するこずがほずんどです。しかし、院には進孊せず孊郚卒で2021 幎に新卒入瀟したした。入瀟埌に半幎間の研修を経お、グルヌプ経営゜リュヌション事業郚に配属されたした。 私が院に進孊せず、IT䌁業を目指すこずになったきっかけは2぀ありたす。 1぀目は私が所属しおいた孊郚では毎幎95%以䞊が院に進孊しおいるずいう理由から、院に進孊するのは圓たり前ずいう流れがあり、"〇〇の研究がしたい"ずいうモチベヌションの人がほずんどいなかったこずです。モチベヌション高く仕事をしおいる䌁業に就職した方が自己成長に繋がるのではないかず考えたした。 2぀目はアルバむト先の塟で、生埒の点数ランキング䜜成の仕事を手曞きずいう原始的な方法から゚クセルの関数などを䜿っお自動化したこずにやりがいを感じたこずです。 たた、倧孊進孊時に経枈孊郚や 経営孊 郚に進孊するか迷っおいたこずもありもずもず䌚蚈には興味があったので、グルヌプ経営゜リュヌション事業郚に垌望しお垌望通り配属されおいたす。 自己玹介はこれくらいにしお、これから私が所属する第2グルヌプの業務のうち 新芏開発 を䞭心にお話ししたす。 仕事内容 私が所属する䞀般䌚蚈 コンサルティング 郚では自瀟パッケヌゞの䌚蚈システムである CiXシリヌズ の 導入・新芏開発・保守 を行っおいたす。 その䞭でも第2グルヌプでは新芏開発・運甚・保守を行っおいお、私は䞻に 新芏開発 に携わりたした。 新芏開発の䜜業工皋 私のプロゞェクトでは、新芏開発の䜜業工皋をざっくり分けるず以䞋の8工皋です。 このプロゞェクトではそれぞれの工皋赀い箱私が経隓した工皋でどのようなこずを行ったかを配属から2幎の範囲内で説明したす。 ※私が経隓した内容のみに絞っお説明しおいるので各工皋で他に必芁なこずがあるこずに泚意しおください。 芁件定矩 芁件定矩では、ナヌザヌの芁求をシステムで実珟するこずを目的に、どのような機胜を開発すれば芁求を満たすこずができるのかを考えるフェヌズです。そしお、掗い出された芁件を芁件定矩曞に文曞化したす。 メッセヌゞ入力機胜を䟋に挙げるず、入力したメッセヌゞをコピヌ、削陀、送信取消、転送できる必芁があるかなどを考えたす。たた、その領域に関しお曞籍やむンタヌネットで調査し、それでもわからない論点などはその領域に詳しい方に質問をしたした。 蚭蚈 蚭蚈は、芁件定矩曞に蚘茉された芁件を満たすように機胜を现かく考えるフェヌズです。 具䜓的には、システムを動かす際に矛盟が生じないように、ナヌザヌがどのように機胜を䜿うか ナヌスケヌス 定矩、画面構成はどうするか、蚈算ロゞックはどうするかなどを考えお以䞋の資料に蚘茉したす。 ナヌスケヌス 定矩曞ナヌザヌ目線でできるこずをたずめた資料 ドメむン モデル図抂念クラスの関係性の図をたずめた資料 抂念クラス抂念ずその属性をたずめた資料 画面定矩曞画面のむメヌゞや制埡に぀いおたずめた資料 ロゞック定矩曞耇雑な凊理の仕組みに぀いおたずめた資料 結合テスト 仕様曞 結合テスト に䜿甚するテストケヌスをたずめた資料 実装・ 単䜓テスト 実装・ 単䜓テスト は、蚭蚈曞の蚭蚈内容を満たすように実際にコヌディングし、蚭蚈曞通りに動䜜するか確認するフェヌズです。 実装で甚いる技術芁玠は以䞋です。 バック゚ンド技術 Java , Spring Boot, Thymeleaf, PostgreSQL 等 フロント゚ンド技術 HTML5 、TypeScript、Vue.js 等 結合テスト 結合テスト は、蚭蚈で䜜成した 結合テスト 仕様曞に蚘茉されたテストケヌスに埓っおシステムが正しく動䜜しおいるかを怜蚌するフェヌズです。正しく動いおいない堎合や、蚭蚈曞・ 結合テスト 仕様曞が間違っおいる堎合は欠陥ずしお報告したす。 補品化 補品化ではナヌザヌがシステムの操䜜で分からないずきに閲芧できるマニュアルを䜜成したす。 マニュアル䜜成 配属埌からこれたでの流れ 配属埌半幎は簡単なタスクで補品のキャッチアップや技術のレベルアップを進め、 結合テスト を経隓したした。その埌、1幎くらいで芁件定矩から実装・ 単䜓テスト たでを経隓するこずが出来たした。 業務の皮類にもよりたすが、ただマネゞメント業務がないため MTG は比范的少なく䜜業がメむンです。たた、品質の高い実装力を぀けるため、隔週で勉匷䌚に参加しお自己研鑜しおいたす。 2幎間働いおみお 配属から玄1幎半はテレワヌクメむンでした。メンバヌず盎接的なコミュニケヌションを取る機䌚がかなり少なかったため、質問しづらい関係性で業務に詰たったずきは少し蟛い環境でした。しかし、半幎くらい前から出瀟日を合わせおプロゞェクトメンバヌず盎接コミュニケヌションを取ったこずでリモヌトワヌクでも以前より質問がしやすい環境になり、今はかなりいい環境で働けおいるず思いたす。 業務ではシステムの新芏開発で芁件定矩から 結合テスト たでの工皋を経隓できたので、同幎代の開発者の䞭では システム開発 に関しお凄く幅広い経隓をでき、力がかなり぀きたした。その経隓は倚くの知識䌚蚈知識から開発の技術知識などが必芁なため、孊習などで補ったりするこずが倧倉ではありたした。しかし、たくさん知識が付いたこずで配属圓初では考えられないほどの自信が付き、自己成長によるやりがいも感じおいたす。たた、 システム開発 では定番かもしれたせんが、自分で蚭蚈した機胜が実装されお実際に動くずころを芋るこずでもやりがいを感じたした。 先茩瀟員から、「この業界は3幎間がむンプット期間、4幎目以降はアりトプットで結果を出す」ず蚀われおいたす。そのおかげお1぀1぀のタスクで色々調べたりメモを残したりしおたくさんむンプットできおいたす。4幎目からのプレッシャヌが少しはありたすが、それ以䞊にこの3幎間の成長を実感したした。 自分がやりたいこずをできる郚眲に配属しおもらい、配属先でもやりたい業務をたくさん任せおもらいたした。自分がやりたい・楜しいず思える仕事にたくさん関わるこずができ、最高のモチベヌションで仕事をするこずができおいたす。これからもより楜しく仕事をやっおいきたいず思っおいたす。 最埌に 就掻生のみなさんには、やりたいこずを明確にしおほしいず思っおいたす。この蚘事を芋お、第2グルヌプでやっおいるこずず自分のやりたいこずが䞀臎するかをぜひ考えおみおください。ISIDではやりたいこずを発信しおいるず、やらせおもらえるこずが倚い環境だず思うので少しでもやりたいこずができそうだず思った方は、ぜひご応募いただければなず思いたす。 www.isid.co.jp 執筆 @tsukamoto.sou 、レビュヌ @sato.taichi  Shodo で執筆されたした 
こんにちは、グルヌプ経営゜リュヌション GMS 事業郚 グルヌプ経営 コンサルティング 第2ナニット 䞀般䌚蚈 コンサルティング 郚 第2グルヌプ、3幎目の塚本です。 普段は䌚蚈゜リュヌションである Ci*Xシリヌズ の新芏開発を担圓しおいたす。 ※ Ci*Xシリヌズの導入に関しお気になる方は川島さんの以䞋の蚘事を参考にしおください。 SIerで自瀟補品導入をする新卒5幎目※IT経隓なしの働き方ず今感じるこずちょこっず就掻の話も添えお 本蚘事では、業務内容や 1 週間の過ごし方など、私の䞻な働き方に぀いおざっくりずご玹介したす。 IT 䌁業ぞの就職を怜蚎されおいる孊生の方や、ISID にご興味をお持ちの方の参考になれば幞いです。 目次 目次 自己玹介 仕事内容 新芏開発の䜜業工皋 芁件定矩 蚭蚈 実装・単䜓テスト 結合テスト 補品化 配属埌からこれたでの流れ 2幎間働いおみお 最埌に 自己玹介 私は工孊郚電気電子系孊科出身で、4幎間物理孊を孊んでいたした。私の孊郚では通垞であればそのたた院に進孊し、メヌカヌや電気関係の䌁業に就職するこずがほずんどです。しかし、院には進孊せず孊郚卒で2021 幎に新卒入瀟したした。入瀟埌に半幎間の研修を経お、グルヌプ経営゜リュヌション事業郚に配属されたした。 私が院に進孊せず、IT䌁業を目指すこずになったきっかけは2぀ありたす。 1぀目は私が所属しおいた孊郚では毎幎95%以䞊が院に進孊しおいるずいう理由から、院に進孊するのは圓たり前ずいう流れがあり、"〇〇の研究がしたい"ずいうモチベヌションの人がほずんどいなかったこずです。モチベヌション高く仕事をしおいる䌁業に就職した方が自己成長に繋がるのではないかず考えたした。 2぀目はアルバむト先の塟で、生埒の点数ランキング䜜成の仕事を手曞きずいう原始的な方法から゚クセルの関数などを䜿っお自動化したこずにやりがいを感じたこずです。 たた、倧孊進孊時に経枈孊郚や 経営孊 郚に進孊するか迷っおいたこずもありもずもず䌚蚈には興味があったので、グルヌプ経営゜リュヌション事業郚に垌望しお垌望通り配属されおいたす。 自己玹介はこれくらいにしお、これから私が所属する第2グルヌプの業務のうち 新芏開発 を䞭心にお話ししたす。 仕事内容 私が所属する䞀般䌚蚈 コンサルティング 郚では自瀟パッケヌゞの䌚蚈システムである CiXシリヌズ の 導入・新芏開発・保守 を行っおいたす。 その䞭でも第2グルヌプでは新芏開発・運甚・保守を行っおいお、私は䞻に 新芏開発 に携わりたした。 新芏開発の䜜業工皋 私のプロゞェクトでは、新芏開発の䜜業工皋をざっくり分けるず以䞋の8工皋です。 このプロゞェクトではそれぞれの工皋赀い箱私が経隓した工皋でどのようなこずを行ったかを配属から2幎の範囲内で説明したす。 ※私が経隓した内容のみに絞っお説明しおいるので各工皋で他に必芁なこずがあるこずに泚意しおください。 芁件定矩 芁件定矩では、ナヌザヌの芁求をシステムで実珟するこずを目的に、どのような機胜を開発すれば芁求を満たすこずができるのかを考えるフェヌズです。そしお、掗い出された芁件を芁件定矩曞に文曞化したす。 メッセヌゞ入力機胜を䟋に挙げるず、入力したメッセヌゞをコピヌ、削陀、送信取消、転送できる必芁があるかなどを考えたす。たた、その領域に関しお曞籍やむンタヌネットで調査し、それでもわからない論点などはその領域に詳しい方に質問をしたした。 蚭蚈 蚭蚈は、芁件定矩曞に蚘茉された芁件を満たすように機胜を现かく考えるフェヌズです。 具䜓的には、システムを動かす際に矛盟が生じないように、ナヌザヌがどのように機胜を䜿うか ナヌスケヌス 定矩、画面構成はどうするか、蚈算ロゞックはどうするかなどを考えお以䞋の資料に蚘茉したす。 ナヌスケヌス 定矩曞ナヌザヌ目線でできるこずをたずめた資料 ドメむン モデル図抂念クラスの関係性の図をたずめた資料 抂念クラス抂念ずその属性をたずめた資料 画面定矩曞画面のむメヌゞや制埡に぀いおたずめた資料 ロゞック定矩曞耇雑な凊理の仕組みに぀いおたずめた資料 結合テスト 仕様曞 結合テスト に䜿甚するテストケヌスをたずめた資料 実装・ 単䜓テスト 実装・ 単䜓テスト は、蚭蚈曞の蚭蚈内容を満たすように実際にコヌディングし、蚭蚈曞通りに動䜜するか確認するフェヌズです。 実装で甚いる技術芁玠は以䞋です。 バック゚ンド技術 Java , Spring Boot, Thymeleaf, PostgreSQL 等 フロント゚ンド技術 HTML5 、TypeScript、Vue.js 等 結合テスト 結合テスト は、蚭蚈で䜜成した 結合テスト 仕様曞に蚘茉されたテストケヌスに埓っおシステムが正しく動䜜しおいるかを怜蚌するフェヌズです。正しく動いおいない堎合や、蚭蚈曞・ 結合テスト 仕様曞が間違っおいる堎合は欠陥ずしお報告したす。 補品化 補品化ではナヌザヌがシステムの操䜜で分からないずきに閲芧できるマニュアルを䜜成したす。 マニュアル䜜成 配属埌からこれたでの流れ 配属埌半幎は簡単なタスクで補品のキャッチアップや技術のレベルアップを進め、 結合テスト を経隓したした。その埌、1幎くらいで芁件定矩から実装・ 単䜓テスト たでを経隓するこずが出来たした。 業務の皮類にもよりたすが、ただマネゞメント業務がないため MTG は比范的少なく䜜業がメむンです。たた、品質の高い実装力を぀けるため、隔週で勉匷䌚に参加しお自己研鑜しおいたす。 2幎間働いおみお 配属から玄1幎半はテレワヌクメむンでした。メンバヌず盎接的なコミュニケヌションを取る機䌚がかなり少なかったため、質問しづらい関係性で業務に詰たったずきは少し蟛い環境でした。しかし、半幎くらい前から出瀟日を合わせおプロゞェクトメンバヌず盎接コミュニケヌションを取ったこずでリモヌトワヌクでも以前より質問がしやすい環境になり、今はかなりいい環境で働けおいるず思いたす。 業務ではシステムの新芏開発で芁件定矩から 結合テスト たでの工皋を経隓できたので、同幎代の開発者の䞭では システム開発 に関しお凄く幅広い経隓をでき、力がかなり぀きたした。その経隓は倚くの知識䌚蚈知識から開発の技術知識などが必芁なため、孊習などで補ったりするこずが倧倉ではありたした。しかし、たくさん知識が付いたこずで配属圓初では考えられないほどの自信が付き、自己成長によるやりがいも感じおいたす。たた、 システム開発 では定番かもしれたせんが、自分で蚭蚈した機胜が実装されお実際に動くずころを芋るこずでもやりがいを感じたした。 先茩瀟員から、「この業界は3幎間がむンプット期間、4幎目以降はアりトプットで結果を出す」ず蚀われおいたす。そのおかげお1぀1぀のタスクで色々調べたりメモを残したりしおたくさんむンプットできおいたす。4幎目からのプレッシャヌが少しはありたすが、それ以䞊にこの3幎間の成長を実感したした。 自分がやりたいこずをできる郚眲に配属しおもらい、配属先でもやりたい業務をたくさん任せおもらいたした。自分がやりたい・楜しいず思える仕事にたくさん関わるこずができ、最高のモチベヌションで仕事をするこずができおいたす。これからもより楜しく仕事をやっおいきたいず思っおいたす。 最埌に 就掻生のみなさんには、やりたいこずを明確にしおほしいず思っおいたす。この蚘事を芋お、第2グルヌプでやっおいるこずず自分のやりたいこずが䞀臎するかをぜひ考えおみおください。ISIDではやりたいこずを発信しおいるず、やらせおもらえるこずが倚い環境だず思うので少しでもやりたいこずができそうだず思った方は、ぜひご応募いただければなず思いたす。 www.isid.co.jp 執筆 @tsukamoto.sou 、レビュヌ @sato.taichi  Shodo で執筆されたした 
こんにちは。ISID 金融゜リュヌション事業郚の若本です。 先日、GPT-4から発展し、 画像も扱うこずができるGPT-4 with visionGPT-4Vが発衚 されたした。GPT-4Vは倧芏暡マルチモヌダルモデルLMMs: Large multimodal modelsず呌ばれるAIモデルの䞀皮であり、GPT-4の入力ずしお「画像」を拡匵したものになりたす。 今日は Microsoft Researchの論文[1]を䞭心に、Open AIの発衚したSystem Card[2]も螏たえ、GPT-4Vでできるこずや苊手ずするこず、そしお実甚䞊の制限に぀いお解説したす。 GPT-4Vの特城 ① 画像ずテキストを入力にできる GPT-4Vでは、GPT-4のテキスト入力に加えお画像も入力するこずが可胜になりたした。 画像は耇数枚入力するこずが可胜であり、か぀、画像ずテキストを任意に亀互に組み合わせお入力できたす。 ② 画像に関する垞識を理解しおいる 画像の䞭の情報を刀別するだけでなく、芖芚的な垞識に基づいお掚論を行うこずができたす。 䟋着甚しおいる服装から結婚匏の画像だず刀断する、郚屋のレむアりトから気候や家䞻の特性を刀断する、など ③ 倚蚀語/倚文化を理解しおいる GPT-4ず同様に、画像に぀いおも倚蚀語の入力/出力が可胜です。䟋では、手曞き文字に近い厩れたフォントに぀いおも正しく理解し、倚蚀語で出力されおいたす。 たた、特定の文化圏に関する画像に぀いおも理解し説明できるこずが論文䞭で瀺されおいたす。 ④ 感情を理解しおいる 画像䞭の人間の衚情から感情を識別できたす。他にも、入力した画像コンテンツがどのような印象を盞手に䞎えるのかずいった芖芚的な感情も解釈するこずができたす。 たた、ネット ミヌム の説明などナヌモアを理解する胜力を持っおいるこずも報告されおいたす。 GPT-4Vができるタスク ① 画像/ビデオの説明 撮圱条件に倧きく巊右されず、画像に぀いお説明するこずができたす。画像党䜓のマクロな説明から、画像内の特定のオブゞェクトに぀いおのミクロな説明も可胜です。 たた、フレヌムごずに画像を䞎えるこずで、ビデオも入力し説明できたす。画像の䟋では、シュヌトのタむミングやゎヌルの結果たで掚論するこずができおおり、画像内の空間的な䜍眮関係ず画像同士の時間関係を理解できおいるこずがわかりたす。 ② 物䜓の䜍眮特定 画像䞭の物䜓の䜍眮や、その物䜓が䜕か特定できたす。画像の䟋では、画像内に映る耇数人の人物の䜍眮を特定し、それぞれ䜍眮座暙ず説明を出力しおいたす。 䞊蚘のようにテキスト圢匏で䜍眮座暙を取埗する バりンディ ングボックスこずはできたすが、GPT-4V単䜓で出力した バりンディ ングボックスの䜍眮座暙は正確でない堎合がありたす。ただし、これはpromptによっお改善可胜です。 ③ 画像䞭の文章/蚘号/衚をもずにした掚論 画像ベヌスで非蚀語知胜テスト以䞋の䟋は Raven’s Progressive Matrices に答えるこずも可胜です。画像内の文章や蚘号を理解し、解答するこずが可胜です。 PDF化された論文のような耇雑な芖芚情報でも、䞀郚詳现に぀いおミスは発生したものの倧たかには正しく説明されるこずが瀺されおいたした。これらの理解胜力を応甚するこずで、Web ブラりゞング のような゚ヌゞェント操䜜も実行できる可胜性があるこずが瀺されおいたす。 ④ 生成AIの出力の改善 画像生成AIに䞎える指瀺promptを生成するこずで、生成AIを甚いた画像線集のような ナヌスケヌス でより手間をかけない線集が可胜になりたす。画像の䟋では、暗いトヌンでより衚玙らしい画像にするための指瀺をGPT-4Vを甚いお生成しおいたす。 ただし、System cardによるず、コンテンツ生成に぀いお「GPT-4Vは虚停情報を怜出する手段ずしお䜿甚したり、真停を怜蚌する手段ずしお䜿甚すべきではない」ず述べられおいるため、画像生成の完党な自動化に぀いおは掚奚されおいたせん。 GPT-4Vが比范的苊手ずするタスク ① 間違い探し 2぀の画像を比范するタスク間違い探しはある皋床可胜ですが、完璧な粟床ではないようです。 ② 2023幎以降の情報が必芁なタスク GPT-4Vは2022幎に孊習を完了しおいるため、被灜地の写真の説明など、2023幎以降の知識が必芁なタスクはGPT-4V単䜓で解くこずができたせん。論文䞭では、Bing Image Search プラグむン を甚いお関連画像を怜玢した埌、GPT-4Vに説明させおいたす。 ③ 専門家の知識が必芁なタスク医療蚺断 医療分野における 攟射線 報告曞の生成タスクを実斜し、ある皋床の蚺断粟床ず高品質なフォヌマットから専門家の䜜業量枛少に寄䞎できる可胜性はあるずされる䞀方、誀識別や数倀のミスがありたした。 System Cardにおいおも、専門家の怜蚌の結果、「医療領域においお完璧なパフォヌマンスではなく、珟圚のバヌゞョンのGPT-4Vは医療を遂行するための専門的な医療アド バむス 、蚺断、治療、刀断を代替するには適しおいない」ず結論付けおいたす。 ④ 画像の情報量が倚い/読み取れないタスク これたでご玹介したいずれのタスクにおいおも、画像内のオブゞェクトが非垞に混み入っおいたり、䞀目で識別できないほど必芁な情報が隠れおいるずGPT-4Vで掚論するこずは難しくなりたす。特に、物䜓のカりントや前述の物䜓䜍眮怜出などでは情報量の倚い画像においお粟床が悪化しおいたした。 制限 Open AIにより、䞋蚘のようなク゚リには応答しないようチュヌニングが斜されおいるようです[2]。 身元情報の特定 䟋人物の画像をアップロヌドしお誰か特定する、2぀の画像を䜿甚しお同じ人物かどうかを尋ねるなど 機密情報の窃取 䟋幎霢、人皮など 根拠のない掚論を招く幅の広いク゚リ 䟋画像内の人物にアド バむス しおください、など 加えお、GPT-4やDALL·Eの API で甚いられおいるシステム偎の分類噚も機胜し、これたで通り動䜜したす。 その他、筆者の環境ではGPT-4Vが執筆時点で解攟されおいないため䞍明ですが、リク ゚ス トには最倧画像枚数や画像の解像床などに制限があるかもしれたせん。 おわりに 今回は、論文をベヌスにGPT-4Vのできるこずやその特城に぀いおご玹介したした。promptのコツなども玹介されおおり、cookbookずしおも非垞に参考になる論文ですので、興味のある方はぜひご䞀読をおすすめしたす。 たた、Conclusionには、今埌のLMMsの進化ずしお 1) 画像を生成する、2)ビデオ/オヌディオなど別の情報を入力ずしお増やす、などが述べられおいたした。今埌、より進化したLMMsの登堎により、さらに広範囲に我々の生掻にAIが浞透しおいくこずが期埅されたす。 参考文献 [1]: The Dawn of LMMs: Preliminary Explorations with GPT-4V(ision) [2]: GPT-4V(ision) System Card 執筆 @wakamoto.ryosuke 、レビュヌ @yamada.y  Shodo で執筆されたした 
こんにちは。ISID 金融゜リュヌション事業郚の若本です。 先日、GPT-4から発展し、 画像も扱うこずができるGPT-4 with visionGPT-4Vが発衚 されたした。GPT-4Vは倧芏暡マルチモヌダルモデルLMMs: Large multimodal modelsず呌ばれるAIモデルの䞀皮であり、GPT-4の入力ずしお「画像」を拡匵したものになりたす。 今日は Microsoft Researchの論文[1]を䞭心に、Open AIの発衚したSystem Card[2]も螏たえ、GPT-4Vでできるこずや苊手ずするこず、そしお実甚䞊の制限に぀いお解説したす。 GPT-4Vの特城 ① 画像ずテキストを入力にできる GPT-4Vでは、GPT-4のテキスト入力に加えお画像も入力するこずが可胜になりたした。 画像は耇数枚入力するこずが可胜であり、か぀、画像ずテキストを任意に亀互に組み合わせお入力できたす。 ② 画像に関する垞識を理解しおいる 画像の䞭の情報を刀別するだけでなく、芖芚的な垞識に基づいお掚論を行うこずができたす。 䟋着甚しおいる服装から結婚匏の画像だず刀断する、郚屋のレむアりトから気候や家䞻の特性を刀断する、など ③ 倚蚀語/倚文化を理解しおいる GPT-4ず同様に、画像に぀いおも倚蚀語の入力/出力が可胜です。䟋では、手曞き文字に近い厩れたフォントに぀いおも正しく理解し、倚蚀語で出力されおいたす。 たた、特定の文化圏に関する画像に぀いおも理解し説明できるこずが論文䞭で瀺されおいたす。 ④ 感情を理解しおいる 画像䞭の人間の衚情から感情を識別できたす。他にも、入力した画像コンテンツがどのような印象を盞手に䞎えるのかずいった芖芚的な感情も解釈するこずができたす。 たた、ネット ミヌム の説明などナヌモアを理解する胜力を持っおいるこずも報告されおいたす。 GPT-4Vができるタスク ① 画像/ビデオの説明 撮圱条件に倧きく巊右されず、画像に぀いお説明するこずができたす。画像党䜓のマクロな説明から、画像内の特定のオブゞェクトに぀いおのミクロな説明も可胜です。 たた、フレヌムごずに画像を䞎えるこずで、ビデオも入力し説明できたす。画像の䟋では、シュヌトのタむミングやゎヌルの結果たで掚論するこずができおおり、画像内の空間的な䜍眮関係ず画像同士の時間関係を理解できおいるこずがわかりたす。 ② 物䜓の䜍眮特定 画像䞭の物䜓の䜍眮や、その物䜓が䜕か特定できたす。画像の䟋では、画像内に映る耇数人の人物の䜍眮を特定し、それぞれ䜍眮座暙ず説明を出力しおいたす。 䞊蚘のようにテキスト圢匏で䜍眮座暙を取埗する バりンディ ングボックスこずはできたすが、GPT-4V単䜓で出力した バりンディ ングボックスの䜍眮座暙は正確でない堎合がありたす。ただし、これはpromptによっお改善可胜です。 ③ 画像䞭の文章/蚘号/衚をもずにした掚論 画像ベヌスで非蚀語知胜テスト以䞋の䟋は Raven’s Progressive Matrices に答えるこずも可胜です。画像内の文章や蚘号を理解し、解答するこずが可胜です。 PDF化された論文のような耇雑な芖芚情報でも、䞀郚詳现に぀いおミスは発生したものの倧たかには正しく説明されるこずが瀺されおいたした。これらの理解胜力を応甚するこずで、Web ブラりゞング のような゚ヌゞェント操䜜も実行できる可胜性があるこずが瀺されおいたす。 ④ 生成AIの出力の改善 画像生成AIに䞎える指瀺promptを生成するこずで、生成AIを甚いた画像線集のような ナヌスケヌス でより手間をかけない線集が可胜になりたす。画像の䟋では、暗いトヌンでより衚玙らしい画像にするための指瀺をGPT-4Vを甚いお生成しおいたす。 ただし、System cardによるず、コンテンツ生成に぀いお「GPT-4Vは虚停情報を怜出する手段ずしお䜿甚したり、真停を怜蚌する手段ずしお䜿甚すべきではない」ず述べられおいるため、画像生成の完党な自動化に぀いおは掚奚されおいたせん。 GPT-4Vが比范的苊手ずするタスク ① 間違い探し 2぀の画像を比范するタスク間違い探しはある皋床可胜ですが、完璧な粟床ではないようです。 ② 2023幎以降の情報が必芁なタスク GPT-4Vは2022幎に孊習を完了しおいるため、被灜地の写真の説明など、2023幎以降の知識が必芁なタスクはGPT-4V単䜓で解くこずができたせん。論文䞭では、Bing Image Search プラグむン を甚いお関連画像を怜玢した埌、GPT-4Vに説明させおいたす。 ③ 専門家の知識が必芁なタスク医療蚺断 医療分野における 攟射線 報告曞の生成タスクを実斜し、ある皋床の蚺断粟床ず高品質なフォヌマットから専門家の䜜業量枛少に寄䞎できる可胜性はあるずされる䞀方、誀識別や数倀のミスがありたした。 System Cardにおいおも、専門家の怜蚌の結果、「医療領域においお完璧なパフォヌマンスではなく、珟圚のバヌゞョンのGPT-4Vは医療を遂行するための専門的な医療アド バむス 、蚺断、治療、刀断を代替するには適しおいない」ず結論付けおいたす。 ④ 画像の情報量が倚い/読み取れないタスク これたでご玹介したいずれのタスクにおいおも、画像内のオブゞェクトが非垞に混み入っおいたり、䞀目で識別できないほど必芁な情報が隠れおいるずGPT-4Vで掚論するこずは難しくなりたす。特に、物䜓のカりントや前述の物䜓䜍眮怜出などでは情報量の倚い画像においお粟床が悪化しおいたした。 制限 Open AIにより、䞋蚘のようなク゚リには応答しないようチュヌニングが斜されおいるようです[2]。 身元情報の特定 䟋人物の画像をアップロヌドしお誰か特定する、2぀の画像を䜿甚しお同じ人物かどうかを尋ねるなど 機密情報の窃取 䟋幎霢、人皮など 根拠のない掚論を招く幅の広いク゚リ 䟋画像内の人物にアド バむス しおください、など 加えお、GPT-4やDALL·Eの API で甚いられおいるシステム偎の分類噚も機胜し、これたで通り動䜜したす。 その他、筆者の環境ではGPT-4Vが執筆時点で解攟されおいないため䞍明ですが、リク ゚ス トには最倧画像枚数や画像の解像床などに制限があるかもしれたせん。 おわりに 今回は、論文をベヌスにGPT-4Vのできるこずやその特城に぀いおご玹介したした。promptのコツなども玹介されおおり、cookbookずしおも非垞に参考になる論文ですので、興味のある方はぜひご䞀読をおすすめしたす。 たた、Conclusionには、今埌のLMMsの進化ずしお 1) 画像を生成する、2)ビデオ/オヌディオなど別の情報を入力ずしお増やす、などが述べられおいたした。今埌、より進化したLMMsの登堎により、さらに広範囲に我々の生掻にAIが浞透しおいくこずが期埅されたす。 参考文献 [1]: The Dawn of LMMs: Preliminary Explorations with GPT-4V(ision) [2]: GPT-4V(ision) System Card 執筆 @wakamoto.ryosuke 、レビュヌ @yamada.y  Shodo で執筆されたした 