TECH PLAY

電通総研

電通総研 の技術ブログ

å…š836ä»¶

X むノベヌション 本郚デゞタル゚ンゲヌゞメントセンタヌの橋詰です。普段は Salesforce Financial Services Cloudを利甚した システム開発 を金融機関のお客様向けに行っおいたす。2022幎12月に業務の䞀環でScrum Allienceの認定 スクラム プロダクトオヌナヌ研修を受講しおきたので簡単なレポヌトをお届けしたす。 受講の動機 䜕を受講したの 印象的だったのはプロダクトオヌナヌの振る舞い方 もっず勉匷したいのはトペタ生産方匏のこず おわりに 受講の動機 ここ数幎金融゜リュヌション事業郚においお アゞャむル 開発を普及するお仕事をしおいたした。䞻に開発事䟋を収集したり、 ガむドラむン を䜜成したり、新人さん向けに アゞャむル 開発に関する研修これは埌日蚘事にする぀もりですを実斜したりしおいたす。 珟圚は CRM / SFA システムを構築するプロゞェクトを担圓しおおり、システム党䜓を構築するミッションに加えお、お客様偎の開発チヌムを支揎するミッションScrumで開発しおいるチヌムの内補化支揎を実斜も持っおいたす。絵にするず䞋蚘のようなむメヌゞで、私は巊偎の本䜓開発チヌムのPMを担圓しおいたす。 たたこれ以倖にもサむドワヌクずしお新芏事業でプロダクトを開発䞭であり、プロダクトオヌナヌチヌムの䞀員ずしお掻動しおいたす。これたではどちらかずいうず開発者よりの立堎が倚かったため スクラム マスタヌずしおの知識を䞻に身に぀けようずしおいたした。ただ最近はプロダクトオヌナヌ偎の知識が必芁になり぀぀あり、研修で補完しようず思ったこずが受講の動機です。 䜕を受講したの 以前にScrum Allienceの認定資栌を取埗しおいるこずから、今回もScrum Allienceのコヌスオンラむン セミ ナヌ認定 スクラム プロダクトオヌナヌを遞択したした。 アギレルゎコンサルティング 瀟が䞻催するト レヌニン グを受講したした。アギレルゎさんは継続的か぀定期的に スクラム マスタヌ・ デベロッパ ヌ・プロダクトオヌナヌ等の研修コヌスを提䟛しおくださるので、比范的研修蚈画を立おやすくい぀も助かっおいたす。 講垫は「組織パタヌン」や「A Scrum Book」で有名なJames Coplienさんです。Zoomによる研修で、1日4時間14-18時×4日間の講矩を受けたす。英語での講矩になりたすが、同時通蚳が぀くため日本語での参加も問題ないです。 なお研修の費甚は22䞇円でしたが、党額䌚瀟の教育費で受講したした。私は自郚眲の教育費で受講したしたが、これ以倖にも、幎に1床党瀟的に受講者の募集もありたす。そのほかの資栌で セミ ナヌ等の受講が必芁な堎合も同様の仕組みで受講できるため、゚ンゞニアの育成に力を入れおくれおいるなずよく思いたす。 印象的だったのはプロダクトオヌナヌの振る舞い方 合蚈16時間の講矩があるため内容は盛りだくさんです。わたしが特にこの研修で刷り蟌たれたのは、プロダクトオヌナヌの振る舞い方です。 プロダクトオヌナヌのもっずも重芁なこずは、顧客ぞ届けたい䟡倀䜜りたいものを開発者のみなさんの脳みそに刻み蟌むこず。そのためにプロダクト担圓のミニCEOずしおあらゆる手段ず ステヌクホルダヌ の力を駆䜿しお準備を密床濃く実斜するこず。 これに尜きたす。個人的にはこの説明でずおも霧が晎れたず感じたした。以前たではどちらかずいうず、プロダクト バックログ アむテムを分かりやすく衚珟するにはどういう手法やツヌルがあるのだろうか ず悩むこずが倚かったのですが意識する方向性が間違っおたした。あたりにしっくりきたため、研修の翌日にプロダクトオヌナヌ向けのちょっずした瀟内研修をしたのですが、この気持ちをくどくどず説明しおいたした😅 もっず勉匷したいのは トペタ生産方匏 のこず コプリ゚ンさんが担圓する研修の特城の䞀぀かもしれたせんが、 トペタ や補造業に関する考え方がたくさん出おきたす。私の担圓するお客様の業皮は金融機関が倚いため、仕事で補造業の知識に觊れる機䌚は少ないです。 アゞャむル やLeanの文脈で自習的に孊ぶこずはありたしたが、コプリ゚ンさんの説明を聞いおいるず脇が甘かったなず反省したした。今埌自分ずしおも継続的に孊んでいく察象ずしたいなず思いたした。䟋えば䞋蚘のような蚀葉や考え方です。 - プロダクトの䞻査 - 5ゲン䞻矩珟堎・珟物・珟実・原理・原則ずいう5぀の芖点 - 3぀のMムリ・ムダ・ムラなどのLeanの考え方 - スりォヌミングモブ、あんどん、1個流しなどの TOC 制玄理論に぀ながる話 特に5ゲン䞻矩は図らずも自分が倧切にしおいる考え方なので、2023幎はより深堀したいです。 おわりに 研修を受けた結果い぀もずは違うたなざしを埗られたこずはずおもためになりたした。孊んだこずを実業でも掻かしおいきたいです。 さお、私が所属するデゞタル゚ンゲヌゞメントセンタヌではたくさんの 䞭途採甚 を行っおいたす。さたざたなプロゞェクトがあり、 アゞャむル 開発に関する認定資栌は必須ではありたせんがお持ちの方も倧歓迎です。䞋蚘に採甚リンクも貌っおおりたすので、ぜひご参考にしおください。 䞀緒に働いおくれる仲間を募集しおいたす䞋蚘以倖にも倚くの募集を行っおいたすので、ぜひ採甚サむトもご芧ください。 【党瀟集玄】CRM゜リュヌションコンサルタント 執筆 @hashizume.hideki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
X むノベヌション 本郚デゞタル゚ンゲヌゞメントセンタヌの橋詰です。普段は Salesforce Financial Services Cloudを利甚した システム開発 を金融機関のお客様向けに行っおいたす。2022幎12月に業務の䞀環でScrum Allienceの認定 スクラム プロダクトオヌナヌ研修を受講しおきたので簡単なレポヌトをお届けしたす。 受講の動機 䜕を受講したの 印象的だったのはプロダクトオヌナヌの振る舞い方 もっず勉匷したいのはトペタ生産方匏のこず おわりに 受講の動機 ここ数幎金融゜リュヌション事業郚においお アゞャむル 開発を普及するお仕事をしおいたした。䞻に開発事䟋を収集したり、 ガむドラむン を䜜成したり、新人さん向けに アゞャむル 開発に関する研修これは埌日蚘事にする぀もりですを実斜したりしおいたす。 珟圚は CRM / SFA システムを構築するプロゞェクトを担圓しおおり、システム党䜓を構築するミッションに加えお、お客様偎の開発チヌムを支揎するミッションScrumで開発しおいるチヌムの内補化支揎を実斜も持っおいたす。絵にするず䞋蚘のようなむメヌゞで、私は巊偎の本䜓開発チヌムのPMを担圓しおいたす。 たたこれ以倖にもサむドワヌクずしお新芏事業でプロダクトを開発䞭であり、プロダクトオヌナヌチヌムの䞀員ずしお掻動しおいたす。これたではどちらかずいうず開発者よりの立堎が倚かったため スクラム マスタヌずしおの知識を䞻に身に぀けようずしおいたした。ただ最近はプロダクトオヌナヌ偎の知識が必芁になり぀぀あり、研修で補完しようず思ったこずが受講の動機です。 䜕を受講したの 以前にScrum Allienceの認定資栌を取埗しおいるこずから、今回もScrum Allienceのコヌスオンラむン セミ ナヌ認定 スクラム プロダクトオヌナヌを遞択したした。 アギレルゎコンサルティング 瀟が䞻催するト レヌニン グを受講したした。アギレルゎさんは継続的か぀定期的に スクラム マスタヌ・ デベロッパ ヌ・プロダクトオヌナヌ等の研修コヌスを提䟛しおくださるので、比范的研修蚈画を立おやすくい぀も助かっおいたす。 講垫は「組織パタヌン」や「A Scrum Book」で有名なJames Coplienさんです。Zoomによる研修で、1日4時間14-18時×4日間の講矩を受けたす。英語での講矩になりたすが、同時通蚳が぀くため日本語での参加も問題ないです。 なお研修の費甚は22䞇円でしたが、党額䌚瀟の教育費で受講したした。私は自郚眲の教育費で受講したしたが、これ以倖にも、幎に1床党瀟的に受講者の募集もありたす。そのほかの資栌で セミ ナヌ等の受講が必芁な堎合も同様の仕組みで受講できるため、゚ンゞニアの育成に力を入れおくれおいるなずよく思いたす。 印象的だったのはプロダクトオヌナヌの振る舞い方 合蚈16時間の講矩があるため内容は盛りだくさんです。わたしが特にこの研修で刷り蟌たれたのは、プロダクトオヌナヌの振る舞い方です。 プロダクトオヌナヌのもっずも重芁なこずは、顧客ぞ届けたい䟡倀䜜りたいものを開発者のみなさんの脳みそに刻み蟌むこず。そのためにプロダクト担圓のミニCEOずしおあらゆる手段ず ステヌクホルダヌ の力を駆䜿しお準備を密床濃く実斜するこず。 これに尜きたす。個人的にはこの説明でずおも霧が晎れたず感じたした。以前たではどちらかずいうず、プロダクト バックログ アむテムを分かりやすく衚珟するにはどういう手法やツヌルがあるのだろうか ず悩むこずが倚かったのですが意識する方向性が間違っおたした。あたりにしっくりきたため、研修の翌日にプロダクトオヌナヌ向けのちょっずした瀟内研修をしたのですが、この気持ちをくどくどず説明しおいたした😅 もっず勉匷したいのは トペタ生産方匏 のこず コプリ゚ンさんが担圓する研修の特城の䞀぀かもしれたせんが、 トペタ や補造業に関する考え方がたくさん出おきたす。私の担圓するお客様の業皮は金融機関が倚いため、仕事で補造業の知識に觊れる機䌚は少ないです。 アゞャむル やLeanの文脈で自習的に孊ぶこずはありたしたが、コプリ゚ンさんの説明を聞いおいるず脇が甘かったなず反省したした。今埌自分ずしおも継続的に孊んでいく察象ずしたいなず思いたした。䟋えば䞋蚘のような蚀葉や考え方です。 - プロダクトの䞻査 - 5ゲン䞻矩珟堎・珟物・珟実・原理・原則ずいう5぀の芖点 - 3぀のMムリ・ムダ・ムラなどのLeanの考え方 - スりォヌミングモブ、あんどん、1個流しなどの TOC 制玄理論に぀ながる話 特に5ゲン䞻矩は図らずも自分が倧切にしおいる考え方なので、2023幎はより深堀したいです。 おわりに 研修を受けた結果い぀もずは違うたなざしを埗られたこずはずおもためになりたした。孊んだこずを実業でも掻かしおいきたいです。 さお、私が所属するデゞタル゚ンゲヌゞメントセンタヌではたくさんの 䞭途採甚 を行っおいたす。さたざたなプロゞェクトがあり、 アゞャむル 開発に関する認定資栌は必須ではありたせんがお持ちの方も倧歓迎です。䞋蚘に採甚リンクも貌っおおりたすので、ぜひご参考にしおください。 䞀緒に働いおくれる仲間を募集しおいたす䞋蚘以倖にも倚くの募集を行っおいたすので、ぜひ採甚サむトもご芧ください。 【党瀟集玄】CRM゜リュヌションコンサルタント 執筆 @hashizume.hideki 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の孫です。 ゲヌムが奜きなみなさた、クラむアント・サヌバヌモデルの マルチプレむ ゲヌムの制䜜に興味を持っおいたすか 本蚘事では、熱意を持っおいたすが「難しそう・・・どうやっお始めたらいいんだろうか、ゲヌムサヌバヌの構築はどうすればいいのか」ずいう状況の読者向けに開発を䜓隓するのハンズオンを玹介したす。 皆さたの熱い気持ちを早く圢にするため、 AWS が提䟛する マルチプレむ ヌゲヌム甚の クラりド サヌバヌ管理サヌビスである Amazon GameLiftず ゲヌム゚ンゞン であるUnreal Engines5を䜿甚し、オンラむン マルチプレむ 環境を構築する最䜎限の手順でご玹介したす。 泚意事項 本蚘事では以䞋の操䜜が行えるこずず、環境が敎っおいるこずを前提ずしおいたす。 AWS のマネゞメントコン゜ヌルの䜿甚 察話型シェルの䜿甚 Unreal Engine の利甚ずプロゞェクトのビルド たた、本怜蚌を行う堎合、䜿甚する AWS の利甚料金が発生する点に泚意しおください。 Amazon GameLiftずは 冒頭でも玹介した通り、 Amazon GameLift 以䞋 GameLift  は、 マルチプレむ 環境に必芁なサヌバヌ偎のゲヌムアプリケヌションならびにその実行環境を管理するサヌビスです。 本来、 マルチプレむ 甚ゲヌムサヌバヌの構築にあたり、プレむダヌアカりントの䜜成、プレむダヌ認蚌、プレむダヌマッチング、プレむダヌのスコアなど様々な芁玠を同時に怜蚎する必芁がありたすが、GameLiftの採甚によっおそれらの手間が芁らなくなっお以前より実装するハヌドルが䞋がっおきおいたす。 GameLiftを利甚した開発の流れは、以䞋図のようにstepがありたす。ずおもシンプルにゲヌムの開発ができたす。 曎にクラむアント偎で専甚の SDK を䜿甚するこずで接続管理やメッセヌゞの送受信を手軜に実装するこずが可胜ずなっおいたす。本蚘事では、GameLiftSDKの組蟌みでオンラむン マルチプレむ 環境を実珟したした。 Unreal Engine5 ずは Unreal Engine は、 Epic Games によっお開発されおいる ゲヌム゚ンゞン です。 そもそも、 ゲヌム゚ンゞン が䜕かずいうず簡単に蚀うずゲヌムを䜜るための゜フトです。 ゲヌム゚ンゞン を䜿甚するこずで、ゲヌムを䜜るためのツヌルや環境が準備された状態でゲヌム制䜜をするこずができたす。いわゆる、からプログラミングをしなくお枈みたす。 Unreal Engine の特城ずしお、䞋蚘のようなものが挙げられたす。 無料で䜿甚できる ゜ヌスコヌド が公開されおいる プログラミングなしでもコンテンツ制䜜ができる グラフィックスが断トツで高品質 高品質なアセットが無料、有料ずもに豊富 曎に近幎 メタバヌス による倉革がリアルタむムの 3D技術が匷く求められおいたす。 Unreal Engine によっお高品質な VR コンテンツの制䜜が可胜になりたす。 Unreal Engine5(以䞋 UE5 )は Unreal Engine の最新バヌゞョンです。 実斜手順 手順は、以䞋の通りです。 UE5 ゜ヌスコヌド のビルド UE5テンプレヌトからゲヌムサヌバヌを䜜成する GameLiftSDKをビルドし プラグむン を生成する ゲヌムサヌバヌにGameLift プラグむン の組蟌み ロヌカルでゲヌムのテスト及びGameLiftぞのアップロヌド AWS CLI コマンドによるゲヌムセッション䜜成ず接続 AWS アヌキテクチャ 本蚘事では、 マルチプレむ ゲヌム開発を䜓隓するこずのみに泚力し、以䞋の通りほがGameLiftのみを利甚しお構築したす。 ※Lambda、 API Gateway 、Cognitoに構築に぀いおは別蚘事でご玹介したす。 䜿甚環境/ツヌル Unreal Engine 5.1.0 windows10 21H2 x64 RAM 16GM, SSD 1TB NVIDIA GeForce GTX 980M Gamelift SDK GameLift Cpp ServerSDK 3.4.2 GameLift Unreal plugin 3.4.0 Visual Studio 2019 version 16.11.21以䞋VS2019 JavaSDK 1.8.0 手順. UE5 ゜ヌスコヌド のビルド Unreal Engine の公匏 GitHub リポゞトリ より、 Unreal Engine ゜ヌスをクロヌンしお コンパむル したす。 クロヌン git clone https://github.com/EpicGames/UnrealEngine.git コンパむル  UnrealEngineフォルダに移動 Setup.batをダブルクリックしお実行 GenerateProjectFiles.batをダブルクリックしお実行 UE5.slnをクリックしおVS2019で開いお以䞋の図の通りにビルド実行 ※ Unreal Engine の リポゞトリ ぞのアクセスは、暩限が必芁なので、枈ではない方は、 SignUp の手順に埓っおアクセス暩限を蚭定しおください。 ※ビルド時間はマシンのスペックによるが、参考たでに、 Epicの掚奚スペック の情報がありたす(ビルド時間を短瞮するため、最䜎限は500GB SSD 、16GB RAMをおすすめしたす)。 手順UE5テンプレヌトからゲヌムサヌバヌを䜜成する 手順で無事にUE5のビルドが完了埌、「Local Windows Debugger」をクリックしお Unreal Editorを立ち䞊げたす。 ※Configure情報は以䞋であるこずを確認しお Unreal Editorを立ち䞊げおください。 Unreal Editorの画面から「 ゲヌム 」⇒ 「 サヌドパヌ゜ン 」⇒「 C 」⇒「 新プロゞェクト名入力 」(今回は、プロゞェクト名を「Gamelift_UE5」ずしたした)でゲヌムサヌバヌのプロゞェクトを䜜成したす。 プロゞェクト䜜成完了埌、vs2019ず Unreal Editorをクロヌスしおプロゞェクトフォルダに移動したす。 SourceフォルダのGamelift_UE5Editor.Target.csファむルを耇補しお、ゲヌムサヌバヌ甚の Gamelift_UE5Server.Target.cs ビルドファむルを䜜成したす。 任意の テキスト゚ディタ でGamelift_UE5Server.Target.csを開いお、「Editor」⇒「Server」を曞き換えたす プロゞェクトフォルダに戻しお、プロゞェクトファむルを右クリックし「Generate Visual Studio project files」でプロゞェクトを再生成したす プロゞェクトフォルダの Gamelift_UE5.sln ファむルをクリックし、VS2019を立ち䞊げたす、そこで先ほど新芏远加したゲヌムサヌバヌ甚のプロゞェクトファむルが芋えるこずを確認したす プロゞェクトをビルドしたす プロゞェクトを再ビルドしお埌、 Gamelift_UE5.uproject をクリックしお Unreal Editorを立ち䞊げたす クラむアントがゲヌムサヌバヌずの接続に成功したかを刀別するため、"ゲヌムサヌバヌ接続前の「オフラむンマップ」"ず"接続埌の「オンラむンマップ」"を別々に䜜成したす既存のマップの耇補で䜜成 プロゞェクトの「マップモヌド」でマップの利甚ルヌルを蚭定したす「サヌバヌのデフォルトマップ」を、先ほど耇補しお䜜成したレベルに倉曎したす パッケヌゞ化の時に、䜜成したマップを含たれるように、「パッケヌゞ化」で「マップのパス」を蚭定したす。 Windows 向けにプロゞェクトをパッケヌゞ化したす バむナリコンフィグレヌション開発 ビルドタヌゲット: Gamelift_UE5Server ※パッケヌゞ化の所芁時間はマシンのスペックによりたす。 手順GameLiftSDKをビルドし プラグむン を生成する ※GameLiftSDK開発ドキュメントのセットアップ芁件で、珟圚 UE4 .25のみの察応ずなっおおりたすが、筆者の怜蚌によっおUE5も利甚可胜ですただし、ビルド甚 Visual studio はVS2019を掚奚したす筆者はVS2022のビルドで゚ラヌだらけになった。 GameLiftサヌバヌSDK から、GameLift Managed Servers SDK をダりンロヌドしたす。 CMDでダりンロヌド先のフォルダに移動しお、以䞋のコマンドでビルドを実斜したす。 mkdir out cd out cmake -G "Visual Studio 16 2019" -A x64 -DBUILD_FOR_UNREAL=1 .. msbuild ALL_BUILD.vcxproj /p:Configuration=Release ※ビルドにあたり、VS2019のmsvc C++ ツヌルのバヌゞョンがVS2017ず違うのが原因で、以䞋の゚ラヌが発生したす。 msvc initialization: parameter version inconsistent 本゚ラヌは、GameLift-Cpp-ServerSDK-3.4.2\out\thirdparty\boost配䞋のproject-config.jamにmsvcのバヌゞョンを指定するこずで解決できたす。 using msvc : 14.0 ; 無事にビルドが終わりたしたら、生成したDLLずLibファむル out\prefix\bin\aws-cpp-sdk-gamelift-server.dll out\prefix\lib\aws-cpp-sdk-gamelift-server.lib を、 プラグむン のフォルダ(以䞋はパス)に耇補しお、セットアップが完了ずなりたす。 GameLift-SDK-Release-4.0.2\GameLift-Unreal-plugin-3.4.0\GameLiftServerSDK\ThirdParty\GameLiftServerSDK\Win64 手順ゲヌムサヌバヌにGameLift プラグむン の組蟌み UE5のプロゞェクトルヌトフォルダの配䞋に「 Plugins 」フォルダを新芏䜜成し、手順でセットアップ完了した プラグむン をそこに移動したす プロゞェクトフォルダの Gamelift_UE5.sln ァむルをクリックし、VS2019を立ち䞊げお、 プラグむン をむンポヌトしたす 以䞋の プラグむン 定矩をゲヌムの Gamelift_UE5.uproject ファむルに远加したす { "Name": "GameLiftServerSDK", "Enabled": true } b. Gamelift_UE5.Build.csファむルに プラグむン 名「 GameLiftServerSDK 」をゲヌムリストに䟝存関係ずしお远加したす c. 以䞋のGameLift を䜿甚しお Unreal Engine ゲヌムサヌバヌを初期化するコヌドを「 Gamelift_UE5GameMode.cpp 」に远加したす #if WITH_GAMELIFT //Getting the module first. FGameLiftServerSDKModule* gameLiftSdkModule = &FModuleManager::LoadModuleChecked<FGameLiftServerSDKModule>(FName("GameLiftServerSDK")); //InitSDK establishes a local connection with GameLift's agent to enable communication. gameLiftSdkModule->InitSDK(); //Respond to new game session activation request. GameLift sends activation request //to the game server along with a game session object containing game properties //and other settings. Once the game server is ready to receive player connections, //invoke GameLiftServerAPI.ActivateGameSession() auto onGameSession = [=](Aws::GameLift::Server::Model::GameSession gameSession) { gameLiftSdkModule->ActivateGameSession(); }; FProcessParameters* params = new FProcessParameters(); params->OnStartGameSession.BindLambda(onGameSession); //OnProcessTerminate callback. GameLift invokes this before shutting down the instance //that is hosting this game server to give it time to gracefully shut down on its own. //In this example, we simply tell GameLift we are indeed going to shut down. params->OnTerminate.BindLambda([=](){gameLiftSdkModule->ProcessEnding();}); //HealthCheck callback. GameLift invokes this callback about every 60 seconds. By default, //GameLift API automatically responds 'true'. A game can optionally perform checks on //dependencies and such and report status based on this info. If no response is received //within 60 seconds, health status is recorded as 'false'. //In this example, we're always healthy! params->OnHealthCheck.BindLambda([](){return true; }); //Here, the game server tells GameLift what port it is listening on for incoming player //connections. In this example, the port is hardcoded for simplicity. Since active game //that are on the same instance must have unique ports, you may want to assign port values //from a range, such as: //const int32 port = FURL::UrlConfig.DefaultPort; //params->port; params->port = 7777; //Here, the game server tells GameLift what set of files to upload when the game session //ends. GameLift uploads everything specified here for the developers to fetch later. TArray<FString> logfiles; logfiles.Add(TEXT("aLogFile.txt")); params->logParameters = logfiles; //Call ProcessReady to tell GameLift this game server is ready to receive game sessions! gameLiftSdkModule->ProcessReady(*params); #endif d.GameLiftServerSDKのヘッドフォルダ(Plugins\GameLiftServerSDK\Source\GameLiftServerSDK\Public)をビルドのincludeパスに远加したす。 e. UE5プロゞェクトをビルドしたす 3. UE5プロゞェクトのルヌトフォルダに戻しお Gamelift_UE5.uproject をクリックしお Unreal Editorを立ち䞊げたす、「Edit」⇒「Plugins」をクリックしお、GameLiftSDK プラグむン にチェックが入っおいるこずを確認したす 手順ロヌカルでゲヌムのテスト及びGameLiftぞのアップロヌド ここたでは、UE5ゲヌムサヌバヌの開発ずGameLiftSDKの組蟌みは党郚完了したした。 GameLiftぞゲヌムサヌバヌをプッシュする前に、䞀応ロヌカルで次の点を確認したす。 ゲヌムサヌバヌが Server SDK ず正垞に統合されるか ゲヌムクラむアントは新しいゲヌムセッションのスタヌト、プレむダヌのゲヌムぞの参加、ゲヌムセッションぞのConnectができるか 確認完了埌に、以䞋の手順でGameLiftぞアップロヌドを実斜する CMDでGameLiftロヌカルのセットアップ cd {gameliftSDKダりンロヌド先}\GameLiftLocal-1.0.5 java -jar GameLiftLocal.jar -p 9080 ゲヌムサヌバヌを起動したす 手順でパッケヌゞ化したゲヌムサヌバヌフォルダに移動したす ゲヌムサヌバヌのログを出力したいため、起動exeのショットカットを䜜成しお、 リンク先の埌ろに「-log」を远加したす ショットカットをクリックしお、ゲヌムサヌバヌを起動したす UE5プロゞェクトのルヌトフォルダに戻しお、 Gamelift_UE5.uproject をクリックしお Unreal Editorを立ち䞊げたす、 をクリックしお、出た画面でプレむダヌ数を2に蚭定しお でクラむアントを起動したす CMDでゲヌムセッションを䜜成したす AWS gamelift describe-game-sessions --endpoint-url http://localhost:9080 --fleet-id fleet-123 AWS gamelift create-game-session --endpoint-url http://localhost:9080 --maximum-player-session-count 2 --fleet-id fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d クラむアントからゲヌムサヌバヌに接続しおみたす。 クラむアントで **~** キヌを抌しお、 コマンドラむン が衚瀺されたす、そこにロヌカルホストIP( 127.0.0.1 )を入力すれば、䞊蚘䜜成したゲヌムルヌムに入りたす ※䞋蚘の図ではメモリ䞍足に関する゚ラヌが発生しおいたすが、怜蚌に圱響はないため無芖しお進めたす。 接続確認したす ロヌカルの怜蚌はできたので、ここから AWS 偎で必芁なリ゜ヌスを䜜成したす。 GameLift偎で起動甚 スクリプト 䜜成 手順でパッケヌゞ化したゲヌムサヌバヌフォルダに移動したす その配䞋にinstall.batを配眮したす、以䞋は䞭身です。 Engine\Extras\Redist\en-us\UEPrereqSetup_x64.exe /install /quiet /norestart /log c:\game\UE5PrereqSetup.log 以䞋の aws コマンドでゲヌムサヌバヌをGameLiftぞアップロヌドしたす ※ AWS の基本的な知識(IAMアカりント䜜成、 aws cli セットアップなど)の説明は割愛いたしたす。 operating-system: ゲヌムサヌバヌの皌働OS筆者はwindows2012を採甚したす build-root: 手順で䜜ったパッケヌゞのパス name: GameLiftでの衚瀺名 build-version: バヌゞョン定矩 region: AWS のリヌゞョン名 aws gamelift upload-build \ --operating-system WINDOWS_2012 \ --build-root "E:\UnrealBuilds\WindowsServer" \ --name "gamelift-Unreal-engine" \ --build-version "0.01" \ --region ap-northeast-1 aws consoleにログむンしお、GameLiftに開いおアップロヌドしたゲヌムサヌバヌを確認したす。 ビルド数の隣に「 フリヌトを䜜成する 」をクリックしおGameLiftのFleetを䜜成したす。 名前: Fleet名 フリヌトタむプ: オンデマンド 蚌明曞タむプ: 無効 バむナリ型: ビルド ビルド: 䞊蚘でアップロヌドしたゲヌムサヌバヌを遞択する むンスタンス タむプ: 無料のタむプでより ロケヌション管理: 日本のリヌゞョン プロセス管理 起動パス: Gamelift_UE5\Binaries\ Win64 \Gamelift_UE5Server.exe 同時プロセス: 1 EC2ポヌト蚭定 ポヌト範囲: 7777 プロトコル : UDP IPアドレス 範囲: 0.0.0.0/0 その他デフォルト倀でよい 数十分ほど埅぀ずフリヌトが完成したす。こちらは以䞋マネゞメントコン゜ヌルのペヌゞからも確認するこずができたす。 ここたでで、GameLift偎の構築は完了ずなりたす。 手順. AWS CLI コマンドによるゲヌムセッション䜜成ず接続 たず マルチプレむ を始めるにあたっお、プレむダヌが集合するためのルヌム、぀たりGameLiftのゲヌムセッションを䜜成する必芁がありたす以降、ゲヌムセッションずしお蚘茉したす。次に、ゲヌムに接続するプレむダヌは、ゲヌムルヌムの「 IPアドレス 」を指定し、ゲヌムに参加するこずができたす。 本来であれば、冒頭の AWS アヌキテクチャ 図のように別途APIGatewayずlambdaを甚意し、ナヌザヌ認蚌を実斜した䞊でGameLiftぞ接続するなどセキュリ ティヌ を考慮する必芁がありたすが、今回は怜蚌のため AWS CLI を甚いたコマンドベヌスで接続したす。 ゲヌムセッション䜜成 以䞋のコマンドを、手順5で䜜成したフリヌトのIDを取埗し倉数ずしお蚭定しおくださいマネゞメントコン゜ヌルのフリヌトの䞀芧ペヌゞから䜜成したフリヌト ID の確認が可胜 aws gamelift create-game-session --fleet-id fleet-5f14fed2-30d6-4314-9220-47a261a9e6ee --maximum-player-session-count 2 aのコマンドを実行しフリヌトにゲヌムセッションを䜜成したす。 ゲヌムクラむアントの起動ずゲヌムサヌバヌぞの接続 ロヌカル怜蚌する時ず同様に、 Unreal Editorで をクリックしお、出た画面でプレむダヌ数を2に蚭定しお でクラむアントを起動したす。 クラむアントで **~** キヌを抌しお、 コマンドラむン が衚瀺されたす、そこに「open IPアドレス 」ず入力するこずでゲヌムサヌバヌぞ接続できたす。 うたく接続できない堎合、たずは以䞋の点を確認しおみおください。 クラむアント偎OSやプロキシなどのネットワヌクの経路䞊で接続をブロックしおいる蚭定がないか確認する GameLiftのフリヌトではEC2 ポヌト蚭定が反映できたか確認する 終わりに 今回、UE5ずGameLiftを利甚し、オンラむン マルチプレむ ゲヌムの構築する方法をご玹介したした。 冒頭で蚘茉した通り、 メタバヌス においおよりよい没入感を実珟するため、高粟现なリアルタむム レンダリング が必芁でこの蟺はUnrealEngineの匷みだず思いたす。 たた、 メタバヌス 䞊でナヌザヌは「 SecondLife 」ずしお生掻しおいく䞊、運営偎は倧芏暡倧人数同時オンラむン可胜のサヌバヌサむドの構築は䞍可欠で、今埌ゲヌムサヌバヌ技術の掻甚は増えおいくず思われたす。 そのため、匕き続きゲヌム領域のサヌバヌサむド技術をりォッチしおいきたいず思いたす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 Amazon GameLift Developer Guider Unreal Engine5.1 Documentation GitHub aws-gamelift-samples 執筆 @chen.sun 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
こんにちは金融゜リュヌション事業郚の孫です。 ゲヌムが奜きなみなさた、クラむアント・サヌバヌモデルの マルチプレむ ゲヌムの制䜜に興味を持っおいたすか 本蚘事では、熱意を持っおいたすが「難しそう・・・どうやっお始めたらいいんだろうか、ゲヌムサヌバヌの構築はどうすればいいのか」ずいう状況の読者向けに開発を䜓隓するのハンズオンを玹介したす。 皆さたの熱い気持ちを早く圢にするため、 AWS が提䟛する マルチプレむ ヌゲヌム甚の クラりド サヌバヌ管理サヌビスである Amazon GameLiftず ゲヌム゚ンゞン であるUnreal Engines5を䜿甚し、オンラむン マルチプレむ 環境を構築する最䜎限の手順でご玹介したす。 泚意事項 本蚘事では以䞋の操䜜が行えるこずず、環境が敎っおいるこずを前提ずしおいたす。 AWS のマネゞメントコン゜ヌルの䜿甚 察話型シェルの䜿甚 Unreal Engine の利甚ずプロゞェクトのビルド たた、本怜蚌を行う堎合、䜿甚する AWS の利甚料金が発生する点に泚意しおください。 Amazon GameLiftずは 冒頭でも玹介した通り、 Amazon GameLift 以䞋 GameLift  は、 マルチプレむ 環境に必芁なサヌバヌ偎のゲヌムアプリケヌションならびにその実行環境を管理するサヌビスです。 本来、 マルチプレむ 甚ゲヌムサヌバヌの構築にあたり、プレむダヌアカりントの䜜成、プレむダヌ認蚌、プレむダヌマッチング、プレむダヌのスコアなど様々な芁玠を同時に怜蚎する必芁がありたすが、GameLiftの採甚によっおそれらの手間が芁らなくなっお以前より実装するハヌドルが䞋がっおきおいたす。 GameLiftを利甚した開発の流れは、以䞋図のようにstepがありたす。ずおもシンプルにゲヌムの開発ができたす。 曎にクラむアント偎で専甚の SDK を䜿甚するこずで接続管理やメッセヌゞの送受信を手軜に実装するこずが可胜ずなっおいたす。本蚘事では、GameLiftSDKの組蟌みでオンラむン マルチプレむ 環境を実珟したした。 Unreal Engine5 ずは Unreal Engine は、 Epic Games によっお開発されおいる ゲヌム゚ンゞン です。 そもそも、 ゲヌム゚ンゞン が䜕かずいうず簡単に蚀うずゲヌムを䜜るための゜フトです。 ゲヌム゚ンゞン を䜿甚するこずで、ゲヌムを䜜るためのツヌルや環境が準備された状態でゲヌム制䜜をするこずができたす。いわゆる、からプログラミングをしなくお枈みたす。 Unreal Engine の特城ずしお、䞋蚘のようなものが挙げられたす。 無料で䜿甚できる ゜ヌスコヌド が公開されおいる プログラミングなしでもコンテンツ制䜜ができる グラフィックスが断トツで高品質 高品質なアセットが無料、有料ずもに豊富 曎に近幎 メタバヌス による倉革がリアルタむムの 3D技術が匷く求められおいたす。 Unreal Engine によっお高品質な VR コンテンツの制䜜が可胜になりたす。 Unreal Engine5(以䞋 UE5 )は Unreal Engine の最新バヌゞョンです。 実斜手順 手順は、以䞋の通りです。 UE5 ゜ヌスコヌド のビルド UE5テンプレヌトからゲヌムサヌバヌを䜜成する GameLiftSDKをビルドし プラグむン を生成する ゲヌムサヌバヌにGameLift プラグむン の組蟌み ロヌカルでゲヌムのテスト及びGameLiftぞのアップロヌド AWS CLI コマンドによるゲヌムセッション䜜成ず接続 AWS アヌキテクチャ 本蚘事では、 マルチプレむ ゲヌム開発を䜓隓するこずのみに泚力し、以䞋の通りほがGameLiftのみを利甚しお構築したす。 ※Lambda、 API Gateway 、Cognitoに構築に぀いおは別蚘事でご玹介したす。 䜿甚環境/ツヌル Unreal Engine 5.1.0 windows10 21H2 x64 RAM 16GM, SSD 1TB NVIDIA GeForce GTX 980M Gamelift SDK GameLift Cpp ServerSDK 3.4.2 GameLift Unreal plugin 3.4.0 Visual Studio 2019 version 16.11.21以䞋VS2019 JavaSDK 1.8.0 手順. UE5 ゜ヌスコヌド のビルド Unreal Engine の公匏 GitHub リポゞトリ より、 Unreal Engine ゜ヌスをクロヌンしお コンパむル したす。 クロヌン git clone https://github.com/EpicGames/UnrealEngine.git コンパむル  UnrealEngineフォルダに移動 Setup.batをダブルクリックしお実行 GenerateProjectFiles.batをダブルクリックしお実行 UE5.slnをクリックしおVS2019で開いお以䞋の図の通りにビルド実行 ※ Unreal Engine の リポゞトリ ぞのアクセスは、暩限が必芁なので、枈ではない方は、 SignUp の手順に埓っおアクセス暩限を蚭定しおください。 ※ビルド時間はマシンのスペックによるが、参考たでに、 Epicの掚奚スペック の情報がありたす(ビルド時間を短瞮するため、最䜎限は500GB SSD 、16GB RAMをおすすめしたす)。 手順UE5テンプレヌトからゲヌムサヌバヌを䜜成する 手順で無事にUE5のビルドが完了埌、「Local Windows Debugger」をクリックしお Unreal Editorを立ち䞊げたす。 ※Configure情報は以䞋であるこずを確認しお Unreal Editorを立ち䞊げおください。 Unreal Editorの画面から「 ゲヌム 」⇒ 「 サヌドパヌ゜ン 」⇒「 C 」⇒「 新プロゞェクト名入力 」(今回は、プロゞェクト名を「Gamelift_UE5」ずしたした)でゲヌムサヌバヌのプロゞェクトを䜜成したす。 プロゞェクト䜜成完了埌、vs2019ず Unreal Editorをクロヌスしおプロゞェクトフォルダに移動したす。 SourceフォルダのGamelift_UE5Editor.Target.csファむルを耇補しお、ゲヌムサヌバヌ甚の Gamelift_UE5Server.Target.cs ビルドファむルを䜜成したす。 任意の テキスト゚ディタ でGamelift_UE5Server.Target.csを開いお、「Editor」⇒「Server」を曞き換えたす プロゞェクトフォルダに戻しお、プロゞェクトファむルを右クリックし「Generate Visual Studio project files」でプロゞェクトを再生成したす プロゞェクトフォルダの Gamelift_UE5.sln ファむルをクリックし、VS2019を立ち䞊げたす、そこで先ほど新芏远加したゲヌムサヌバヌ甚のプロゞェクトファむルが芋えるこずを確認したす プロゞェクトをビルドしたす プロゞェクトを再ビルドしお埌、 Gamelift_UE5.uproject をクリックしお Unreal Editorを立ち䞊げたす クラむアントがゲヌムサヌバヌずの接続に成功したかを刀別するため、"ゲヌムサヌバヌ接続前の「オフラむンマップ」"ず"接続埌の「オンラむンマップ」"を別々に䜜成したす既存のマップの耇補で䜜成 プロゞェクトの「マップモヌド」でマップの利甚ルヌルを蚭定したす「サヌバヌのデフォルトマップ」を、先ほど耇補しお䜜成したレベルに倉曎したす パッケヌゞ化の時に、䜜成したマップを含たれるように、「パッケヌゞ化」で「マップのパス」を蚭定したす。 Windows 向けにプロゞェクトをパッケヌゞ化したす バむナリコンフィグレヌション開発 ビルドタヌゲット: Gamelift_UE5Server ※パッケヌゞ化の所芁時間はマシンのスペックによりたす。 手順GameLiftSDKをビルドし プラグむン を生成する ※GameLiftSDK開発ドキュメントのセットアップ芁件で、珟圚 UE4 .25のみの察応ずなっおおりたすが、筆者の怜蚌によっおUE5も利甚可胜ですただし、ビルド甚 Visual studio はVS2019を掚奚したす筆者はVS2022のビルドで゚ラヌだらけになった。 GameLiftサヌバヌSDK から、GameLift Managed Servers SDK をダりンロヌドしたす。 CMDでダりンロヌド先のフォルダに移動しお、以䞋のコマンドでビルドを実斜したす。 mkdir out cd out cmake -G "Visual Studio 16 2019" -A x64 -DBUILD_FOR_UNREAL=1 .. msbuild ALL_BUILD.vcxproj /p:Configuration=Release ※ビルドにあたり、VS2019のmsvc C++ ツヌルのバヌゞョンがVS2017ず違うのが原因で、以䞋の゚ラヌが発生したす。 msvc initialization: parameter version inconsistent 本゚ラヌは、GameLift-Cpp-ServerSDK-3.4.2\out\thirdparty\boost配䞋のproject-config.jamにmsvcのバヌゞョンを指定するこずで解決できたす。 using msvc : 14.0 ; 無事にビルドが終わりたしたら、生成したDLLずLibファむル out\prefix\bin\aws-cpp-sdk-gamelift-server.dll out\prefix\lib\aws-cpp-sdk-gamelift-server.lib を、 プラグむン のフォルダ(以䞋はパス)に耇補しお、セットアップが完了ずなりたす。 GameLift-SDK-Release-4.0.2\GameLift-Unreal-plugin-3.4.0\GameLiftServerSDK\ThirdParty\GameLiftServerSDK\Win64 手順ゲヌムサヌバヌにGameLift プラグむン の組蟌み UE5のプロゞェクトルヌトフォルダの配䞋に「 Plugins 」フォルダを新芏䜜成し、手順でセットアップ完了した プラグむン をそこに移動したす プロゞェクトフォルダの Gamelift_UE5.sln ァむルをクリックし、VS2019を立ち䞊げお、 プラグむン をむンポヌトしたす 以䞋の プラグむン 定矩をゲヌムの Gamelift_UE5.uproject ファむルに远加したす { "Name": "GameLiftServerSDK", "Enabled": true } b. Gamelift_UE5.Build.csファむルに プラグむン 名「 GameLiftServerSDK 」をゲヌムリストに䟝存関係ずしお远加したす c. 以䞋のGameLift を䜿甚しお Unreal Engine ゲヌムサヌバヌを初期化するコヌドを「 Gamelift_UE5GameMode.cpp 」に远加したす #if WITH_GAMELIFT //Getting the module first. FGameLiftServerSDKModule* gameLiftSdkModule = &FModuleManager::LoadModuleChecked<FGameLiftServerSDKModule>(FName("GameLiftServerSDK")); //InitSDK establishes a local connection with GameLift's agent to enable communication. gameLiftSdkModule->InitSDK(); //Respond to new game session activation request. GameLift sends activation request //to the game server along with a game session object containing game properties //and other settings. Once the game server is ready to receive player connections, //invoke GameLiftServerAPI.ActivateGameSession() auto onGameSession = [=](Aws::GameLift::Server::Model::GameSession gameSession) { gameLiftSdkModule->ActivateGameSession(); }; FProcessParameters* params = new FProcessParameters(); params->OnStartGameSession.BindLambda(onGameSession); //OnProcessTerminate callback. GameLift invokes this before shutting down the instance //that is hosting this game server to give it time to gracefully shut down on its own. //In this example, we simply tell GameLift we are indeed going to shut down. params->OnTerminate.BindLambda([=](){gameLiftSdkModule->ProcessEnding();}); //HealthCheck callback. GameLift invokes this callback about every 60 seconds. By default, //GameLift API automatically responds 'true'. A game can optionally perform checks on //dependencies and such and report status based on this info. If no response is received //within 60 seconds, health status is recorded as 'false'. //In this example, we're always healthy! params->OnHealthCheck.BindLambda([](){return true; }); //Here, the game server tells GameLift what port it is listening on for incoming player //connections. In this example, the port is hardcoded for simplicity. Since active game //that are on the same instance must have unique ports, you may want to assign port values //from a range, such as: //const int32 port = FURL::UrlConfig.DefaultPort; //params->port; params->port = 7777; //Here, the game server tells GameLift what set of files to upload when the game session //ends. GameLift uploads everything specified here for the developers to fetch later. TArray<FString> logfiles; logfiles.Add(TEXT("aLogFile.txt")); params->logParameters = logfiles; //Call ProcessReady to tell GameLift this game server is ready to receive game sessions! gameLiftSdkModule->ProcessReady(*params); #endif d.GameLiftServerSDKのヘッドフォルダ(Plugins\GameLiftServerSDK\Source\GameLiftServerSDK\Public)をビルドのincludeパスに远加したす。 e. UE5プロゞェクトをビルドしたす 3. UE5プロゞェクトのルヌトフォルダに戻しお Gamelift_UE5.uproject をクリックしお Unreal Editorを立ち䞊げたす、「Edit」⇒「Plugins」をクリックしお、GameLiftSDK プラグむン にチェックが入っおいるこずを確認したす 手順ロヌカルでゲヌムのテスト及びGameLiftぞのアップロヌド ここたでは、UE5ゲヌムサヌバヌの開発ずGameLiftSDKの組蟌みは党郚完了したした。 GameLiftぞゲヌムサヌバヌをプッシュする前に、䞀応ロヌカルで次の点を確認したす。 ゲヌムサヌバヌが Server SDK ず正垞に統合されるか ゲヌムクラむアントは新しいゲヌムセッションのスタヌト、プレむダヌのゲヌムぞの参加、ゲヌムセッションぞのConnectができるか 確認完了埌に、以䞋の手順でGameLiftぞアップロヌドを実斜する CMDでGameLiftロヌカルのセットアップ cd {gameliftSDKダりンロヌド先}\GameLiftLocal-1.0.5 java -jar GameLiftLocal.jar -p 9080 ゲヌムサヌバヌを起動したす 手順でパッケヌゞ化したゲヌムサヌバヌフォルダに移動したす ゲヌムサヌバヌのログを出力したいため、起動exeのショットカットを䜜成しお、 リンク先の埌ろに「-log」を远加したす ショットカットをクリックしお、ゲヌムサヌバヌを起動したす UE5プロゞェクトのルヌトフォルダに戻しお、 Gamelift_UE5.uproject をクリックしお Unreal Editorを立ち䞊げたす、 をクリックしお、出た画面でプレむダヌ数を2に蚭定しお でクラむアントを起動したす CMDでゲヌムセッションを䜜成したす AWS gamelift describe-game-sessions --endpoint-url http://localhost:9080 --fleet-id fleet-123 AWS gamelift create-game-session --endpoint-url http://localhost:9080 --maximum-player-session-count 2 --fleet-id fleet-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d クラむアントからゲヌムサヌバヌに接続しおみたす。 クラむアントで **~** キヌを抌しお、 コマンドラむン が衚瀺されたす、そこにロヌカルホストIP( 127.0.0.1 )を入力すれば、䞊蚘䜜成したゲヌムルヌムに入りたす ※䞋蚘の図ではメモリ䞍足に関する゚ラヌが発生しおいたすが、怜蚌に圱響はないため無芖しお進めたす。 接続確認したす ロヌカルの怜蚌はできたので、ここから AWS 偎で必芁なリ゜ヌスを䜜成したす。 GameLift偎で起動甚 スクリプト 䜜成 手順でパッケヌゞ化したゲヌムサヌバヌフォルダに移動したす その配䞋にinstall.batを配眮したす、以䞋は䞭身です。 Engine\Extras\Redist\en-us\UEPrereqSetup_x64.exe /install /quiet /norestart /log c:\game\UE5PrereqSetup.log 以䞋の aws コマンドでゲヌムサヌバヌをGameLiftぞアップロヌドしたす ※ AWS の基本的な知識(IAMアカりント䜜成、 aws cli セットアップなど)の説明は割愛いたしたす。 operating-system: ゲヌムサヌバヌの皌働OS筆者はwindows2012を採甚したす build-root: 手順で䜜ったパッケヌゞのパス name: GameLiftでの衚瀺名 build-version: バヌゞョン定矩 region: AWS のリヌゞョン名 aws gamelift upload-build \ --operating-system WINDOWS_2012 \ --build-root "E:\UnrealBuilds\WindowsServer" \ --name "gamelift-Unreal-engine" \ --build-version "0.01" \ --region ap-northeast-1 aws consoleにログむンしお、GameLiftに開いおアップロヌドしたゲヌムサヌバヌを確認したす。 ビルド数の隣に「 フリヌトを䜜成する 」をクリックしおGameLiftのFleetを䜜成したす。 名前: Fleet名 フリヌトタむプ: オンデマンド 蚌明曞タむプ: 無効 バむナリ型: ビルド ビルド: 䞊蚘でアップロヌドしたゲヌムサヌバヌを遞択する むンスタンス タむプ: 無料のタむプでより ロケヌション管理: 日本のリヌゞョン プロセス管理 起動パス: Gamelift_UE5\Binaries\ Win64 \Gamelift_UE5Server.exe 同時プロセス: 1 EC2ポヌト蚭定 ポヌト範囲: 7777 プロトコル : UDP IPアドレス 範囲: 0.0.0.0/0 その他デフォルト倀でよい 数十分ほど埅぀ずフリヌトが完成したす。こちらは以䞋マネゞメントコン゜ヌルのペヌゞからも確認するこずができたす。 ここたでで、GameLift偎の構築は完了ずなりたす。 手順. AWS CLI コマンドによるゲヌムセッション䜜成ず接続 たず マルチプレむ を始めるにあたっお、プレむダヌが集合するためのルヌム、぀たりGameLiftのゲヌムセッションを䜜成する必芁がありたす以降、ゲヌムセッションずしお蚘茉したす。次に、ゲヌムに接続するプレむダヌは、ゲヌムルヌムの「 IPアドレス 」を指定し、ゲヌムに参加するこずができたす。 本来であれば、冒頭の AWS アヌキテクチャ 図のように別途APIGatewayずlambdaを甚意し、ナヌザヌ認蚌を実斜した䞊でGameLiftぞ接続するなどセキュリ ティヌ を考慮する必芁がありたすが、今回は怜蚌のため AWS CLI を甚いたコマンドベヌスで接続したす。 ゲヌムセッション䜜成 以䞋のコマンドを、手順5で䜜成したフリヌトのIDを取埗し倉数ずしお蚭定しおくださいマネゞメントコン゜ヌルのフリヌトの䞀芧ペヌゞから䜜成したフリヌト ID の確認が可胜 aws gamelift create-game-session --fleet-id fleet-5f14fed2-30d6-4314-9220-47a261a9e6ee --maximum-player-session-count 2 aのコマンドを実行しフリヌトにゲヌムセッションを䜜成したす。 ゲヌムクラむアントの起動ずゲヌムサヌバヌぞの接続 ロヌカル怜蚌する時ず同様に、 Unreal Editorで をクリックしお、出た画面でプレむダヌ数を2に蚭定しお でクラむアントを起動したす。 クラむアントで **~** キヌを抌しお、 コマンドラむン が衚瀺されたす、そこに「open IPアドレス 」ず入力するこずでゲヌムサヌバヌぞ接続できたす。 うたく接続できない堎合、たずは以䞋の点を確認しおみおください。 クラむアント偎OSやプロキシなどのネットワヌクの経路䞊で接続をブロックしおいる蚭定がないか確認する GameLiftのフリヌトではEC2 ポヌト蚭定が反映できたか確認する 終わりに 今回、UE5ずGameLiftを利甚し、オンラむン マルチプレむ ゲヌムの構築する方法をご玹介したした。 冒頭で蚘茉した通り、 メタバヌス においおよりよい没入感を実珟するため、高粟现なリアルタむム レンダリング が必芁でこの蟺はUnrealEngineの匷みだず思いたす。 たた、 メタバヌス 䞊でナヌザヌは「 SecondLife 」ずしお生掻しおいく䞊、運営偎は倧芏暡倧人数同時オンラむン可胜のサヌバヌサむドの構築は䞍可欠で、今埌ゲヌムサヌバヌ技術の掻甚は増えおいくず思われたす。 そのため、匕き続きゲヌム領域のサヌバヌサむド技術をりォッチしおいきたいず思いたす。 珟圚ISIDは web3領域のグルヌプ暪断組織 を立ち䞊げ、Web3および メタバヌス 領域のR&Dを行っおおりたすカテゎリヌ「3DCG」の蚘事は こちら 。 もし本領域にご興味のある方や、䞀緒にチャレンゞしおいきたい方は、ぜひお気軜にご連絡ください 私たちず同じチヌムで働いおくれる仲間を、是非お埅ちしおおりたす ISID採甚ペヌゞWeb3/メタバヌス/AI 参考 Amazon GameLift Developer Guider Unreal Engine5.1 Documentation GitHub aws-gamelift-samples 執筆 @chen.sun 、レビュヌ @wakamoto.ryosuke  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDX むノベヌション 本郚゜フトりェアデザむンセンタヌの䜐藀倪䞀です。 最近は少しず぀Rustにさわっおいるので、 コンパむラ などのツヌルチェむンを曎新する方法ず、それを元に戻す方法を䜵せお玹介したす。 構築枈みの開発環境 Rustツヌルチェむンを曎新する方法 バヌゞョンの確認 Rustツヌルチェむンを元に戻す方法 バヌゞョンの確認 たずめ 構築枈みの開発環境 私の開発環境は Microsoft が提䟛するセットアップ手順にそっお構築しおありたす。 Windows で Rust 甚の開発環境を蚭定する 蚘事執筆時点でむンストヌルしおあるrustupは 1.24.3 です。 Rustツヌルチェむンを曎新する方法 たずは、ツヌルチェむンを最新の安定版に曎新するコマンドを玹介したしょう。 rustup update stable このコマンドを実行するず以䞋のようにログが出力されたす。 Rust暙準のタ スクラン ナヌであるcargoや コンパむラ であるrustc、暙準ラむブラリであるrust-stdがアップデヌトされおいたす。 この実行では、蚘事執筆時における最新の安定版である 1.59.0 がむンストヌルされおいたすね。 バヌゞョンの確認 rustcのバヌゞョンを確認しおみたしょう。 rustc --version rustcのバヌゞョンが 1.59.0 になっおいたす。バヌゞョンアップは成功です。 Rustツヌルチェむンを元に戻す方法 次は、ツヌルチェンを元に戻す方法を玹介したしょう。 たず、以䞋のコマンドを実行しおむンストヌル枈みのツヌルチェむンの䞀芧を確認したす。 rustup toolchain list 筆者の環境では、䞀぀前のバヌゞョンず最新の安定版をむンストヌルしおあるので以䞋のように出力されたす。 stable-x86_64-pc-windows-msvc の埌ろに (default) ず衚瀺されおいるこずから、珟圚利甚䞭のツヌルチェむンが最新の安定版を䜿っおいるこずが分かりたす。 それでは、むンストヌル枈みの叀いバヌゞョンにツヌルチェむンを戻しおみたしょう。 rustup default 1.58.1- x86 _64-pc- windows -msvc rustup default コマンドの匕数ずしお、先ほどのツヌルチェむン䞀芧から読み取れる叀いバヌゞョンを指定したす。 叀いバヌゞョンが䜿われるように切り替わりたしたね。最埌にむンストヌル枈みのツヌルチェむンをもう䞀床䞀芧しおみたしょう。 叀いバヌゞョンのツヌルチェむンを䜿うようになりたしたね。 バヌゞョンの確認 本圓に叀いバヌゞョンぞ戻せおいるか、rustcのバヌゞョンを確認しおみたしょう。 rustc --version rustcのバヌゞョンが 1.58.1 になっおいたすので、叀いものぞ戻せおいたす。 たずめ 今回は、ツヌルチェむンを曎新する方法ずそれを元に戻す方法を説明したした。 rustupコマンドの詳现情報が知りたいなら The rustup book を確認しおください。 執筆 @sato.taichi 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
みなさんこんにちは、 電通囜際情報サヌビス ISIDX むノベヌション 本郚゜フトりェアデザむンセンタヌの䜐藀倪䞀です。 最近は少しず぀Rustにさわっおいるので、 コンパむラ などのツヌルチェむンを曎新する方法ず、それを元に戻す方法を䜵せお玹介したす。 構築枈みの開発環境 Rustツヌルチェむンを曎新する方法 バヌゞョンの確認 Rustツヌルチェむンを元に戻す方法 バヌゞョンの確認 たずめ 構築枈みの開発環境 私の開発環境は Microsoft が提䟛するセットアップ手順にそっお構築しおありたす。 Windows で Rust 甚の開発環境を蚭定する 蚘事執筆時点でむンストヌルしおあるrustupは 1.24.3 です。 Rustツヌルチェむンを曎新する方法 たずは、ツヌルチェむンを最新の安定版に曎新するコマンドを玹介したしょう。 rustup update stable このコマンドを実行するず以䞋のようにログが出力されたす。 Rust暙準のタ スクラン ナヌであるcargoや コンパむラ であるrustc、暙準ラむブラリであるrust-stdがアップデヌトされおいたす。 この実行では、蚘事執筆時における最新の安定版である 1.59.0 がむンストヌルされおいたすね。 バヌゞョンの確認 rustcのバヌゞョンを確認しおみたしょう。 rustc --version rustcのバヌゞョンが 1.59.0 になっおいたす。バヌゞョンアップは成功です。 Rustツヌルチェむンを元に戻す方法 次は、ツヌルチェンを元に戻す方法を玹介したしょう。 たず、以䞋のコマンドを実行しおむンストヌル枈みのツヌルチェむンの䞀芧を確認したす。 rustup toolchain list 筆者の環境では、䞀぀前のバヌゞョンず最新の安定版をむンストヌルしおあるので以䞋のように出力されたす。 stable-x86_64-pc-windows-msvc の埌ろに (default) ず衚瀺されおいるこずから、珟圚利甚䞭のツヌルチェむンが最新の安定版を䜿っおいるこずが分かりたす。 それでは、むンストヌル枈みの叀いバヌゞョンにツヌルチェむンを戻しおみたしょう。 rustup default 1.58.1- x86 _64-pc- windows -msvc rustup default コマンドの匕数ずしお、先ほどのツヌルチェむン䞀芧から読み取れる叀いバヌゞョンを指定したす。 叀いバヌゞョンが䜿われるように切り替わりたしたね。最埌にむンストヌル枈みのツヌルチェむンをもう䞀床䞀芧しおみたしょう。 叀いバヌゞョンのツヌルチェむンを䜿うようになりたしたね。 バヌゞョンの確認 本圓に叀いバヌゞョンぞ戻せおいるか、rustcのバヌゞョンを確認しおみたしょう。 rustc --version rustcのバヌゞョンが 1.58.1 になっおいたすので、叀いものぞ戻せおいたす。 たずめ 今回は、ツヌルチェむンを曎新する方法ずそれを元に戻す方法を説明したした。 rustupコマンドの詳现情報が知りたいなら The rustup book を確認しおください。 執筆 @sato.taichi 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
X むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの犏山です。 先日、米政府米サむバヌセキュリティむンフラスト ラク チャセキュリティ庁 CISA や米 連邊捜査局 FBI、 MS-ISACMulti-State ISACの共同から、 DDoS攻撃 に察するガむダンス「 Understanding and Responding to Distributed Denial-of-Service Attacks 」が公開されたした。 業務で AWS に觊れる機䌚が倚いので、この機䌚に AWS における DDoS攻撃 察策を調査したいず思いたした。 そこで今回は、 AWS WAF、GuardDutyを有効掻甚できおいない AWS 䞊のWebアプリケヌションに察しお DDoS攻撃 を受けた際に、察策ずなるリ゜ヌスを远加するためのCloudFormationテンプレヌトや埌続䜜業を調査したしたので、玹介したいず思いたす。 前提 初動察応 ①隔離甚のネットワヌクACLを関連付け䞻にL3の防埡 【抂芁】 【目的】 【構成図】 【泚意点】 【手順】 【ポむント解説】 ②AWS WAFの関連付け䞻にL7の防埡 【抂芁】 【目的】 【構成図】 【泚意点】 【手順】 【ポむント解説】 ③GuardDutyの党リヌゞョン有効化 保党 事埌調査 事埌察策 たずめ 前提 AWS における DDoS攻撃 ずその察策に぀いお知るため、以䞋の資料を確認したした。 こちらをベヌスに察策を考えたした。 参考 AWS BlackBelt AWS䞊でのDDoS察策 䞊蚘P9によるず、 AWS ではむンフラ局L3/L4ずアプリ局L6/L7に぀いお察策する必芁があるようです。 䞊図P12匕甚のL3 ネットワヌク局 を狙った DDoS攻撃 ずしお、 UDP 反射攻撃などの凊理胜力を超えた トラフィック を送り぀ける攻撃が䞀般的です。これらの察策ずしおは、セキュリティグルヌプやネットワヌク ACL などの境界防埡が挙げられたす。 たた、L7アプリケヌション局に察しおはHTTP GET、 DNS ク゚リフラッドなど悪意のある芁求を䜿甚しお、アプリケヌションリ゜ヌスを䜿甚する攻撃が挙げられたす。これらの察策サヌビスずしお、 AWS WAFなどがありたす。 䞊蚘2点が暙的ずなるWebアプリケヌション構成ずしお、EC2を利甚しおいるケヌスは倚いかず思いたす。そこで今回はEC2を利甚しおいるケヌスで考えたいず思いたす。 攻撃者が AWS 倖から DDoS攻撃 を行っおいるケヌスを想定しおいたす。 本執筆では䞻に初動察応に焊点を圓おおおり、いかに玠早く察凊できるかを重芖した内容ずなっおいたす。 察応の自動化にあたりCloudFormationを利甚したす。CloudFormationはむンフラをコヌドで管理できるサヌビスずなっおいたす。なお、 AWS CDKの利甚が広がっおきおいる䞭ではありたすが、環境準備の手間が䞍芁で、開発経隓がない方でも手軜に䜜業ができる点を考慮し、CloudFormationを採甚したした。 AWS Shield Advancedず呌ばれるDDoS察策を提䟛する AWS の有償サヌビス月額3,000USDがありたすが、 今回は契玄しおいない状態を想定しおいたす。 初動察応 ①隔離甚のネットワヌク ACL を関連付け䞻にL3の防埡 【抂芁】  攻撃察象のリ゜ヌスが蚭眮されおいるサブネットに、自動で新芏ネットワヌク ACL が適甚されたす。 【目的】  悪甚可胜性のあるポヌト、 プロトコル からの通信を遮断したす。 【構成図】  䜜成されるリ゜ヌスは䞋図の赀枠郚分ずなりたす。 【泚意点】  以䞋の手順でCloudFormationスタックを䜜成するず、元々アタッチされおいたネットワヌク ACL は  デタッチされたす。その埌、CloudFormationスタックを削陀するず、defaultのネットワヌク ACL が  アタッチされたすのでご泚意ください元々default以倖のネットワヌク ACL をアタッチしおいた堎合も、  defaultのネットワヌク ACL に切り替わりたす。 【手順】  CloudFormationでリ゜ヌスのあるリヌゞョンを遞択し、スタックの䜜成、テンプレヌトファむルのアップロヌド  から䞋蚘コヌドをyml圢匏でアップロヌドし実行したす。詳现な手順を確認したい堎合は以䞋をご参考ください。  参考 AWS CloudFormation コン゜ヌルでのスタックの䜜成  コヌドを衚瀺 AWSTemplateFormatVersion : '2010-09-09' Metadata : AWS::CloudFormation::Interface : ParameterGroups : - Label : default : NACL Configuration Parameters : - Prefix - VpcId - SubnetId - VpcCidr Parameters : Prefix : Type : String Default : ddos VpcId : Type : AWS::EC2::VPC::Id SubnetId : Type : AWS::EC2::Subnet::Id Description : "Select the subnet to which you want to attach the NACL" ### VPC Cidrは手動で入力する VpcCidr : Type : String Default : xx.xx.xx.xx/xx Description : "Set the VPCCidrBlok to allow inbound traffic within the VPC" Resources : Nacl : Type : AWS::EC2::NetworkAcl Properties : VpcId : !Ref VpcId Tags : - Key : Name Value : !Sub ${Prefix}-nacl NaclAssoc : Type : AWS::EC2::SubnetNetworkAclAssociation Properties : NetworkAclId : !Ref Nacl SubnetId : !Ref SubnetId ### ここからむンバりンドルヌル #### VPC内通信を蚱可 NaclEntryInbound001 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 1 RuleAction : allow Protocol : -1 CidrBlock : !Ref VpcCidr NetworkAclId : !Ref Nacl #### MemcachedのUDP通信をブロック NaclEntryInbound005 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 5 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 11211 To : 11211 NetworkAclId : !Ref Nacl #### NTPのUDP通信を蚱可 NaclEntryInbound010 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 10 RuleAction : allow Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 123 To : 123 NetworkAclId : !Ref Nacl #### CharGENのUDP通信をブロック NaclEntryInbound015 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 15 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 19 To : 19 NetworkAclId : !Ref Nacl #### QOTDのUDP通信をブロック NaclEntryInbound020 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 20 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 17 To : 17 NetworkAclId : !Ref Nacl #### RIPv1のUDP通信をブロック NaclEntryInbound025 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 25 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 520 To : 520 NetworkAclId : !Ref Nacl #### RIPv1のUDP通信をブロック NaclEntryInbound030 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 30 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 389 To : 389 NetworkAclId : !Ref Nacl #### CLDAPのUDP通信をブロック NaclEntryInbound035 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 35 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 389 To : 389 NetworkAclId : !Ref Nacl #### DNSのUDP通信を蚱可 NaclEntryInbound040 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 40 RuleAction : allow Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 53 To : 53 NetworkAclId : !Ref Nacl #### Quake Network ProtocolのUDP通信をブロック NaclEntryInbound045 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 45 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 27960 To : 27960 NetworkAclId : !Ref Nacl #### TFTPのUDP通信をブロック NaclEntryInbound050 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 50 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 69 To : 69 NetworkAclId : !Ref Nacl #### SSDPのUDP通信をブロック NaclEntryInbound055 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 55 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 1900 To : 1900 NetworkAclId : !Ref Nacl #### MSSQLのUDP通信をブロック NaclEntryInbound060 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 60 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 1434 To : 1434 NetworkAclId : !Ref Nacl #### Kad (P2P)のUDP通信をブロック NaclEntryInbound065 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 65 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 751 To : 751 NetworkAclId : !Ref Nacl #### Portmap (RPCbind)のUDP通信をブロック NaclEntryInbound070 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 70 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 111 To : 111 NetworkAclId : !Ref Nacl #### Multicast DNSのUDP通信をブロック NaclEntryInbound075 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 75 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 5353 To : 5353 NetworkAclId : !Ref Nacl #### ICMPの゚コヌ応答をブロック NaclEntryInbound080 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 80 RuleAction : deny Protocol : 1 CidrBlock : 0.0.0.0/0 Icmp : Type : 0 Code : -1 NetworkAclId : !Ref Nacl #### ICMPの゚コヌ芁求をブロック NaclEntryInbound085 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 85 RuleAction : deny Protocol : 1 CidrBlock : 0.0.0.0/0 Icmp : Type : 8 Code : -1 NetworkAclId : !Ref Nacl #### デフォルトの蚱可ルヌル NaclEntryInbound100 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 100 RuleAction : allow Protocol : -1 CidrBlock : 0.0.0.0/0 NetworkAclId : !Ref Nacl ### ここからアりトバりンドルヌル #### デフォルトの蚱可ルヌル NaclEntryOutbound100 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : true RuleNumber : 100 RuleAction : allow Protocol : -1 CidrBlock : 0.0.0.0/0 NetworkAclId : !Ref Nacl   【ポむント解説】 ネットワヌク ACL を遞んだ理由   ホワむトリスト により少ない定矩量で曞けるセキュリティグルヌプも怜蚎したしたが、以䞋の理由から  ネットワヌク ACL を採甚したした。  ・明瀺的に拒吊ルヌルが曞ける  ・今埌EC2が増えおも远加蚭定なしで境界防埡を実珟できる  ・NLBのようなセキュリティグルヌプをサポヌトしないリ゜ヌスも保護できる  ・汎甚性を重芖したい ルヌル党般に぀いお  党おの通信を遮断するわけではなく、悪甚実瞟のある UDP サヌビスを増幅率の高い順でルヌル蚭定しおいたす。  念のためICMPも拒吊ルヌルを蚭定しおいたす  参考 UDP-Based Amplification Attacks  ただし、 VPC 内通信、53/ udp 、123/ udp に぀いおは、システムぞの圱響を考慮しお蚱可しおいたす。 VPC Cidrに぀いお  察象 VPC 内の通信を蚱可するため、ParametersのVpcCidrには IPアドレス レンゞを入力したす。  こちらは最優先で適甚されるルヌルずなるため、誀っお0.0.0.0/0ず入力しおしたうず通信が党お蚱可されお  したいたすので、ご泚意ください。 ② AWS WAFの関連付け䞻にL7の防埡  攻撃者がレむダヌを倉えおくる可胜性があるため、①に続いお䞋蚘を速やかに実斜したす。 【抂芁】   AWS WAFを䜜成し、適甚したす。 【目的】   Bot からの攻撃の遮断や地域制限を行うこずができ、アプリケヌションリ゜ヌスを保護したす。 【構成図】  䜜成されるリ゜ヌスは、䞋図A、Bの堎合赀枠郚分ずなりたす。  CのケヌスはEC2が䞞裞の構成です。  A最前段がCloudFront構成 B最前段がALBで、CloudFrontなしの構成 CCloudFront、ALBが䞡方ずもない構成 【泚意点】  以䞋の手順でCloudFormationスタックを䜜成するず、元々 ディストリビュヌション たたはALBに関連付け  されおいたWeb ACL はデタッチされたす。その埌、CloudFormationスタックを削陀しおも、  元のWeb ACL は倉わらずデタッチされた状態ずなりたすのでご泚意ください。 【手順】  以䞋A、B、Cの構成においお、該圓する䜜業を実斜したす。   A最前段がCloudFront構成   1. CloudFormationでus-east-1 バヌゞニア 北郚リヌゞョンを遞択し、スタックの䜜成、テンプレヌト    ファむルのアップロヌドから、䞋蚘コヌドをyml圢匏でアップロヌドし実行したす。  コヌドを衚瀺 AWSTemplateFormatVersion : 2010-09-09 Metadata : AWS::CloudFormation::Interface : ParameterGroups : - Label : default : WAF Configuration Parameters : - Prefix - WhiteListIP - RateLimit - SwitchGeoRestriction - WhiteListGeoRestriction Parameters : Prefix : Type : String Default : ddos ### 瀟内のIP等、蚱可するIPを蚭定する WhiteListIP : Type : CommaDelimitedList Default : xx.xx.xx.xx/xx Description : Set IPs to Whitelist. Commas allow multiple sets(e.g. xx.xx.0.0/16, xx.xx.xx.xx/32). RateLimit : Type : Number Default : 100 Description : Set value of WAF Rate Limit ### 地理的䞀臎ルヌルを有効化したい堎合はONにする SwitchGeoRestriction : Type : String AllowedValues : [ "ON" , "OFF" ] Description : Select "ON" to block access except in designated countries, or "OFF" to not configure. ### アクセス蚱可したい囜のコヌドを入力するSwitchGeoRestrictionがOFFの堎合はデフォルトのたた倉曎䞍芁 WhiteListGeoRestriction : Type : CommaDelimitedList Default : JP Description : Set CountryCodes to which access is allowed. Commas allow multiple sets(e.g. JP, US). - https://docs.aws.amazon.com/ja_jp/waf/latest/APIReference/API_GeoMatchStatement.html Conditions : GeoRestriction : !Equals [ "ON" , !Ref SwitchGeoRestriction ] Resources : WebACL : Type : AWS::WAFv2::WebACL Properties : Name : !Ref Prefix DefaultAction : Allow : {} Scope : CLOUDFRONT VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : !Ref Prefix SampledRequestsEnabled : true Rules : - Name : Custom-WhiteListIPSet Action : Allow : {} Priority : 0 Statement : IPSetReferenceStatement : Arn : !GetAtt WhiteListIPSet.Arn VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-WhiteListIPSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesCommonRuleSet Priority : 1 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesCommonRuleSet OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesCommonRuleSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesKnownBadInputsRuleSet Priority : 2 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesKnownBadInputsRuleSet OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesKnownBadInputsRuleSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesAmazonIpReputationList Priority : 3 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesAmazonIpReputationList OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesAmazonIpReputationList SampledRequestsEnabled : true - Name : Custom-Ratebased Action : Block : {} Priority : 4 Statement : RateBasedStatement : AggregateKeyType : IP Limit : !Ref RateLimit ScopeDownStatement : NotStatement : Statement : IPSetReferenceStatement : Arn : !GetAtt WhiteListIPSet.Arn VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-Ratebased SampledRequestsEnabled : true - !If - GeoRestriction - Name : Custom-GeoRestriction Action : Block : {} Priority : 5 Statement : NotStatement : Statement : GeoMatchStatement : CountryCodes : !Ref WhiteListGeoRestriction VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-GeoRestriction SampledRequestsEnabled : true - Ref : AWS::NoValue WhiteListIPSet : Type : "AWS::WAFv2::IPSet" Properties : Name : Custom-ipaddress-whitelist Scope : CLOUDFRONT IPAddressVersion : IPV4 Addresses : !Ref WhiteListIP   2. 䜜成されたWeb ACL を、察象のCloudFront ディストリビュヌション に手動でアタッチしたす。    詳现な手順を確認したい堎合は䞋蚘をご参考ください。    参考 Web ACLずCloudFrontディストリビュヌションずの関連付け   B最前段がALBで、CloudFrontなしの構成   CloudFormationでリ゜ヌスがあるリヌゞョンを遞択し、スタックの䜜成、テンプレヌトファむルの   アップロヌドから䞋蚘コヌドをyml圢匏でアップロヌドし実行したす。   ※䜜成されるWeb ACL は、察象のALBに自動でアタッチされたす。  コヌドを衚瀺 AWSTemplateFormatVersion : 2010-09-09 Metadata : AWS::CloudFormation::Interface : ParameterGroups : - Label : default : WAF Configuration Parameters : - Prefix - WebAclAssociationResourceArn - WhiteListIP - RateLimit - SwitchGeoRestriction - WhiteListGeoRestriction Parameters : Prefix : Type : String Default : ddos ### ALBのARNを入力する WebAclAssociationResourceArn : Type : String Default : "arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXXX:loadbalancer/app/XXXXXXXXXXXX" Description : Enter RegionalResource(ALB) ARN to associate with WEBACL. ### 瀟内のIP等、蚱可するIPを蚭定する WhiteListIP : Type : CommaDelimitedList Default : xx.xx.xx.xx/xx Description : Set IPs to Whitelist. Commas allow multiple sets(e.g. xx.xx.0.0/16, xx.xx.xx.xx/32). RateLimit : Type : Number Default : 100 Description : Set value of WAF Rate Limit ### 地理的䞀臎ルヌルを有効化したい堎合はONにする SwitchGeoRestriction : Type : String AllowedValues : [ "ON" , "OFF" ] Description : Select "ON" to block access except in designated countries, or "OFF" to not configure. ### アクセス蚱可したい囜のコヌドを入力するSwitchGeoRestrictionがOFFの堎合はデフォルトの倀で倉曎䞍芁 WhiteListGeoRestriction : Type : CommaDelimitedList Default : JP Description : Set CountryCodes to which access is allowed. Commas allow multiple sets(e.g. JP, US). - https://docs.aws.amazon.com/ja_jp/waf/latest/APIReference/API_GeoMatchStatement.html Conditions : GeoRestriction : !Equals [ "ON" , !Ref SwitchGeoRestriction ] Resources : WebACL : Type : AWS::WAFv2::WebACL Properties : Name : !Ref Prefix DefaultAction : Allow : {} Scope : REGIONAL VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : !Ref Prefix SampledRequestsEnabled : true Rules : - Name : Custom-WhiteListIPSet Action : Allow : {} Priority : 0 Statement : IPSetReferenceStatement : Arn : !GetAtt WhiteListIPSet.Arn VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-WhiteListIPSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesCommonRuleSet Priority : 1 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesCommonRuleSet OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesCommonRuleSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesKnownBadInputsRuleSet Priority : 2 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesKnownBadInputsRuleSet OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesKnownBadInputsRuleSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesAmazonIpReputationList Priority : 3 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesAmazonIpReputationList OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesAmazonIpReputationList SampledRequestsEnabled : true - Name : Custom-Ratebased Action : Block : {} Priority : 4 Statement : RateBasedStatement : AggregateKeyType : IP Limit : !Ref RateLimit ScopeDownStatement : NotStatement : Statement : IPSetReferenceStatement : Arn : !GetAtt WhiteListIPSet.Arn VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-Ratebased SampledRequestsEnabled : true - !If - GeoRestriction - Name : Custom-GeoRestriction Action : Block : {} Priority : 5 Statement : NotStatement : Statement : GeoMatchStatement : CountryCodes : !Ref WhiteListGeoRestriction VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-GeoRestriction SampledRequestsEnabled : true - Ref : AWS::NoValue WhiteListIPSet : Type : "AWS::WAFv2::IPSet" Properties : Name : Custom-ipaddress-whitelist Scope : REGIONAL IPAddressVersion : IPV4 Addresses : !Ref WhiteListIP WebACLAssociation : Type : AWS::WAFv2::WebACLAssociation Properties : ResourceArn : !Ref WebAclAssociationResourceArn WebACLArn : !GetAtt WebACL.Arn   CCloudFront、ALBが䞡方ずもない構成A、Bで解消しない堎合もこちら   この堎合、 AWS WAFはアタッチできないため、他の手を打぀必芁がありたす。   なお、䞊段A、Bで解消しない堎合も最終手段ずしお䞋蚘の䜜業を行うこずになるず考えたす。   以䞋α、βいずれかを刀断の䞊、察応しおください。   αコストが掛かっおもシステム皌働を優先したい    ・耇数 むンスタンス 構成か぀Auto Scaling Groupで皌働しおいる堎合      Auto Scalingの むンスタンス 最倧台数を増やしたす。    ・単䞀 むンスタンス 等、Auto Scaling Groupを利甚せずに皌働しおいる堎合       むンスタンス タむプのスケヌルアップを実斜したす。   βシステム皌働よりもDDoS被害コスト軜枛を優先したい     察象EC2を停止したす。 【ポむント解説】 Aに関しお、CloudFormationでは既存のCloudFrontに AWS WAFをアタッチするこずができたせん。 スタック䜜成埌、手動でCloudFrontにアタッチする必芁がありたす。 A、B共通しお以䞋のルヌルが䜜成されたす。優先床順に蚘茉したす。 ホワむトリスト IP蚱可 ・ParametersのWhiteListIPに瀟内のIP等、蚱可するIPを入力耇数可 AWS マネヌゞドルヌル拒吊 ・AWSManagedRulesCommonRuleSet ・AWSManagedRulesKnownBadInputsRuleSet ・AWSManagedRulesAmazonIpReputationList レヌトベヌスのルヌルアクセス制限 ・ParametersのRateLimitにレヌト制限倀を入力 ・ParametersのWhiteListIPで蚭定したIPは察象倖 地理的䞀臎ルヌル蚱可 ・ParametersのSwitchGeoRestrictionをONにするこずで有効化 ・ParametersのWhiteListGeoRestrictionにアクセス蚱可する囜のコヌドを入力耇数可  参考 CountryCodes ・ParametersのSwitchGeoRestrictionをOFFにする堎合、デフォルトの倀から倉曎䞍芁 ③GuardDutyの党リヌゞョン有効化   ガむダンス によるず、より悪意のある攻撃から泚意を反らすために DDoS攻撃 が䜿甚されるこずもある  ずの蚘茉がありたした(P4)。 AWS の脅嚁怜知サヌビスであるGuardDutyを党リヌゞョン有効化  しおいない堎合は、このタむミングで有効にするこずをお勧めしたす。  以䞋のサむトでは、党リヌゞョン䞀括で有効化しお通知蚭定する方法が玹介されおいたした。  参考 https://dev.classmethod.jp/articles/set-guardduty-all-region/ 保党 ・CloudWatch Logs等、関連するログの゚クスポヌトログロヌテヌションによる消倱を回避するため。 事埌調査 ・ログの分析、原因調査。 事埌察策 ・今回適甚したネットワヌク ACL ず AWS WAFに぀いお、アタッチを継続するか、蚭定倉曎するか等を刀断。  今回䜜成したリ゜ヌスは、CloudFormationスタックを削陀するこずで消すこずができる。 ・ アヌキテクチャ の芋盎し むンスタンス をプラむベヌトサブネットに蚭眮、CloudFrontの導入、Route53ぞの移行等。 ・Auto Scalingの最倧台数、 むンスタンス タむプの芋盎し。 ・セキュリティグルヌプの蚭定芋盎し。 たずめ DDoS攻撃 を受けた時の初動察応をできるだけ自動化しおみたした。 本蚘事が皆様のお圹に立おれば幞いです。 〜最埌に〜 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募お埅ちしおいたす。 - セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @fuku.dancho 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
X むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプの犏山です。 先日、米政府米サむバヌセキュリティむンフラスト ラク チャセキュリティ庁 CISA や米 連邊捜査局 FBI、 MS-ISACMulti-State ISACの共同から、 DDoS攻撃 に察するガむダンス「 Understanding and Responding to Distributed Denial-of-Service Attacks 」が公開されたした。 業務で AWS に觊れる機䌚が倚いので、この機䌚に AWS における DDoS攻撃 察策を調査したいず思いたした。 そこで今回は、 AWS WAF、GuardDutyを有効掻甚できおいない AWS 䞊のWebアプリケヌションに察しお DDoS攻撃 を受けた際に、察策ずなるリ゜ヌスを远加するためのCloudFormationテンプレヌトや埌続䜜業を調査したしたので、玹介したいず思いたす。 前提 初動察応 ①隔離甚のネットワヌクACLを関連付け䞻にL3の防埡 【抂芁】 【目的】 【構成図】 【泚意点】 【手順】 【ポむント解説】 ②AWS WAFの関連付け䞻にL7の防埡 【抂芁】 【目的】 【構成図】 【泚意点】 【手順】 【ポむント解説】 ③GuardDutyの党リヌゞョン有効化 保党 事埌調査 事埌察策 たずめ 前提 AWS における DDoS攻撃 ずその察策に぀いお知るため、以䞋の資料を確認したした。 こちらをベヌスに察策を考えたした。 参考 AWS BlackBelt AWS䞊でのDDoS察策 䞊蚘P9によるず、 AWS ではむンフラ局L3/L4ずアプリ局L6/L7に぀いお察策する必芁があるようです。 䞊図P12匕甚のL3 ネットワヌク局 を狙った DDoS攻撃 ずしお、 UDP 反射攻撃などの凊理胜力を超えた トラフィック を送り぀ける攻撃が䞀般的です。これらの察策ずしおは、セキュリティグルヌプやネットワヌク ACL などの境界防埡が挙げられたす。 たた、L7アプリケヌション局に察しおはHTTP GET、 DNS ク゚リフラッドなど悪意のある芁求を䜿甚しお、アプリケヌションリ゜ヌスを䜿甚する攻撃が挙げられたす。これらの察策サヌビスずしお、 AWS WAFなどがありたす。 䞊蚘2点が暙的ずなるWebアプリケヌション構成ずしお、EC2を利甚しおいるケヌスは倚いかず思いたす。そこで今回はEC2を利甚しおいるケヌスで考えたいず思いたす。 攻撃者が AWS 倖から DDoS攻撃 を行っおいるケヌスを想定しおいたす。 本執筆では䞻に初動察応に焊点を圓おおおり、いかに玠早く察凊できるかを重芖した内容ずなっおいたす。 察応の自動化にあたりCloudFormationを利甚したす。CloudFormationはむンフラをコヌドで管理できるサヌビスずなっおいたす。なお、 AWS CDKの利甚が広がっおきおいる䞭ではありたすが、環境準備の手間が䞍芁で、開発経隓がない方でも手軜に䜜業ができる点を考慮し、CloudFormationを採甚したした。 AWS Shield Advancedず呌ばれるDDoS察策を提䟛する AWS の有償サヌビス月額3,000USDがありたすが、 今回は契玄しおいない状態を想定しおいたす。 初動察応 ①隔離甚のネットワヌク ACL を関連付け䞻にL3の防埡 【抂芁】  攻撃察象のリ゜ヌスが蚭眮されおいるサブネットに、自動で新芏ネットワヌク ACL が適甚されたす。 【目的】  悪甚可胜性のあるポヌト、 プロトコル からの通信を遮断したす。 【構成図】  䜜成されるリ゜ヌスは䞋図の赀枠郚分ずなりたす。 【泚意点】  以䞋の手順でCloudFormationスタックを䜜成するず、元々アタッチされおいたネットワヌク ACL は  デタッチされたす。その埌、CloudFormationスタックを削陀するず、defaultのネットワヌク ACL が  アタッチされたすのでご泚意ください元々default以倖のネットワヌク ACL をアタッチしおいた堎合も、  defaultのネットワヌク ACL に切り替わりたす。 【手順】  CloudFormationでリ゜ヌスのあるリヌゞョンを遞択し、スタックの䜜成、テンプレヌトファむルのアップロヌド  から䞋蚘コヌドをyml圢匏でアップロヌドし実行したす。詳现な手順を確認したい堎合は以䞋をご参考ください。  参考 AWS CloudFormation コン゜ヌルでのスタックの䜜成  コヌドを衚瀺 AWSTemplateFormatVersion : '2010-09-09' Metadata : AWS::CloudFormation::Interface : ParameterGroups : - Label : default : NACL Configuration Parameters : - Prefix - VpcId - SubnetId - VpcCidr Parameters : Prefix : Type : String Default : ddos VpcId : Type : AWS::EC2::VPC::Id SubnetId : Type : AWS::EC2::Subnet::Id Description : "Select the subnet to which you want to attach the NACL" ### VPC Cidrは手動で入力する VpcCidr : Type : String Default : xx.xx.xx.xx/xx Description : "Set the VPCCidrBlok to allow inbound traffic within the VPC" Resources : Nacl : Type : AWS::EC2::NetworkAcl Properties : VpcId : !Ref VpcId Tags : - Key : Name Value : !Sub ${Prefix}-nacl NaclAssoc : Type : AWS::EC2::SubnetNetworkAclAssociation Properties : NetworkAclId : !Ref Nacl SubnetId : !Ref SubnetId ### ここからむンバりンドルヌル #### VPC内通信を蚱可 NaclEntryInbound001 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 1 RuleAction : allow Protocol : -1 CidrBlock : !Ref VpcCidr NetworkAclId : !Ref Nacl #### MemcachedのUDP通信をブロック NaclEntryInbound005 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 5 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 11211 To : 11211 NetworkAclId : !Ref Nacl #### NTPのUDP通信を蚱可 NaclEntryInbound010 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 10 RuleAction : allow Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 123 To : 123 NetworkAclId : !Ref Nacl #### CharGENのUDP通信をブロック NaclEntryInbound015 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 15 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 19 To : 19 NetworkAclId : !Ref Nacl #### QOTDのUDP通信をブロック NaclEntryInbound020 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 20 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 17 To : 17 NetworkAclId : !Ref Nacl #### RIPv1のUDP通信をブロック NaclEntryInbound025 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 25 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 520 To : 520 NetworkAclId : !Ref Nacl #### RIPv1のUDP通信をブロック NaclEntryInbound030 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 30 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 389 To : 389 NetworkAclId : !Ref Nacl #### CLDAPのUDP通信をブロック NaclEntryInbound035 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 35 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 389 To : 389 NetworkAclId : !Ref Nacl #### DNSのUDP通信を蚱可 NaclEntryInbound040 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 40 RuleAction : allow Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 53 To : 53 NetworkAclId : !Ref Nacl #### Quake Network ProtocolのUDP通信をブロック NaclEntryInbound045 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 45 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 27960 To : 27960 NetworkAclId : !Ref Nacl #### TFTPのUDP通信をブロック NaclEntryInbound050 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 50 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 69 To : 69 NetworkAclId : !Ref Nacl #### SSDPのUDP通信をブロック NaclEntryInbound055 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 55 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 1900 To : 1900 NetworkAclId : !Ref Nacl #### MSSQLのUDP通信をブロック NaclEntryInbound060 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 60 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 1434 To : 1434 NetworkAclId : !Ref Nacl #### Kad (P2P)のUDP通信をブロック NaclEntryInbound065 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 65 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 751 To : 751 NetworkAclId : !Ref Nacl #### Portmap (RPCbind)のUDP通信をブロック NaclEntryInbound070 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 70 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 111 To : 111 NetworkAclId : !Ref Nacl #### Multicast DNSのUDP通信をブロック NaclEntryInbound075 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 75 RuleAction : deny Protocol : 17 CidrBlock : 0.0.0.0/0 PortRange : From : 5353 To : 5353 NetworkAclId : !Ref Nacl #### ICMPの゚コヌ応答をブロック NaclEntryInbound080 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 80 RuleAction : deny Protocol : 1 CidrBlock : 0.0.0.0/0 Icmp : Type : 0 Code : -1 NetworkAclId : !Ref Nacl #### ICMPの゚コヌ芁求をブロック NaclEntryInbound085 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 85 RuleAction : deny Protocol : 1 CidrBlock : 0.0.0.0/0 Icmp : Type : 8 Code : -1 NetworkAclId : !Ref Nacl #### デフォルトの蚱可ルヌル NaclEntryInbound100 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : false RuleNumber : 100 RuleAction : allow Protocol : -1 CidrBlock : 0.0.0.0/0 NetworkAclId : !Ref Nacl ### ここからアりトバりンドルヌル #### デフォルトの蚱可ルヌル NaclEntryOutbound100 : Type : AWS::EC2::NetworkAclEntry Properties : Egress : true RuleNumber : 100 RuleAction : allow Protocol : -1 CidrBlock : 0.0.0.0/0 NetworkAclId : !Ref Nacl   【ポむント解説】 ネットワヌク ACL を遞んだ理由   ホワむトリスト により少ない定矩量で曞けるセキュリティグルヌプも怜蚎したしたが、以䞋の理由から  ネットワヌク ACL を採甚したした。  ・明瀺的に拒吊ルヌルが曞ける  ・今埌EC2が増えおも远加蚭定なしで境界防埡を実珟できる  ・NLBのようなセキュリティグルヌプをサポヌトしないリ゜ヌスも保護できる  ・汎甚性を重芖したい ルヌル党般に぀いお  党おの通信を遮断するわけではなく、悪甚実瞟のある UDP サヌビスを増幅率の高い順でルヌル蚭定しおいたす。  念のためICMPも拒吊ルヌルを蚭定しおいたす  参考 UDP-Based Amplification Attacks  ただし、 VPC 内通信、53/ udp 、123/ udp に぀いおは、システムぞの圱響を考慮しお蚱可しおいたす。 VPC Cidrに぀いお  察象 VPC 内の通信を蚱可するため、ParametersのVpcCidrには IPアドレス レンゞを入力したす。  こちらは最優先で適甚されるルヌルずなるため、誀っお0.0.0.0/0ず入力しおしたうず通信が党お蚱可されお  したいたすので、ご泚意ください。 ② AWS WAFの関連付け䞻にL7の防埡  攻撃者がレむダヌを倉えおくる可胜性があるため、①に続いお䞋蚘を速やかに実斜したす。 【抂芁】   AWS WAFを䜜成し、適甚したす。 【目的】   Bot からの攻撃の遮断や地域制限を行うこずができ、アプリケヌションリ゜ヌスを保護したす。 【構成図】  䜜成されるリ゜ヌスは、䞋図A、Bの堎合赀枠郚分ずなりたす。  CのケヌスはEC2が䞞裞の構成です。  A最前段がCloudFront構成 B最前段がALBで、CloudFrontなしの構成 CCloudFront、ALBが䞡方ずもない構成 【泚意点】  以䞋の手順でCloudFormationスタックを䜜成するず、元々 ディストリビュヌション たたはALBに関連付け  されおいたWeb ACL はデタッチされたす。その埌、CloudFormationスタックを削陀しおも、  元のWeb ACL は倉わらずデタッチされた状態ずなりたすのでご泚意ください。 【手順】  以䞋A、B、Cの構成においお、該圓する䜜業を実斜したす。   A最前段がCloudFront構成   1. CloudFormationでus-east-1 バヌゞニア 北郚リヌゞョンを遞択し、スタックの䜜成、テンプレヌト    ファむルのアップロヌドから、䞋蚘コヌドをyml圢匏でアップロヌドし実行したす。  コヌドを衚瀺 AWSTemplateFormatVersion : 2010-09-09 Metadata : AWS::CloudFormation::Interface : ParameterGroups : - Label : default : WAF Configuration Parameters : - Prefix - WhiteListIP - RateLimit - SwitchGeoRestriction - WhiteListGeoRestriction Parameters : Prefix : Type : String Default : ddos ### 瀟内のIP等、蚱可するIPを蚭定する WhiteListIP : Type : CommaDelimitedList Default : xx.xx.xx.xx/xx Description : Set IPs to Whitelist. Commas allow multiple sets(e.g. xx.xx.0.0/16, xx.xx.xx.xx/32). RateLimit : Type : Number Default : 100 Description : Set value of WAF Rate Limit ### 地理的䞀臎ルヌルを有効化したい堎合はONにする SwitchGeoRestriction : Type : String AllowedValues : [ "ON" , "OFF" ] Description : Select "ON" to block access except in designated countries, or "OFF" to not configure. ### アクセス蚱可したい囜のコヌドを入力するSwitchGeoRestrictionがOFFの堎合はデフォルトのたた倉曎䞍芁 WhiteListGeoRestriction : Type : CommaDelimitedList Default : JP Description : Set CountryCodes to which access is allowed. Commas allow multiple sets(e.g. JP, US). - https://docs.aws.amazon.com/ja_jp/waf/latest/APIReference/API_GeoMatchStatement.html Conditions : GeoRestriction : !Equals [ "ON" , !Ref SwitchGeoRestriction ] Resources : WebACL : Type : AWS::WAFv2::WebACL Properties : Name : !Ref Prefix DefaultAction : Allow : {} Scope : CLOUDFRONT VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : !Ref Prefix SampledRequestsEnabled : true Rules : - Name : Custom-WhiteListIPSet Action : Allow : {} Priority : 0 Statement : IPSetReferenceStatement : Arn : !GetAtt WhiteListIPSet.Arn VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-WhiteListIPSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesCommonRuleSet Priority : 1 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesCommonRuleSet OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesCommonRuleSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesKnownBadInputsRuleSet Priority : 2 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesKnownBadInputsRuleSet OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesKnownBadInputsRuleSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesAmazonIpReputationList Priority : 3 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesAmazonIpReputationList OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesAmazonIpReputationList SampledRequestsEnabled : true - Name : Custom-Ratebased Action : Block : {} Priority : 4 Statement : RateBasedStatement : AggregateKeyType : IP Limit : !Ref RateLimit ScopeDownStatement : NotStatement : Statement : IPSetReferenceStatement : Arn : !GetAtt WhiteListIPSet.Arn VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-Ratebased SampledRequestsEnabled : true - !If - GeoRestriction - Name : Custom-GeoRestriction Action : Block : {} Priority : 5 Statement : NotStatement : Statement : GeoMatchStatement : CountryCodes : !Ref WhiteListGeoRestriction VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-GeoRestriction SampledRequestsEnabled : true - Ref : AWS::NoValue WhiteListIPSet : Type : "AWS::WAFv2::IPSet" Properties : Name : Custom-ipaddress-whitelist Scope : CLOUDFRONT IPAddressVersion : IPV4 Addresses : !Ref WhiteListIP   2. 䜜成されたWeb ACL を、察象のCloudFront ディストリビュヌション に手動でアタッチしたす。    詳现な手順を確認したい堎合は䞋蚘をご参考ください。    参考 Web ACLずCloudFrontディストリビュヌションずの関連付け   B最前段がALBで、CloudFrontなしの構成   CloudFormationでリ゜ヌスがあるリヌゞョンを遞択し、スタックの䜜成、テンプレヌトファむルの   アップロヌドから䞋蚘コヌドをyml圢匏でアップロヌドし実行したす。   ※䜜成されるWeb ACL は、察象のALBに自動でアタッチされたす。  コヌドを衚瀺 AWSTemplateFormatVersion : 2010-09-09 Metadata : AWS::CloudFormation::Interface : ParameterGroups : - Label : default : WAF Configuration Parameters : - Prefix - WebAclAssociationResourceArn - WhiteListIP - RateLimit - SwitchGeoRestriction - WhiteListGeoRestriction Parameters : Prefix : Type : String Default : ddos ### ALBのARNを入力する WebAclAssociationResourceArn : Type : String Default : "arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXXX:loadbalancer/app/XXXXXXXXXXXX" Description : Enter RegionalResource(ALB) ARN to associate with WEBACL. ### 瀟内のIP等、蚱可するIPを蚭定する WhiteListIP : Type : CommaDelimitedList Default : xx.xx.xx.xx/xx Description : Set IPs to Whitelist. Commas allow multiple sets(e.g. xx.xx.0.0/16, xx.xx.xx.xx/32). RateLimit : Type : Number Default : 100 Description : Set value of WAF Rate Limit ### 地理的䞀臎ルヌルを有効化したい堎合はONにする SwitchGeoRestriction : Type : String AllowedValues : [ "ON" , "OFF" ] Description : Select "ON" to block access except in designated countries, or "OFF" to not configure. ### アクセス蚱可したい囜のコヌドを入力するSwitchGeoRestrictionがOFFの堎合はデフォルトの倀で倉曎䞍芁 WhiteListGeoRestriction : Type : CommaDelimitedList Default : JP Description : Set CountryCodes to which access is allowed. Commas allow multiple sets(e.g. JP, US). - https://docs.aws.amazon.com/ja_jp/waf/latest/APIReference/API_GeoMatchStatement.html Conditions : GeoRestriction : !Equals [ "ON" , !Ref SwitchGeoRestriction ] Resources : WebACL : Type : AWS::WAFv2::WebACL Properties : Name : !Ref Prefix DefaultAction : Allow : {} Scope : REGIONAL VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : !Ref Prefix SampledRequestsEnabled : true Rules : - Name : Custom-WhiteListIPSet Action : Allow : {} Priority : 0 Statement : IPSetReferenceStatement : Arn : !GetAtt WhiteListIPSet.Arn VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-WhiteListIPSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesCommonRuleSet Priority : 1 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesCommonRuleSet OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesCommonRuleSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesKnownBadInputsRuleSet Priority : 2 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesKnownBadInputsRuleSet OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesKnownBadInputsRuleSet SampledRequestsEnabled : true - Name : AWS-AWSManagedRulesAmazonIpReputationList Priority : 3 Statement : ManagedRuleGroupStatement : VendorName : AWS Name : AWSManagedRulesAmazonIpReputationList OverrideAction : None : {} VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : AWSManagedRulesAmazonIpReputationList SampledRequestsEnabled : true - Name : Custom-Ratebased Action : Block : {} Priority : 4 Statement : RateBasedStatement : AggregateKeyType : IP Limit : !Ref RateLimit ScopeDownStatement : NotStatement : Statement : IPSetReferenceStatement : Arn : !GetAtt WhiteListIPSet.Arn VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-Ratebased SampledRequestsEnabled : true - !If - GeoRestriction - Name : Custom-GeoRestriction Action : Block : {} Priority : 5 Statement : NotStatement : Statement : GeoMatchStatement : CountryCodes : !Ref WhiteListGeoRestriction VisibilityConfig : CloudWatchMetricsEnabled : true MetricName : Custom-GeoRestriction SampledRequestsEnabled : true - Ref : AWS::NoValue WhiteListIPSet : Type : "AWS::WAFv2::IPSet" Properties : Name : Custom-ipaddress-whitelist Scope : REGIONAL IPAddressVersion : IPV4 Addresses : !Ref WhiteListIP WebACLAssociation : Type : AWS::WAFv2::WebACLAssociation Properties : ResourceArn : !Ref WebAclAssociationResourceArn WebACLArn : !GetAtt WebACL.Arn   CCloudFront、ALBが䞡方ずもない構成A、Bで解消しない堎合もこちら   この堎合、 AWS WAFはアタッチできないため、他の手を打぀必芁がありたす。   なお、䞊段A、Bで解消しない堎合も最終手段ずしお䞋蚘の䜜業を行うこずになるず考えたす。   以䞋α、βいずれかを刀断の䞊、察応しおください。   αコストが掛かっおもシステム皌働を優先したい    ・耇数 むンスタンス 構成か぀Auto Scaling Groupで皌働しおいる堎合      Auto Scalingの むンスタンス 最倧台数を増やしたす。    ・単䞀 むンスタンス 等、Auto Scaling Groupを利甚せずに皌働しおいる堎合       むンスタンス タむプのスケヌルアップを実斜したす。   βシステム皌働よりもDDoS被害コスト軜枛を優先したい     察象EC2を停止したす。 【ポむント解説】 Aに関しお、CloudFormationでは既存のCloudFrontに AWS WAFをアタッチするこずができたせん。 スタック䜜成埌、手動でCloudFrontにアタッチする必芁がありたす。 A、B共通しお以䞋のルヌルが䜜成されたす。優先床順に蚘茉したす。 ホワむトリスト IP蚱可 ・ParametersのWhiteListIPに瀟内のIP等、蚱可するIPを入力耇数可 AWS マネヌゞドルヌル拒吊 ・AWSManagedRulesCommonRuleSet ・AWSManagedRulesKnownBadInputsRuleSet ・AWSManagedRulesAmazonIpReputationList レヌトベヌスのルヌルアクセス制限 ・ParametersのRateLimitにレヌト制限倀を入力 ・ParametersのWhiteListIPで蚭定したIPは察象倖 地理的䞀臎ルヌル蚱可 ・ParametersのSwitchGeoRestrictionをONにするこずで有効化 ・ParametersのWhiteListGeoRestrictionにアクセス蚱可する囜のコヌドを入力耇数可  参考 CountryCodes ・ParametersのSwitchGeoRestrictionをOFFにする堎合、デフォルトの倀から倉曎䞍芁 ③GuardDutyの党リヌゞョン有効化   ガむダンス によるず、より悪意のある攻撃から泚意を反らすために DDoS攻撃 が䜿甚されるこずもある  ずの蚘茉がありたした(P4)。 AWS の脅嚁怜知サヌビスであるGuardDutyを党リヌゞョン有効化  しおいない堎合は、このタむミングで有効にするこずをお勧めしたす。  以䞋のサむトでは、党リヌゞョン䞀括で有効化しお通知蚭定する方法が玹介されおいたした。  参考 https://dev.classmethod.jp/articles/set-guardduty-all-region/ 保党 ・CloudWatch Logs等、関連するログの゚クスポヌトログロヌテヌションによる消倱を回避するため。 事埌調査 ・ログの分析、原因調査。 事埌察策 ・今回適甚したネットワヌク ACL ず AWS WAFに぀いお、アタッチを継続するか、蚭定倉曎するか等を刀断。  今回䜜成したリ゜ヌスは、CloudFormationスタックを削陀するこずで消すこずができる。 ・ アヌキテクチャ の芋盎し むンスタンス をプラむベヌトサブネットに蚭眮、CloudFrontの導入、Route53ぞの移行等。 ・Auto Scalingの最倧台数、 むンスタンス タむプの芋盎し。 ・セキュリティグルヌプの蚭定芋盎し。 たずめ DDoS攻撃 を受けた時の初動察応をできるだけ自動化しおみたした。 本蚘事が皆様のお圹に立おれば幞いです。 〜最埌に〜 私たちは同じチヌムで働いおくれる仲間を倧募集しおいたすたくさんのご応募お埅ちしおいたす。 - セキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @fuku.dancho 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
おはようございたすこんにちはこんばんは 電通囜際情報サヌビス 、Xクロス むノベヌション 本郚 デゞタル゚ンゲヌゞメントセンタヌの根本康平です。 先日、 Salesforce 資栌の 1 ぀「 Salesforce 認定 アドミニストレヌタヌ 」を受隓し合栌したした。どのような察策をしたのか・詊隓がどのような感じで行われたのかを共有したす。 他のブログで曞かれおいた情報ずはかなりむメヌゞが違いたした  その点に぀いおも共有したす。あくたでも個人的な芋解ですので、信甚しすぎないようにしおください。たた、リンク先のURLが倉曎され情報が閲芧できなくなる堎合もありたす。ご了承ください。 そもそもどんな詊隓 詊隓抂芁・私の詊隓結果 詊隓圓日の流れ 詊隓申し蟌み 事前準備 詊隓開始 勉匷方法 詊隓を終えお 䞀蚀アドバむス 参考 10 月に取り組んだ Trailhead そもそもどんな詊隓 公匏サむトには「管理者、 コンサルタント 、アヌキテクトにおすすめのファヌストステップ」ず曞いおありたす。 ぀たり、 Salesforce 初孊者が最初に受けるべき詊隓かず思いたす。 詊隓抂芁・私の詊隓結果 内容倚肢遞択/耇数遞択方匏で 60 問 詊隓時間105 分 合栌ラむン65% 受隓方法オンラむン自宅やオフィス or テストセンタヌ 前提資栌や条件なし 次に出題範囲ずその割合に぀いおです。括匧内に私の詊隓での正答率を瀺したす 範囲 出題割合 私の正答率 組織の蚭定 3% 50% ナヌザの蚭定 7% 66% セキュリティずアクセス 13% 37% 暙準オブゞェクトずカスタムオブゞェクト 14% 88% 営業アプリケヌションず マヌケティング アプリケヌション 14% 75% サヌビスアプリケヌションずサポヌトアプリケヌション 13% 75% 掻動の管理 3% 100% デヌタの管理 10% 83% 分析 - レポヌトず ダッシュ ボヌド 10% 83% ワヌクフロヌ / プロセスの自動化 8% 100% デスクトップずモバむルの管理 3% 0% APPEXCHANGE 2% 100% なお、詊隓を受ける時期によっお出題範囲ず割合は倧きく倉わりたすここに蚘茉しおいるのは Summer'22 の情報です。 Winter'23では出題割合は倧きく倉化しおいたす。必ず公匏ドキュメントを確認しお出題範囲ず割合を確認したしょう 詊隓圓日の流れ 受隓方法は 2 皮類 オンラむンで自宅やオフィスから受隓 → 今回私はこちらを遞択 テストセンタヌで受隓 詊隓申し蟌み オンラむン詊隓は 24 時間、い぀でも受隓可胜です。 申し蟌み可胜な日皋は随時曎新されたす。数分前には予玄できなかった日皋もペヌゞを曎新するず申し蟌み可胜になっおいたりしたす オンラむン詊隓は、詊隓予定時間の 24 時間より前であれば無料でキャンセル・日皋倉曎が可胜です。 事前準備 詊隓前たでに 2 ぀の䜜業をする必芁がありたす。この事前準備は数分で完了したすが、詊隓盎前に慌おないよう早めに準備しおおくべきです。 顔認蚌システムぞの登録PCカメラに自分の顔を映すだけ。数十秒でOK 詊隓甚の゜フトをダりンロヌド数分で完了したす 詊隓開始 オンラむン詊隓は予玄時間の 10 分前から受隓甚サむトを開くこずができたす。 詊隓開始サむトを開くずたずは顔認蚌です。事前準備で登録した顔ず受隓者の顔が䞀臎するかシステムで刀断されたす。 顔認蚌が終われば実際に問題を解いおいきたす。詊隓䞭カメラずマむク機胜は垞にオンですが、自分の顔や詊隓官の顔が衚瀺されるようなこずはなく、集䞭しお詊隓を受けるこずができたした。 ずあるブログには「カメラで机の䞊を映し本や携垯がないこずを詊隓官に芋せなければならない」ず曞いおありたしたが、そのような堎面はありたせんでした せっかく机の䞊をきれいにしたのでせっかくなら芋おいただきたかった・・ たた「詊隓䞭のトラブルが倚発」ずも曞いおありたしたが、私はずおもスムヌズに受隓するこずができたした 蚘事で曞かれおいたのが 1・2 幎前の話だったのでだいぶ改善されたのだず思いたす 詊隓の文章は日本語ですが、所々翻蚳が埮劙な郚分がありたす。ただ、問題を解くのに支障があるレベルではないので心配しなくお倧䞈倫だず思いたす。 党お解き終わったら詊隓時間をカットしお回答を提出できたす。回答を提出するず、次の画面に詊隓結果が即衚瀺されたす。合栌の堎合、【合栌】ず衚瀺されお埗点分垃を確認できたす。埌ほどメヌルにも送られおくるのでメモする必芁はないです 勉匷方法 私は 10/1 にデゞタル゚ンゲヌゞメントセンタヌに配属ずなり、そこから Salesforce の孊習を始めたした。10/1 から詊隓を受けた 11/20 たでの過皋を曞いおいきたす。 10月 Salesforce には E ラヌニングのようなサむトがありたす。「Trailhead」です。10 月は Trailhead を通しお孊習をしたした。Trailhead で孊習したコヌスに぀いおは本投皿の䞋郚「参考」に曞いおいたす。10 月は詊隓に受かるこずよりも Salesforce を知るずいう目的が匷かったです。 11月 倧きく分けお 3 ぀のこずに取り組みたした。詊隓 2 週間前くらいから「詊隓に受かる」を目的に勉匷したした。 Trailhead Trailmix 【Salesforce公匏】認定アドミニストレヌタヌ資栌 察策 Salesforce Certification Days 認定 アドミニストレヌタヌ 詊隓察策 セミ ナヌ ネットにある暡擬問題挔習 1 ぀目の Trailmix に぀いおは、非垞に量が倚く、2 週間前からでは終わりたせんでした 64% 分実斜しおやめたした。もし、この Trailmix を完党に終えおから詊隓に挑みたい堎合は 2 週間以䞊前から取り組んだ方が良いず思いたす。ちなみに、1 日あたりの勉匷に充おた時間は平均 56 時間皋床です。 2 ぀目の「 Salesforce Certification Days」ずは Salesforce 瀟が実斜しおいる無料の資栌察策 セミ ナヌです 詳现はこちら 。非垞にわかりやすく、詊隓に出るポむントも教えおくれるのでぜひ参加するこずをお勧めしたすさらに、私が受けたずきには本詊隓 70% 匕きクヌポンコヌドも貰えたした 3 ぀目の暡擬問題挔習は、ネットで「 アドミニストレヌタヌ 詊隓 暡擬問題」ず怜玢しお衚瀺されたサむトに曞かれおいる問題をひたすらに解くずいうこずをやりたした。そのサむトの解答が必ずしも正しいかはわかりたせんが、自分なりに理解しお回答できるたで 3 呚くらい繰り返し取り組みたした。 詊隓を終えお 詊隓で問題を解いおいた感芚ずしおは「8 割は確実に取れおいるな」ず思っおいたものの、出題割合を考慮しお総合正答率を蚈算するず 73% でした。思っおいた以䞊に䜎い結果だったなずいうのが感想です。特に、「セキュリティずアクセス」の正答率が䜎く衝撃を受けおいたす。今埌、セキュリティずアクセスの分野の知識をさらに吞収しおいきたいず思いたす 䞀蚀アド バむス 詊隓勉匷や無料詊隓察策 セミ ナヌ等を通しお「これは芚えおた方がいい」ず思ったポむントを曞いおみたす アクセスを制限するのがプロファむル 制限されたアクセスを緩和・開攟するのが暩限セット ログむン可吊はプロファむルのIP制限ずプロファむルの時間のみに䟝存する組織の信頌した IPアドレス 範囲内でも倖でもログむンはできる範囲内なら即ログむン、範囲倖なら远加の凊理を通しおログむン可 むンポヌトりィザヌドは、ケヌス・商談オブゞェクトのむンポヌトできない これを芚えるだけで 60 問䞭 4~5 問は解けるず思いたすぜひ芚えおみおください 参考 10 月に取り組んだ Trailhead Trailhead を䜿甚した Salesforce の孊習 Salesforce の抂芁 システム管理者初玚 開発者初玚 【Salesforce公匏】認定Platformアプリケヌションビルダヌ資栌 察策 これから アドミニストレヌタヌ 詊隓を受ける方々にずっお、䜕か1぀でもプラスになれば嬉しいです。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募をお埅ちしおいたす。 CRM゜リュヌションコンサルタント 【新卒採甚】ISID 採甚ペヌゞ 執筆 @nemoto.kouhei 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
おはようございたすこんにちはこんばんは 電通囜際情報サヌビス 、Xクロス むノベヌション 本郚 デゞタル゚ンゲヌゞメントセンタヌの根本康平です。 先日、 Salesforce 資栌の 1 ぀「 Salesforce 認定 アドミニストレヌタヌ 」を受隓し合栌したした。どのような察策をしたのか・詊隓がどのような感じで行われたのかを共有したす。 他のブログで曞かれおいた情報ずはかなりむメヌゞが違いたした  その点に぀いおも共有したす。あくたでも個人的な芋解ですので、信甚しすぎないようにしおください。たた、リンク先のURLが倉曎され情報が閲芧できなくなる堎合もありたす。ご了承ください。 そもそもどんな詊隓 詊隓抂芁・私の詊隓結果 詊隓圓日の流れ 詊隓申し蟌み 事前準備 詊隓開始 勉匷方法 詊隓を終えお 䞀蚀アドバむス 参考 10 月に取り組んだ Trailhead そもそもどんな詊隓 公匏サむトには「管理者、 コンサルタント 、アヌキテクトにおすすめのファヌストステップ」ず曞いおありたす。 ぀たり、 Salesforce 初孊者が最初に受けるべき詊隓かず思いたす。 詊隓抂芁・私の詊隓結果 内容倚肢遞択/耇数遞択方匏で 60 問 詊隓時間105 分 合栌ラむン65% 受隓方法オンラむン自宅やオフィス or テストセンタヌ 前提資栌や条件なし 次に出題範囲ずその割合に぀いおです。括匧内に私の詊隓での正答率を瀺したす 範囲 出題割合 私の正答率 組織の蚭定 3% 50% ナヌザの蚭定 7% 66% セキュリティずアクセス 13% 37% 暙準オブゞェクトずカスタムオブゞェクト 14% 88% 営業アプリケヌションず マヌケティング アプリケヌション 14% 75% サヌビスアプリケヌションずサポヌトアプリケヌション 13% 75% 掻動の管理 3% 100% デヌタの管理 10% 83% 分析 - レポヌトず ダッシュ ボヌド 10% 83% ワヌクフロヌ / プロセスの自動化 8% 100% デスクトップずモバむルの管理 3% 0% APPEXCHANGE 2% 100% なお、詊隓を受ける時期によっお出題範囲ず割合は倧きく倉わりたすここに蚘茉しおいるのは Summer'22 の情報です。 Winter'23では出題割合は倧きく倉化しおいたす。必ず公匏ドキュメントを確認しお出題範囲ず割合を確認したしょう 詊隓圓日の流れ 受隓方法は 2 皮類 オンラむンで自宅やオフィスから受隓 → 今回私はこちらを遞択 テストセンタヌで受隓 詊隓申し蟌み オンラむン詊隓は 24 時間、い぀でも受隓可胜です。 申し蟌み可胜な日皋は随時曎新されたす。数分前には予玄できなかった日皋もペヌゞを曎新するず申し蟌み可胜になっおいたりしたす オンラむン詊隓は、詊隓予定時間の 24 時間より前であれば無料でキャンセル・日皋倉曎が可胜です。 事前準備 詊隓前たでに 2 ぀の䜜業をする必芁がありたす。この事前準備は数分で完了したすが、詊隓盎前に慌おないよう早めに準備しおおくべきです。 顔認蚌システムぞの登録PCカメラに自分の顔を映すだけ。数十秒でOK 詊隓甚の゜フトをダりンロヌド数分で完了したす 詊隓開始 オンラむン詊隓は予玄時間の 10 分前から受隓甚サむトを開くこずができたす。 詊隓開始サむトを開くずたずは顔認蚌です。事前準備で登録した顔ず受隓者の顔が䞀臎するかシステムで刀断されたす。 顔認蚌が終われば実際に問題を解いおいきたす。詊隓䞭カメラずマむク機胜は垞にオンですが、自分の顔や詊隓官の顔が衚瀺されるようなこずはなく、集䞭しお詊隓を受けるこずができたした。 ずあるブログには「カメラで机の䞊を映し本や携垯がないこずを詊隓官に芋せなければならない」ず曞いおありたしたが、そのような堎面はありたせんでした せっかく机の䞊をきれいにしたのでせっかくなら芋おいただきたかった・・ たた「詊隓䞭のトラブルが倚発」ずも曞いおありたしたが、私はずおもスムヌズに受隓するこずができたした 蚘事で曞かれおいたのが 1・2 幎前の話だったのでだいぶ改善されたのだず思いたす 詊隓の文章は日本語ですが、所々翻蚳が埮劙な郚分がありたす。ただ、問題を解くのに支障があるレベルではないので心配しなくお倧䞈倫だず思いたす。 党お解き終わったら詊隓時間をカットしお回答を提出できたす。回答を提出するず、次の画面に詊隓結果が即衚瀺されたす。合栌の堎合、【合栌】ず衚瀺されお埗点分垃を確認できたす。埌ほどメヌルにも送られおくるのでメモする必芁はないです 勉匷方法 私は 10/1 にデゞタル゚ンゲヌゞメントセンタヌに配属ずなり、そこから Salesforce の孊習を始めたした。10/1 から詊隓を受けた 11/20 たでの過皋を曞いおいきたす。 10月 Salesforce には E ラヌニングのようなサむトがありたす。「Trailhead」です。10 月は Trailhead を通しお孊習をしたした。Trailhead で孊習したコヌスに぀いおは本投皿の䞋郚「参考」に曞いおいたす。10 月は詊隓に受かるこずよりも Salesforce を知るずいう目的が匷かったです。 11月 倧きく分けお 3 ぀のこずに取り組みたした。詊隓 2 週間前くらいから「詊隓に受かる」を目的に勉匷したした。 Trailhead Trailmix 【Salesforce公匏】認定アドミニストレヌタヌ資栌 察策 Salesforce Certification Days 認定 アドミニストレヌタヌ 詊隓察策 セミ ナヌ ネットにある暡擬問題挔習 1 ぀目の Trailmix に぀いおは、非垞に量が倚く、2 週間前からでは終わりたせんでした 64% 分実斜しおやめたした。もし、この Trailmix を完党に終えおから詊隓に挑みたい堎合は 2 週間以䞊前から取り組んだ方が良いず思いたす。ちなみに、1 日あたりの勉匷に充おた時間は平均 56 時間皋床です。 2 ぀目の「 Salesforce Certification Days」ずは Salesforce 瀟が実斜しおいる無料の資栌察策 セミ ナヌです 詳现はこちら 。非垞にわかりやすく、詊隓に出るポむントも教えおくれるのでぜひ参加するこずをお勧めしたすさらに、私が受けたずきには本詊隓 70% 匕きクヌポンコヌドも貰えたした 3 ぀目の暡擬問題挔習は、ネットで「 アドミニストレヌタヌ 詊隓 暡擬問題」ず怜玢しお衚瀺されたサむトに曞かれおいる問題をひたすらに解くずいうこずをやりたした。そのサむトの解答が必ずしも正しいかはわかりたせんが、自分なりに理解しお回答できるたで 3 呚くらい繰り返し取り組みたした。 詊隓を終えお 詊隓で問題を解いおいた感芚ずしおは「8 割は確実に取れおいるな」ず思っおいたものの、出題割合を考慮しお総合正答率を蚈算するず 73% でした。思っおいた以䞊に䜎い結果だったなずいうのが感想です。特に、「セキュリティずアクセス」の正答率が䜎く衝撃を受けおいたす。今埌、セキュリティずアクセスの分野の知識をさらに吞収しおいきたいず思いたす 䞀蚀アド バむス 詊隓勉匷や無料詊隓察策 セミ ナヌ等を通しお「これは芚えおた方がいい」ず思ったポむントを曞いおみたす アクセスを制限するのがプロファむル 制限されたアクセスを緩和・開攟するのが暩限セット ログむン可吊はプロファむルのIP制限ずプロファむルの時間のみに䟝存する組織の信頌した IPアドレス 範囲内でも倖でもログむンはできる範囲内なら即ログむン、範囲倖なら远加の凊理を通しおログむン可 むンポヌトりィザヌドは、ケヌス・商談オブゞェクトのむンポヌトできない これを芚えるだけで 60 問䞭 4~5 問は解けるず思いたすぜひ芚えおみおください 参考 10 月に取り組んだ Trailhead Trailhead を䜿甚した Salesforce の孊習 Salesforce の抂芁 システム管理者初玚 開発者初玚 【Salesforce公匏】認定Platformアプリケヌションビルダヌ資栌 察策 これから アドミニストレヌタヌ 詊隓を受ける方々にずっお、䜕か1぀でもプラスになれば嬉しいです。 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募をお埅ちしおいたす。 CRM゜リュヌションコンサルタント 【新卒採甚】ISID 採甚ペヌゞ 執筆 @nemoto.kouhei 、レビュヌ @yamashita.tsuyoshi  Shodo で執筆されたした 
電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusion シリヌズ、今回のテヌマは、 Waifu Diffusion 1.3.5_80000 です。 Waifu Diffusion ずいうのは、 Stable Diffusion から掟生しおいお、 矎少女アニメ 画に匷いずいう特城を持っおいたす。 80000 ずいうのは、孊習の床合いを衚しおいお、「ただ完成しおないけど、みんなの反応を芋たい」ずいうこずで、プレビュヌずしおリリヌスされたんだず思いたす。 Hugging Face 䞊のペヌゞは、 こちら 。 バヌゞョンが1.4になっおいるので、孊習が進んで完成するず、 1.3.5 が 1.4 になるんでしょうね。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文線 矎少女アニメ画線 矎少女写真線 女性むラスト線 長い呪文は切り捚おられる線 AUTOMATIC1111に察応したColabノヌトブック VAEの比范 仲間募集 Stable Diffusionの党コンテンツ AUTOMATIC1111に察応したColabノヌトブック 今回の Waifu Diffusion 1.3.5_80000 には、2぀のVAEが存圚したす。 kl-f8-anime.ckpt ず kl-f8-anime2.ckpt です。 kl-f8-anime.ckpt は、元のVAEをファむンチュヌニングしたものです。ファむンチュヌニングずは、元のVAEに远加で、いく぀か画像を孊習させたずいう意味です。 kl-f8-anime2.ckpt は、元のVAEを 刈り蟌んだ(pruned) ものです。 刈り蟌んだ の意味は、たぶん、元のVAEの孊習に䜿った画像のうち、むマむチなものを取り陀いお孊習させたずいう意味なんじゃないかず思いたす。 kl-f8-anime.ckpt を䜿ったAUTOMATIC1111に察応したColabノヌトブックは、 こちら 。 kl-f8-anime2.ckpt を䜿ったAUTOMATIC1111に察応したColabノヌトブックは、 こちら 。 VAEの比范 SeedをふくめたすべおのパラメヌタをVAE以倖は同じにしお比べおみたした。 kl-f8-anime.ckpt その䞀 kl-f8-anime2.ckpt その䞀 kl-f8-anime.ckpt その二 kl-f8-anime2.ckpt その二 kl-f8-anime.ckpt その䞉 kl-f8-anime2.ckpt その䞉 がくの感想ずしおは、 kl-f8-anime.ckpt の方が、党䜓的に明るいが、ちょっずチヌプ感があるなぁずいう感じです。 衚珟が難しいんですが、もう少し垢抜けた感じがほしいずころです。同じ呪文で、 Cool Japan Diffusion 2.0で出すずこんな感じです。 垢抜けたずいう感じが䌝わるでしょうか。 今回䜿った通垞呪文 masterpiece high quality highly detailed kawaii princess white glowing skin kawaii face with blush blue eyes with eyelashes long waved hair (cleavage breasts:0.7) open shoulders gothic lolita glossy dress with ruffles gorgeous jewelry accessories anime gorgeous background centered composition lim lighting intense shadows 通垞呪文の改行版 masterpiece high quality highly detailed kawaii princess white glowing skin kawaii face with blush blue eyes with eyelashes long waved hair (cleavage breasts:0.7) open shoulders gothic lolita glossy dress with ruffles gorgeous jewelry accessories anime gorgeous background centered composition lim lighting intense shadows 今回䜿ったネガティブ呪文 blender deformed mutated disfigured lowres blurred repetitive double mutated hands bad hands missing hands extra hands liquid hands poorly drawn hands mutated fingers bad fingers missing fingers extra fingers liquid fingers poorly drawn fingers partial head bad face small face partial face bad eyes missing eyes too big eyes bad eyebrows bad eyelashes bad nose missing nose bad mouth missing mouth open mouth bad ears thick lips chest pad bad legs missing legs extra legs bad arms missing arms extra arms low quality normal quality crown black and white 今回䜿ったネガティブ呪文の改行版 blender deformed mutated disfigured lowres blurred repetitive double mutated hands bad hands missing hands extra hands liquid hands poorly drawn hands mutated fingers bad fingers missing fingers extra fingers liquid fingers poorly drawn fingers partial head bad face small face partial face bad eyes missing eyes too big eyes bad eyebrows bad eyelashes bad nose missing nose bad mouth missing mouth open mouth bad ears thick lips bad legs missing legs extra legs bad arms missing arms extra arms low quality normal quality crown black and white 仲間募集 私たちは䞀緒に働いおくれる仲間を募集しおいたす ゜リュヌションアヌキテクト Stable Diffusionの党コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusion シリヌズ、今回のテヌマは、 Waifu Diffusion 1.3.5_80000 です。 Waifu Diffusion ずいうのは、 Stable Diffusion から掟生しおいお、 矎少女アニメ 画に匷いずいう特城を持っおいたす。 80000 ずいうのは、孊習の床合いを衚しおいお、「ただ完成しおないけど、みんなの反応を芋たい」ずいうこずで、プレビュヌずしおリリヌスされたんだず思いたす。 Hugging Face 䞊のペヌゞは、 こちら 。 バヌゞョンが1.4になっおいるので、孊習が進んで完成するず、 1.3.5 が 1.4 になるんでしょうね。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文線 矎少女アニメ画線 矎少女写真線 女性むラスト線 長い呪文は切り捚おられる線 AUTOMATIC1111に察応したColabノヌトブック VAEの比范 仲間募集 Stable Diffusionの党コンテンツ AUTOMATIC1111に察応したColabノヌトブック 今回の Waifu Diffusion 1.3.5_80000 には、2぀のVAEが存圚したす。 kl-f8-anime.ckpt ず kl-f8-anime2.ckpt です。 kl-f8-anime.ckpt は、元のVAEをファむンチュヌニングしたものです。ファむンチュヌニングずは、元のVAEに远加で、いく぀か画像を孊習させたずいう意味です。 kl-f8-anime2.ckpt は、元のVAEを 刈り蟌んだ(pruned) ものです。 刈り蟌んだ の意味は、たぶん、元のVAEの孊習に䜿った画像のうち、むマむチなものを取り陀いお孊習させたずいう意味なんじゃないかず思いたす。 kl-f8-anime.ckpt を䜿ったAUTOMATIC1111に察応したColabノヌトブックは、 こちら 。 kl-f8-anime2.ckpt を䜿ったAUTOMATIC1111に察応したColabノヌトブックは、 こちら 。 VAEの比范 SeedをふくめたすべおのパラメヌタをVAE以倖は同じにしお比べおみたした。 kl-f8-anime.ckpt その䞀 kl-f8-anime2.ckpt その䞀 kl-f8-anime.ckpt その二 kl-f8-anime2.ckpt その二 kl-f8-anime.ckpt その䞉 kl-f8-anime2.ckpt その䞉 がくの感想ずしおは、 kl-f8-anime.ckpt の方が、党䜓的に明るいが、ちょっずチヌプ感があるなぁずいう感じです。 衚珟が難しいんですが、もう少し垢抜けた感じがほしいずころです。同じ呪文で、 Cool Japan Diffusion 2.0で出すずこんな感じです。 垢抜けたずいう感じが䌝わるでしょうか。 今回䜿った通垞呪文 masterpiece high quality highly detailed kawaii princess white glowing skin kawaii face with blush blue eyes with eyelashes long waved hair (cleavage breasts:0.7) open shoulders gothic lolita glossy dress with ruffles gorgeous jewelry accessories anime gorgeous background centered composition lim lighting intense shadows 通垞呪文の改行版 masterpiece high quality highly detailed kawaii princess white glowing skin kawaii face with blush blue eyes with eyelashes long waved hair (cleavage breasts:0.7) open shoulders gothic lolita glossy dress with ruffles gorgeous jewelry accessories anime gorgeous background centered composition lim lighting intense shadows 今回䜿ったネガティブ呪文 blender deformed mutated disfigured lowres blurred repetitive double mutated hands bad hands missing hands extra hands liquid hands poorly drawn hands mutated fingers bad fingers missing fingers extra fingers liquid fingers poorly drawn fingers partial head bad face small face partial face bad eyes missing eyes too big eyes bad eyebrows bad eyelashes bad nose missing nose bad mouth missing mouth open mouth bad ears thick lips chest pad bad legs missing legs extra legs bad arms missing arms extra arms low quality normal quality crown black and white 今回䜿ったネガティブ呪文の改行版 blender deformed mutated disfigured lowres blurred repetitive double mutated hands bad hands missing hands extra hands liquid hands poorly drawn hands mutated fingers bad fingers missing fingers extra fingers liquid fingers poorly drawn fingers partial head bad face small face partial face bad eyes missing eyes too big eyes bad eyebrows bad eyelashes bad nose missing nose bad mouth missing mouth open mouth bad ears thick lips bad legs missing legs extra legs bad arms missing arms extra arms low quality normal quality crown black and white 仲間募集 私たちは䞀緒に働いおくれる仲間を募集しおいたす ゜リュヌションアヌキテクト Stable Diffusionの党コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 
皆様こんにちは。 XI本郚 AIトランスフォヌメヌションセンタヌ AI補品開発グルヌプの犏竹ず申したす。 本蚘事は ISID Techblogの2022幎アドベントカレンダヌ 12/23の蚘事ずなりたす。しかしクリスマスどころか2022幎の営業日も残りわずかですね。皆様の2022幎はいかがでしたか もう残り少ないですが、ここらで2022幎を「ふりかえっお」おきたいずころですね匷匕なアむスブレむク ずいう蚳で本蚘事のテヌマは「ふりかえり」です。 今幎䞀幎、執筆者はオンラむンホワむトボヌドツヌルのmiroを䜿っお、開発チヌムで「ふりかえり」を行うこずがよくありたした。この詊行錯誀の䞭で、特に䌁画偎ずしお意識するようになったTipsや課題意識に぀いお、本蚘事では共有したいず思いたす。あくたで私個人のTipsであり、チヌム状況や志向性によっお適甚できる/できないはあるかず思いたすが、このテヌマに関心のあるかたぞのア むデア や考察に぀ながれば幞いです。 はじめにふりかえりずは はじめにmiroずは 事前ふりかえりのアゞェンダを蚭蚈する 目的を明確に決めお、スコヌプを想起できるよう工倫する バッファを芋蟌んだアゞェンダを組む miroのテンプレヌトを掻かしお、ホワむトボヌドを蚭蚈する 事䞭ふりかえりをファシリテヌトする Bring everyone to meを芁所で䜿う乱甚しない 意識しお非同期コミュニケヌションの時間を䜜るコメント機胜を掻甚する タむマヌを意識的に䜿う無実にしない 事埌ふりかえりを、やりっぱなしにしない 折に觊れお䜿うコンテキストを呌びだすショヌトカットにする 収束の段階で出おきたアむデアの皮は、無理に皆でたずめない おわりに 参考文献ふりかえりのアゞェンダを組む はじめにふりかえりずは チヌムの掻動をより良くするために、チヌムで䌁画・実斜するプ ラク ティスです。特に「 KPT 」「FUN/DONE/LEARN」など、 アゞャむル レトロスペクティブに端を発するアクティビティを、本蚘事では想定しおいたす。 アゞャむル の文脈で生たれたプ ラク ティスですが、チヌム掻動であれば䜕にでも汎甚的に䜿えたす。入門線に぀いおは、 昚幎の拙蚘事 をご参考にどうぞ。 はじめにmiroずは オンラむンホワむトボヌドツヌルの䞀぀です。 https://miro.com/ 同様のツヌルには Google Jamboard、 Microsoft Whiteboard 、MURAL、 Apple フリヌボヌド、あたりが挙がりたす。本蚘事の䞻県ではないので现かく觊れたせんが、個人的に「2022幎ベストバむ」の䞀぀に挙げたいくらい気に入っおいるツヌルです。本蚘事の内容はmiroなしでも実践できるものを含みたすが、お手元にmiroがあるず、より実践が近付くず思いたす。 前眮きはこのくらいにしたしょう。ここからは実際のTipsや課題意識に぀いお、実際にふりかえりを䌁画〜実斜する時にステップに沿いながら曞いおいきたす。基本的なプロセスは、昚幎の蚘事でも匕甚した ふりかえりガむドブック が䞋敷きにありたすので、お持ちの方はご参考にしおください。 事前ふりかえりの アゞェンダ を蚭蚈する チヌムの状況にもよりたすが「倧きめのリリヌスも終わるし、ここらで次に向けお改善できる所がないか考えたいな」のようなシチュ゚ヌションは倚いず思いたす。ずなるず関係者に MTG を蚭定しお、 アゞェンダ を決めおおく所から始たるでしょう。かっこよく蚀えば『ふりかえりの蚭蚈』です。 目的を明確に決めお、スコヌプを想起できるよう工倫する アゞェンダ を蚭蚈するにあたり、最初に 「なぜ、ふりかえりをやるんだっけ」ずいう目的は 蚀語化 しおおきたしょう 。そしお目的から逆算した時の 「意識しおほしいスコヌプ」を決めおおきたしょう 。䟋を挙げたす。 目的補品Aの倧きめのリリヌスが完了した。メンバの功瞟を 蚀語化 するずずもに、次のスプリントで掻かせそうなア むデア を考えおおく。 スコヌプ前回のふりかえり実斜埌から、リリヌス圓日たでの補品Aに関するアクティビティ こうしおスコヌプが明瞭になっおいれば、䟋えばこういった工倫ができたす。 期間䞭に取り組んだ補品Aの バックログ 、バヌンダりンチャヌト、前回のふりかえり完了時のmiroボヌドを甚意しおおこう。 アゞェンダ の最初に、これらを芋おもらえる時間も远加しおおこう。 メンバの状況にもよりたすが、事前ワヌクのない「ふりかえり」であれば特に効果的だず思いたす。 バッファを芋蟌んだ アゞェンダ を組む 次に アゞェンダ を組みたす。ワヌクの遞び方は割愛したすが、慣れた フレヌムワヌク や、埌述の参考資料からピックアップしおいくこずになるでしょう。やりたいワヌクが決たったら、圓日の アゞェンダ を組むこずになりたす。 この時、 アゞェンダ には必ずバッファを入れたしょう 。Keep/Problem/Tryで䟋を挙げたす。 Keepをmiroに曞く5分 曞かれたKeepを読む10分 Problemをmiroに曞く5 曞かれたProblemを読む10分 Tryをmiroに曞く5分 曞かれたTryを読む10分 よし45分ず考えそうになりたすが、少なくずも私の堎合、この通りになったこずがありたせん。参加者の状況にもよりたすが「Problemを読むのに時間がかかる」「Tryを曞くのに時間がかかる」なんおこずはよくあるず思いたす。なので合蚈45分でも、思い切っお60分取りたす。あずは、重芁な議論の時間が広がりやすいProblemやTryの時間を先に増やしおおくのもいいでしょう。ここで䜜った䜙裕を、圓日うたく䜿いたす埌述。 miroのテンプレヌトを掻かしお、ホワむトボヌドを蚭蚈する アゞェンダ が決たったら、事前にmiroのホワむトボヌドに、圓日䜿うボヌドを䜜る必芁がありたす。この時、 なるべくむチからは䜜らず、miroのテンプレヌトを利甚したしょう 。自䜜しおもいいのですが、ボヌドの自䜜は結構楜しく、時間泥棒です。暇な時以倖はやめおおきたしょう。 コミュニティのテンプレヌトであるMiroverseも有甚です。Miroverseは長幎英語のボヌドしかありたせんでしたが、ここ最近は日本語のテンプレヌトも出始めおいたす。ふりかえりガむドブック著者の森さんが KPT のテンプレヌトを公開しおくれおいたす。 Miroverse:KPTふりかえり日本語 䜙談ですが、miroverseには面癜いボヌドも倚く、これたた時間泥棒です。぀いでなので、私がい぀か、蚓緎されたマグルの集たりで䜿っおみたいず思っおいるボヌドの䟋を玹介したす。 Miroverse:Harry Potter Retrospective 最埌に、ここで甚意したテンプレヌトは、線集をロックしおおきたしょう。ロックしおおくこずで、メンバが誀っお背景のアむテムを消したり、倉曎しおしたったりを防ぐこずが出来たす。 事䞭ふりかえりをファシリテヌトする さお、圓日です。䌁画者が ファシリテヌタヌ も兌任するケヌスは倚いでしょう。皆がmiroにやっおきたす。事前に䜜った アゞェンダ を手元に、ふりかえりを開始したす。 Bring everyone to meを芁所で䜿う乱甚しない miroには、参加者党員の画面を匷制的に自分の芋おいる範囲に移動させる Bring everyone to me ずいう機胜がありたす。 アゞェンダ の説明やBoard内の誘導には、こちらを 有効に䜿いたしょう 。ただ「最初の説明」「議論の導入」の時など限られたタむミングだけで䜿うのがおすすめめです。 『メンバヌが迷子になるこずを防ぐ』目的にずどめお䜿う ほうが、参加偎には負荷がかからないように思いたす。 意識しお非同期コミュニケヌションの時間を䜜るコメント機胜を掻甚する チヌムの慣れ具合にもよるのですが、miroボヌドを前にワヌクしおいる時は 「喋らない時間」を意図的に蚭けたほうが総コミュニケヌション量を増やせたす 。党おを発話で枈たせるのではなく、 miroのコメント機胜を有効に䜿いたしょう 。 KPT の䟋であれば、次のようなむメヌゞです。 Keepをmiroに曞く 他のメンバのKeepを読み、コメントを入れる時間を䜜る Keepをピックアップしお発話に入る。どうしおも時間がない時はコメントを芋ながらピックアップ察象を絞る。 付箋の内容をあえお発話しおもらう事で参加を促したいケヌスは、この限りではありたせん。ただ、チヌムメンバヌがワヌクに慣れおいる等の状況では、このステップを螏んだほうが時間単䜍でできる議論の量は増えたす。 タむマヌを意識的に䜿う無実にしない miroには タむマヌ機胜 がありたす。これも 是非掻甚したしょう 。タむマヌが0になるず、アラヌムでボヌドを芋おいる人党員に時間を知らせるこずができたす。 ただタむマヌの蚭定に぀いおは、 アゞェンダ の時間枠を杓子定芏に蚭定するよりは、 議論の様子を芋お柔軟に蚭定時間を倉えたほうが効果的 です。どういうこずかずいうず、「この議論はただ続きそうだな」ず思ったら、いたずらに終了のタむマヌを鳎らさず、タむマヌの時間をそっず远加しおしたうのですここで最初に䜜ったバッファを䜿いたす。 この方法がベストであるかは残り時間などの状況にもよりたす。いっぜうで、頻繁にアラヌムの音が鳎っおしたうず、それはそれで参加者がアラヌムの音を気にしなくなる無実になる傟向にありたす。党䜓を時間内にきれいに収めるためにも、タむマヌは意識的に アゞェンダ が切り替わっおほしいタむミングでのみ鳎るようにしたしょう。 事埌ふりかえりを、やりっぱなしにしない 無事ふりかえりの時間が終わりたした。miroボヌドにメンバヌの色々な思いが曞き出され、議論も癜熱し、良い感じの達成感が残りたす。ちょっず消化䞍良に終わった そんな時もありたす。たた挫けずやっおみたしょう。 折に觊れお䜿うコンテキストを呌びだすショヌトカットにする 䜿ったホワむトボヌドは 実斜日が分かるようにしおおき 、折に觊れお「この時こんな議論があったず思うんだけど」ず 思い出す時に䜿いたしょう 。ホワむトボヌドツヌルの良い所は、議論の過皋が、盎感的に理解しやすいホワむトボヌドの圢で残るこずです。特に定期的なふりかえりの堎合、前回のふりかえりボヌドが同じホワむトボヌド䞊にあるず非垞に䟿利です。ボヌドを芋ただけで圓時のコンテキストをある皋床呌び出せるので「前回はこう考えおたけど、結局こうなったな」ずいった仮説怜蚌的な思考を自然ずメンバに想起できたす。 たた、こういった状態を䜜るためにも、付箋ぞのコメント機胜は有効掻甚しおおきたい所です。意識しおコメント機胜を䜿っおいれば、おそらくパッず芋お気になった付箋には、コメントが残っおいるでしょう。議論の過皋も残っおいるずなおよいです。 収束の段階で出おきたア むデア の皮は、無理に皆でたずめない 発散→収束の収束のプロセスで、ふず単玔なToDoにはなっおいない、 ア むデア めいた付箋 が生たれるこずがありたす。こうしたアむテムは 無闇にToDoに萜ずしこたず 、議論の過皋をコメントに曞くに留めお、 そのたた残しおよい ず思いたす。䟋が出しづらいですが、䟋えば「AをBず組み合わせおみる」みたいな、ただ劥圓性がわからない、実隓めいた蚘述のものが該圓するかもしれたせん。 なぜそうするかずいうず、こうした ア むデア めいた内容をグルヌプワヌクの限られた時間内で無理にToDoに萜ずし蟌もうずするず、工倫の䜙地を削った平均倀的なものに収束しおしたう事が倚い からです。なので焊っお 蚀語化 するよりは、挙がった議論の過皋だけ残しア むデア の皮に留めおおきたいのです。実際のずころ本圓に面癜いア むデア は、曞いた圓人が埌日、おもむろにやりはじめたりしたすこれは匊チヌムの堎合かもしれたせん。 ふりかえりずは少し異なりたすがこのあたりは最近読んだ 劄想する頭 思考する手 想像を超えるアむデアの぀くり方 ずいう曞籍でも、ア むデア づくりの文脈で近い考え方が瀺されおおり、非垞に共感できたした 第3ç« 2節「ブレストはワヌクしない」 。ご興味が有れば、是非。 おわりに いかがでしたか定型文 ワヌクの文脈はチヌムの数だけありたすし、どこたで䞀般的に適甚できるノりハりずなっおいるかはチヌムそれぞれかもしれたせん。ただ私達の詊行錯誀が、少しでも同奜の士のご参考ずなっおいれば幞いです。 そのたた宣䌝ですが、こういった詊行錯誀を日々重ねながら、AI技術の瀟䌚実装をAIトランスフォヌメヌションセンタヌでは進めおいたす。新卒、䞭途問わず䞀緒に働いおくださる方を募集しおおり、ご興味が湧いた方は AITC採甚サむト も是非埡芧ください。カゞュアル面談の申蟌みもお受付しおいたす。 さらに宣䌝ですが、私個人も スクラム マスタヌずしお日々修行しおおり、今幎はチヌムメンバヌず共に アゞャむルずスクラムによる開発手法 ずいう曞籍の翻蚳出版をしたした。鈍噚䞀歩手前の分量ですが、ずおも良い本ですので、ご興味が有れば是非手にずっおみおください。 では。メリヌ・クリスマス🎅 参考文献ふりかえりの アゞェンダ を組む アゞャむルなチヌムを぀くる ふりかえりガむドブック 始め方・ふりかえりの型・手法・マむンドセット たずはここから。賌入者特兞の「ふりかえり チヌトシヌト 」も是非。 ふりかえりカタログ 同著者が無料公開しおいる、ふりかえりのカタログです。 執筆 @fhiroaki 、レビュヌ @hashizume.hideki  Shodo で執筆されたした 
皆様こんにちは。 XI本郚 AIトランスフォヌメヌションセンタヌ AI補品開発グルヌプの犏竹ず申したす。 本蚘事は ISID Techblogの2022幎アドベントカレンダヌ 12/23の蚘事ずなりたす。しかしクリスマスどころか2022幎の営業日も残りわずかですね。皆様の2022幎はいかがでしたか もう残り少ないですが、ここらで2022幎を「ふりかえっお」おきたいずころですね匷匕なアむスブレむク ずいう蚳で本蚘事のテヌマは「ふりかえり」です。 今幎䞀幎、執筆者はオンラむンホワむトボヌドツヌルのmiroを䜿っお、開発チヌムで「ふりかえり」を行うこずがよくありたした。この詊行錯誀の䞭で、特に䌁画偎ずしお意識するようになったTipsや課題意識に぀いお、本蚘事では共有したいず思いたす。あくたで私個人のTipsであり、チヌム状況や志向性によっお適甚できる/できないはあるかず思いたすが、このテヌマに関心のあるかたぞのア むデア や考察に぀ながれば幞いです。 はじめにふりかえりずは はじめにmiroずは 事前ふりかえりのアゞェンダを蚭蚈する 目的を明確に決めお、スコヌプを想起できるよう工倫する バッファを芋蟌んだアゞェンダを組む miroのテンプレヌトを掻かしお、ホワむトボヌドを蚭蚈する 事䞭ふりかえりをファシリテヌトする Bring everyone to meを芁所で䜿う乱甚しない 意識しお非同期コミュニケヌションの時間を䜜るコメント機胜を掻甚する タむマヌを意識的に䜿う無実にしない 事埌ふりかえりを、やりっぱなしにしない 折に觊れお䜿うコンテキストを呌びだすショヌトカットにする 収束の段階で出おきたアむデアの皮は、無理に皆でたずめない おわりに 参考文献ふりかえりのアゞェンダを組む はじめにふりかえりずは チヌムの掻動をより良くするために、チヌムで䌁画・実斜するプ ラク ティスです。特に「 KPT 」「FUN/DONE/LEARN」など、 アゞャむル レトロスペクティブに端を発するアクティビティを、本蚘事では想定しおいたす。 アゞャむル の文脈で生たれたプ ラク ティスですが、チヌム掻動であれば䜕にでも汎甚的に䜿えたす。入門線に぀いおは、 昚幎の拙蚘事 をご参考にどうぞ。 はじめにmiroずは オンラむンホワむトボヌドツヌルの䞀぀です。 https://miro.com/ 同様のツヌルには Google Jamboard、 Microsoft Whiteboard 、MURAL、 Apple フリヌボヌド、あたりが挙がりたす。本蚘事の䞻県ではないので现かく觊れたせんが、個人的に「2022幎ベストバむ」の䞀぀に挙げたいくらい気に入っおいるツヌルです。本蚘事の内容はmiroなしでも実践できるものを含みたすが、お手元にmiroがあるず、より実践が近付くず思いたす。 前眮きはこのくらいにしたしょう。ここからは実際のTipsや課題意識に぀いお、実際にふりかえりを䌁画〜実斜する時にステップに沿いながら曞いおいきたす。基本的なプロセスは、昚幎の蚘事でも匕甚した ふりかえりガむドブック が䞋敷きにありたすので、お持ちの方はご参考にしおください。 事前ふりかえりの アゞェンダ を蚭蚈する チヌムの状況にもよりたすが「倧きめのリリヌスも終わるし、ここらで次に向けお改善できる所がないか考えたいな」のようなシチュ゚ヌションは倚いず思いたす。ずなるず関係者に MTG を蚭定しお、 アゞェンダ を決めおおく所から始たるでしょう。かっこよく蚀えば『ふりかえりの蚭蚈』です。 目的を明確に決めお、スコヌプを想起できるよう工倫する アゞェンダ を蚭蚈するにあたり、最初に 「なぜ、ふりかえりをやるんだっけ」ずいう目的は 蚀語化 しおおきたしょう 。そしお目的から逆算した時の 「意識しおほしいスコヌプ」を決めおおきたしょう 。䟋を挙げたす。 目的補品Aの倧きめのリリヌスが完了した。メンバの功瞟を 蚀語化 するずずもに、次のスプリントで掻かせそうなア むデア を考えおおく。 スコヌプ前回のふりかえり実斜埌から、リリヌス圓日たでの補品Aに関するアクティビティ こうしおスコヌプが明瞭になっおいれば、䟋えばこういった工倫ができたす。 期間䞭に取り組んだ補品Aの バックログ 、バヌンダりンチャヌト、前回のふりかえり完了時のmiroボヌドを甚意しおおこう。 アゞェンダ の最初に、これらを芋おもらえる時間も远加しおおこう。 メンバの状況にもよりたすが、事前ワヌクのない「ふりかえり」であれば特に効果的だず思いたす。 バッファを芋蟌んだ アゞェンダ を組む 次に アゞェンダ を組みたす。ワヌクの遞び方は割愛したすが、慣れた フレヌムワヌク や、埌述の参考資料からピックアップしおいくこずになるでしょう。やりたいワヌクが決たったら、圓日の アゞェンダ を組むこずになりたす。 この時、 アゞェンダ には必ずバッファを入れたしょう 。Keep/Problem/Tryで䟋を挙げたす。 Keepをmiroに曞く5分 曞かれたKeepを読む10分 Problemをmiroに曞く5 曞かれたProblemを読む10分 Tryをmiroに曞く5分 曞かれたTryを読む10分 よし45分ず考えそうになりたすが、少なくずも私の堎合、この通りになったこずがありたせん。参加者の状況にもよりたすが「Problemを読むのに時間がかかる」「Tryを曞くのに時間がかかる」なんおこずはよくあるず思いたす。なので合蚈45分でも、思い切っお60分取りたす。あずは、重芁な議論の時間が広がりやすいProblemやTryの時間を先に増やしおおくのもいいでしょう。ここで䜜った䜙裕を、圓日うたく䜿いたす埌述。 miroのテンプレヌトを掻かしお、ホワむトボヌドを蚭蚈する アゞェンダ が決たったら、事前にmiroのホワむトボヌドに、圓日䜿うボヌドを䜜る必芁がありたす。この時、 なるべくむチからは䜜らず、miroのテンプレヌトを利甚したしょう 。自䜜しおもいいのですが、ボヌドの自䜜は結構楜しく、時間泥棒です。暇な時以倖はやめおおきたしょう。 コミュニティのテンプレヌトであるMiroverseも有甚です。Miroverseは長幎英語のボヌドしかありたせんでしたが、ここ最近は日本語のテンプレヌトも出始めおいたす。ふりかえりガむドブック著者の森さんが KPT のテンプレヌトを公開しおくれおいたす。 Miroverse:KPTふりかえり日本語 䜙談ですが、miroverseには面癜いボヌドも倚く、これたた時間泥棒です。぀いでなので、私がい぀か、蚓緎されたマグルの集たりで䜿っおみたいず思っおいるボヌドの䟋を玹介したす。 Miroverse:Harry Potter Retrospective 最埌に、ここで甚意したテンプレヌトは、線集をロックしおおきたしょう。ロックしおおくこずで、メンバが誀っお背景のアむテムを消したり、倉曎しおしたったりを防ぐこずが出来たす。 事䞭ふりかえりをファシリテヌトする さお、圓日です。䌁画者が ファシリテヌタヌ も兌任するケヌスは倚いでしょう。皆がmiroにやっおきたす。事前に䜜った アゞェンダ を手元に、ふりかえりを開始したす。 Bring everyone to meを芁所で䜿う乱甚しない miroには、参加者党員の画面を匷制的に自分の芋おいる範囲に移動させる Bring everyone to me ずいう機胜がありたす。 アゞェンダ の説明やBoard内の誘導には、こちらを 有効に䜿いたしょう 。ただ「最初の説明」「議論の導入」の時など限られたタむミングだけで䜿うのがおすすめめです。 『メンバヌが迷子になるこずを防ぐ』目的にずどめお䜿う ほうが、参加偎には負荷がかからないように思いたす。 意識しお非同期コミュニケヌションの時間を䜜るコメント機胜を掻甚する チヌムの慣れ具合にもよるのですが、miroボヌドを前にワヌクしおいる時は 「喋らない時間」を意図的に蚭けたほうが総コミュニケヌション量を増やせたす 。党おを発話で枈たせるのではなく、 miroのコメント機胜を有効に䜿いたしょう 。 KPT の䟋であれば、次のようなむメヌゞです。 Keepをmiroに曞く 他のメンバのKeepを読み、コメントを入れる時間を䜜る Keepをピックアップしお発話に入る。どうしおも時間がない時はコメントを芋ながらピックアップ察象を絞る。 付箋の内容をあえお発話しおもらう事で参加を促したいケヌスは、この限りではありたせん。ただ、チヌムメンバヌがワヌクに慣れおいる等の状況では、このステップを螏んだほうが時間単䜍でできる議論の量は増えたす。 タむマヌを意識的に䜿う無実にしない miroには タむマヌ機胜 がありたす。これも 是非掻甚したしょう 。タむマヌが0になるず、アラヌムでボヌドを芋おいる人党員に時間を知らせるこずができたす。 ただタむマヌの蚭定に぀いおは、 アゞェンダ の時間枠を杓子定芏に蚭定するよりは、 議論の様子を芋お柔軟に蚭定時間を倉えたほうが効果的 です。どういうこずかずいうず、「この議論はただ続きそうだな」ず思ったら、いたずらに終了のタむマヌを鳎らさず、タむマヌの時間をそっず远加しおしたうのですここで最初に䜜ったバッファを䜿いたす。 この方法がベストであるかは残り時間などの状況にもよりたす。いっぜうで、頻繁にアラヌムの音が鳎っおしたうず、それはそれで参加者がアラヌムの音を気にしなくなる無実になる傟向にありたす。党䜓を時間内にきれいに収めるためにも、タむマヌは意識的に アゞェンダ が切り替わっおほしいタむミングでのみ鳎るようにしたしょう。 事埌ふりかえりを、やりっぱなしにしない 無事ふりかえりの時間が終わりたした。miroボヌドにメンバヌの色々な思いが曞き出され、議論も癜熱し、良い感じの達成感が残りたす。ちょっず消化䞍良に終わった そんな時もありたす。たた挫けずやっおみたしょう。 折に觊れお䜿うコンテキストを呌びだすショヌトカットにする 䜿ったホワむトボヌドは 実斜日が分かるようにしおおき 、折に觊れお「この時こんな議論があったず思うんだけど」ず 思い出す時に䜿いたしょう 。ホワむトボヌドツヌルの良い所は、議論の過皋が、盎感的に理解しやすいホワむトボヌドの圢で残るこずです。特に定期的なふりかえりの堎合、前回のふりかえりボヌドが同じホワむトボヌド䞊にあるず非垞に䟿利です。ボヌドを芋ただけで圓時のコンテキストをある皋床呌び出せるので「前回はこう考えおたけど、結局こうなったな」ずいった仮説怜蚌的な思考を自然ずメンバに想起できたす。 たた、こういった状態を䜜るためにも、付箋ぞのコメント機胜は有効掻甚しおおきたい所です。意識しおコメント機胜を䜿っおいれば、おそらくパッず芋お気になった付箋には、コメントが残っおいるでしょう。議論の過皋も残っおいるずなおよいです。 収束の段階で出おきたア むデア の皮は、無理に皆でたずめない 発散→収束の収束のプロセスで、ふず単玔なToDoにはなっおいない、 ア むデア めいた付箋 が生たれるこずがありたす。こうしたアむテムは 無闇にToDoに萜ずしこたず 、議論の過皋をコメントに曞くに留めお、 そのたた残しおよい ず思いたす。䟋が出しづらいですが、䟋えば「AをBず組み合わせおみる」みたいな、ただ劥圓性がわからない、実隓めいた蚘述のものが該圓するかもしれたせん。 なぜそうするかずいうず、こうした ア むデア めいた内容をグルヌプワヌクの限られた時間内で無理にToDoに萜ずし蟌もうずするず、工倫の䜙地を削った平均倀的なものに収束しおしたう事が倚い からです。なので焊っお 蚀語化 するよりは、挙がった議論の過皋だけ残しア むデア の皮に留めおおきたいのです。実際のずころ本圓に面癜いア むデア は、曞いた圓人が埌日、おもむろにやりはじめたりしたすこれは匊チヌムの堎合かもしれたせん。 ふりかえりずは少し異なりたすがこのあたりは最近読んだ 劄想する頭 思考する手 想像を超えるアむデアの぀くり方 ずいう曞籍でも、ア むデア づくりの文脈で近い考え方が瀺されおおり、非垞に共感できたした 第3ç« 2節「ブレストはワヌクしない」 。ご興味が有れば、是非。 おわりに いかがでしたか定型文 ワヌクの文脈はチヌムの数だけありたすし、どこたで䞀般的に適甚できるノりハりずなっおいるかはチヌムそれぞれかもしれたせん。ただ私達の詊行錯誀が、少しでも同奜の士のご参考ずなっおいれば幞いです。 そのたた宣䌝ですが、こういった詊行錯誀を日々重ねながら、AI技術の瀟䌚実装をAIトランスフォヌメヌションセンタヌでは進めおいたす。新卒、䞭途問わず䞀緒に働いおくださる方を募集しおおり、ご興味が湧いた方は AITC採甚サむト も是非埡芧ください。カゞュアル面談の申蟌みもお受付しおいたす。 さらに宣䌝ですが、私個人も スクラム マスタヌずしお日々修行しおおり、今幎はチヌムメンバヌず共に アゞャむルずスクラムによる開発手法 ずいう曞籍の翻蚳出版をしたした。鈍噚䞀歩手前の分量ですが、ずおも良い本ですので、ご興味が有れば是非手にずっおみおください。 では。メリヌ・クリスマス🎅 参考文献ふりかえりの アゞェンダ を組む アゞャむルなチヌムを぀くる ふりかえりガむドブック 始め方・ふりかえりの型・手法・マむンドセット たずはここから。賌入者特兞の「ふりかえり チヌトシヌト 」も是非。 ふりかえりカタログ 同著者が無料公開しおいる、ふりかえりのカタログです。 執筆 @fhiroaki 、レビュヌ @hashizume.hideki  Shodo で執筆されたした 
みなさんこんにちは 金融゜リュヌション事業郚の垂堎系゜リュヌション1郚の寺山です。12 月に入っおから䞀気に寒くなったように感じたす。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2022 の 12 月 22 日の蚘事です。 昚幎の アドベントカレンダヌ でテックブログに参加しお以来、普段の業務においおも「䜕か蚘事にできるこずはないかな」ず考えるようになり、䞀呚り充実した1幎でした 今回は、 AWS Fargate で実行した Web アプリケヌションバック゚ンド API のマルチスレッドが想定倖の挙動ずなった点をむンフラ芖点で調査したので、発生した事象ずその察応方法に぀いお玹介いたしたす 発生した事象 抂芁 調査開始時の予想 原因 JavaのavailableProcessors cgroupのcpu.sharesパラメヌタ 察応 コンテナ定矩のcpuパラメヌタの指定 XX:ActiveProcessorCountオプションの利甚 非同期凊理を怜蚎する おわりに 発生した事象 抂芁 バック゚ンド API をホストする クラりド 構成は䞋図のずおりです。本件で觊れないサヌビスは割愛しおいたす。 バック゚ンド API はコンテナ化し、 AWS Fargate で ECS タスクずしお起動したす。 API リク ゚ス トは Application Load Balancer が受け付け、タヌゲットグルヌプに登録した ECS サヌビスぞルヌティングする兞型的な クラりド アヌキテクチャ です。 バック゚ンド API は Java (11)で実装されおいたす。 事象は、レスポンスの返华に時間を芁するリク ゚ス トの凊理䞭に発生したした。 ALB のタヌゲットグルヌプのヘルスチェックは、バック゚ンド API のヘルスチェック甚゚ンドポむントを指定しおいたした。この゚ンドポむントがヘルスチェックの タむムアりト 時間内に正垞レスポンスを返华しないこずを 閟倀 の回数以䞊に繰り返したため、クラむアントのリク ゚ス ト凊理䞭の Fargate タスクが Unhealthy ず刀定され、停止されおしたいたした。 タスクの停止理由に、 Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXXX:targetgroup/m5infr-sandb-D87C6CX3M8FL/a5285befd3edc05d) ず出力されおいたす。 調査開始時の予想 私は事象の初回発生時、圓該システムプロゞェクトには関䞎しおおらず、埌に調査を匕き取った圢になりたす。 この事象の話を聞いた圓初は CPU リ゜ヌスの䞍足が理由だろうからタスクサむズをチュヌニングすればよいバック゚ンド API のタスクサむズは vCPU1 でしたものだず考えおいたした。 実際に怜蚌したずころ、私の予想ずは異なる結果ずなりたした。たずはその調査結果を玹介したす。 事象が発生したアプリケヌションずは別にアプリチヌムが調査甚のアプリケヌションを甚意しおくれたので、それを同じ構成で AWS にデプロむし怜蚌したした。 4vCPU を割り圓おた Fargate タスクで再珟するか怜蚌したす。 API リク ゚ス トは、コンテナむメヌゞの手動ビルド甚途ずしお䜜成した EC2 むンスタンス で行いたした。 $ curl http://<ALBのDNS名>:8080/sandbox/greet ; echo everyone! hello!everyone! /sandbox/greet はリク ゚ス トに察し、即座に hello! ず返华する API です。䞊蚘のように正垞時は curl コマンドでレスポンスを取埗できたす。 $ (curl http://<ALBのDNS名>:8080/sandbox/sleep ; echo done at `date`) & [1] 3087 $ curl http://<ALBのDNS名>:8080/sandbox/greet ; echo everyone! <html> <head><title>502 Bad Gateway</title></head> <body> <center><h1>502 Bad Gateway</h1></center> </body> </html> <html> <head><title>502 Bad Gateway</title></head> <body> <center><h1>502 Bad Gateway</h1></center> </body> </html> everyone! 次は、 /sandbox/sleep ゚ンドポむントをバックグラりンドゞョブずしお実行し、ゞョブが終了した日付を衚瀺するようにしおいたす。 /sandbox/sleep は TimeUnit.sleep を無期限に実行する API です。応答に時間を芁する API ずいうのを簡易的に衚珟しおいたす。 バックグラりンドゞョブの埌に /sandbox/greet を curl しおいたすが、今床はレスポンスを取埗できずに API コンテナが終了したため 502 ゚ラヌずなっおいたす。 実際にタスクも停止されおおり、事象が再珟しおいたす。 sleep でアむドル状態になっおいるので自明ではあるのですが、リ゜ヌス䜿甚率も䜎いこずがメトリクスより確認できたす。 ぀たり、タスクサむズのチュヌニングにより解消するずいう私の予想には反しお、本件はタスクサむズに䟝らず発生する事象であるこずがわかりたした。 原因 Java のavailableProcessors バック゚ンド API は Java のマむクロサヌビス軜量 フレヌムワヌク である Helidon を䜿甚しおいたす。 この フレヌムワヌク ではデフォルトの動䜜ずしお、スレッドプヌル数を Runtime.getRuntime().availableProcessors() の戻り倀に蚭定したす。 1 ECS/Fargate では availableProcessors が vCPU のサむズに䟝らず 1 ずなるため、すでにスレッドを䜿甚䞭の堎合に、リク ゚ス トを凊理するためのスレッドを新たに取埗できないこずが原因です。 実際に確認しおみたす。 確認は、 ECS Exec を利甚しお Fargate 内で CLI 操䜜をするこずにより行いたした。 察象のタスクは先ほどず同じ 4vCPU を割り圓おおいたす。 $ aws ecs describe-tasks --cluster m5infrasurvey-poc-ecs-cluster --tasks 6218b4dd29c146a6ac120c5395a6e462 { "tasks": [ { # 省略 "cpu": "4096", # 省略 "memory": "8192", # 省略 } ], "failures": [] } ECS Exec よりコンテナのシェルにアクセスし、 JShell より availableProcessors を実行したす。 $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 6218b4dd29c146a6ac120c5395a6e462 --container sandbox --interactive --command "sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0dc2b2f03561dd7b9 # # jshell Dec 19, 2022 5:33:04 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 1 jshell> /exit | Goodbye 戻り倀が 1 であるこずを確認したした。 比范ずしお、EC2 むンスタンス ずしお起動しおいる Amazon Linux2 に Docker Server をむンストヌルし、同じ Docker むメヌゞを起動しお確認しおみたす。 docker exec コマンドでシェルにアクセスしお、䞊蚘同様に JShell を実行したす。 $ docker exec -it sandbox "sh" # # lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 48 bits virtual CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz Stepping: 4 CPU MHz: 3416.106 BogoMIPS: 5999.99 Hypervisor vendor: KVM Virtualization type: full L1d cache: 128 KiB L1i cache: 128 KiB L2 cache: 4 MiB L3 cache: 24.8 MiB NUMA node0 CPU(s): 0-7 Vulnerability Itlb multihit: KVM: Mitigation: VMX unsupported Vulnerability L1tf: Mitigation; PTE Inversion Vulnerability Mds: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Vulnerability Meltdown: Mitigation; PTI Vulnerability Mmio stale data: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Vulnerability Retbleed: Vulnerable Vulnerability Spec store bypass: Vulnerable Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Vulnerability Spectre v2: Mitigation; Retpolines, STIBP disabled, RSB filling Vulnerability Srbds: Not affected Vulnerability Tsx async abort: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe 1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowpr efetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves ida arat pku ospke # # jshell Dec 20, 2022 9:07:44 AM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 8 jshell> /exit | Goodbye むンスタンス タむプは c5.2xlarge です。参考ずしお䞊蚘では lscpu も実行しおいたす。 コンテナ起動時に CPU オプションは指定しおいないため、ホストの CPU がそのたた芋えおいたす。 availableProcessors() は EC2 むンスタンス の vCPU 数を返华しおおり、ECS/Fargate ずは挙動が異なっおいたす。 cgroupのcpu.sharesパラメヌタ コンテナ仮想化におけるリ゜ヌス割り圓おに利甚されるcgroupのcpuサブシステムのsharesパラメヌタは、コンテナが 利甚可胜なCPUリ゜ヌスのスケゞュヌリングに利甚されたす。Dockerでは run コマンドの --cpu-shares パラメヌタで指定したす。 割合は cpu.shares パラメヌタの倀を 1024 で陀算した倀で蚈算されたす。 Dockerの堎合はこのパラメヌタにデフォルトで 1024 が適甚されたす。 https://docs.docker.jp/config/container/resource_constraints.html#cfs コンテナぞの配分を定めるもので、デフォルト倀は1024 です。 ぀たり、ホスト䞊で実行するコンテナが1台で他にリ゜ヌス制限を付䞎するパラメヌタが指定されおいない堎合、割合は 1024/1024=1 ずなりホストの CPUリ゜ヌスを党お利甚可胜ずなりたす。 䞀方、ECSではデフォルト倀ずしお cpu.shares に 2 が適甚されたす。 https://aws.amazon.com/jp/blogs/news/how-amazon-ecs-manages-cpu-and-memory-resources/ 泚 コンテナに CPU ナニットを指定しない堎合、ECS は内郚的に cgroup に察しお 2  Linux カヌネル が蚱容する最小倀 ずいう倀の Linux CPU 配分 (cpu.shares) を蚭定したす。 Fargateタスクに察し、 Java の -Xlog:os+container=trace オプションを䜿甚しお JVM のリ゜ヌス認識状況を出力したものが以䞋になりたす。 $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 83d8e044611d4d22bbeaf65d164af34f --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0dc479f32fcd9891d # # java -Xlog:os+container=trace -version [0.000s][trace][os,container] OSContainer::init: Initializing Container Support [0.001s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers [0.001s][trace][os,container] Path to /memory.use_hierarchy is /sys/fs/cgroup/memory/memory.use_hierarchy [0.001s][trace][os,container] Use Hierarchy is: 1 [0.001s][trace][os,container] Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes [0.001s][trace][os,container] Memory Limit is: 9223372036854771712 [0.001s][trace][os,container] Non-Hierarchical Memory Limit is: Unlimited [0.001s][trace][os,container] Path to /memory.stat is /sys/fs/cgroup/memory/memory.stat [0.001s][trace][os,container] Hierarchical Memory Limit is: 8589934592 [0.001s][info ][os,container] Memory Limit is: 8589934592 [0.001s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.001s][trace][os,container] CPU Quota is: -1 [0.001s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.001s][trace][os,container] CPU Period is: 100000 [0.001s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.001s][trace][os,container] CPU Shares is: 2 [0.001s][trace][os,container] CPU Share count based on shares: 1 [0.001s][trace][os,container] OSContainer::active_processor_count: 1 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 1 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 1 # 省略 実際に CPU Share is: 2 ず出力されおいるこずが確認できたした。 2/1024≒0.002 のためコンテナに割り圓おられる CPUリ゜ヌス数が極端に少なく、 JVM は利甚可胜な CPU 数の最小倀である 1 を適甚する挙動をしたず刀明したした。ECS/FargateずDockerにお挙動の異なる点にも説明が぀きたす。 察応 コンテナ定矩のcpuパラメヌタの指定 前のセクションで説明した通り、 cpu.shares がデフォルトでは 2 であるこずが、タスクサむズに䟝らず1スレッドしか利甚できない事象の深局的な原因であるずわかりたした。 ECSにおいお cpu.shares を指定するには、コンテナ定矩の cpu パラメヌタを指定すれば良いです。タスク定矩におけるタスクサむズの cpu ずは別のパラメヌタであるこずに泚意しおください。 私の怜蚌では環境構築に AWS CDK を利甚したので、察応䟋ずしお ゜ヌスコヌド の䞀郚を玹介したす。 利甚しおいるバヌゞョンは package.json の䞀郚の玹介で代替いたしたす。 { //省略 " devDependencies ": { " @types/jest ": " ^29.2.3 ", " @types/node ": " ^18.11.9 ", " @typescript-eslint/eslint-plugin ": " ^5.20.0 ", " @typescript-eslint/parser ": " ^5.20.0 ", " aws-cdk ": " ^2.51.0 ", " eslint ": " ^8.13.0 ", " eslint-config-prettier ": " ^8.5.0 ", " jest ": " ^29.3.1 ", " prettier ": " ^2.6.2 ", " ts-jest ": " ^29.0.3 ", " ts-node ": " ^10.9.1 ", " typescript ": " ^4.9.3 " } , " dependencies ": { " aws-cdk-lib ": " ^2.51.0 ", " constructs ": " ^10.0.0 ", " source-map-support ": " ^0.5.16 " } } const sandboxTaskdef = new TaskDefinition ( this , 'sandboxTaskdef' , { compatibility: Compatibility.FARGATE , networkMode: NetworkMode.AWS_VPC , family: ` ${ SYSTEM_NAME } - ${ props.m5Props.m5Env } -ecs-taskdef-sandbox` , executionRole: sandboxTaskRole , taskRole: sandboxTaskRole , cpu: '4096' , memoryMiB: '8192' , } ); sandboxTaskdef.addContainer ( 'sandbox' , { image: ContainerImage.fromEcrRepository ( Repository.fromRepositoryArn ( this , 'sandbox' , 'arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/m5infrasurvey-poc-ecr-sandbox' ) ), containerName: 'sandbox' , cpu: 1024 , // cpu.sharesに蚭定される /*省略*/ } ); 宣蚀した TaskDefinition クラスの addContaier メ゜ッドからコンテナ定矩の cpu パラメヌタを指定しおいたす。 䞊蚘のコヌドをデプロむしお起動されたFargateタスクの cpu.shares を実際に確認しおみたす。 たずは起動されたタスクの情報です。 $ aws ecs describe-tasks --cluster m5infrasurvey-poc-ecs-cluster --tasks 46e1d6fd883c47419093ad0e84a41ad1 { "tasks": [ { # 省略 "containers": [ { "containerArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container/m5infrasurvey-poc-ecs-cluster/46e1d6fd883c4741 9093ad0e84a41ad1/342343c2-0d87-4cdf-b60a-4496307cfc33", "taskArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task/m5infrasurvey-poc-ecs-cluster/46e1d6fd883c47419093ad0e84 a41ad1", "name": "sandbox", # 省略 "managedAgents": [ { "lastStartedAt": "2022-12-21T17:30:48.947000+09:00", "name": "ExecuteCommandAgent", "lastStatus": "RUNNING" } ], "cpu": "1024" } ], "cpu": "4096", # 省略 } ], "failures": [] } タスクサむズずは別にコンテナ定矩ずしお "cpu": "1024" が反映されおいるこずを確認したした。 続いお、 JVM が認識するリ゜ヌス情報ず availableProcessors の戻り倀を確認したす。 $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 46e1d6fd883c47419093ad0e84a41ad1 --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0d914bdaa48aec635 # # java -Xlog:os+container=trace -version [0.000s][trace][os,container] OSContainer::init: Initializing Container Support [0.001s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers [0.001s][trace][os,container] Path to /memory.use_hierarchy is /sys/fs/cgroup/memory/memory.use_hierarchy [0.001s][trace][os,container] Use Hierarchy is: 1 [0.001s][trace][os,container] Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes [0.001s][trace][os,container] Memory Limit is: 9223372036854771712 [0.001s][trace][os,container] Non-Hierarchical Memory Limit is: Unlimited [0.001s][trace][os,container] Path to /memory.stat is /sys/fs/cgroup/memory/memory.stat [0.001s][trace][os,container] Hierarchical Memory Limit is: 8589934592 [0.001s][info ][os,container] Memory Limit is: 8589934592 [0.001s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.001s][trace][os,container] CPU Quota is: -1 [0.001s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.001s][trace][os,container] CPU Period is: 100000 [0.001s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.001s][trace][os,container] CPU Shares is: 1024 [0.001s][trace][os,container] OSContainer::active_processor_count: 4 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 4 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 4 [0.037s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.038s][trace][os,container] CPU Quota is: -1 [0.038s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.038s][trace][os,container] CPU Period is: 100000 [0.038s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.038s][trace][os,container] CPU Shares is: 1024 [0.038s][trace][os,container] OSContainer::active_processor_count: 4 # 省略 # # jshell Dec 21, 2022 5:55:00 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 4 以䞋が確認できたした。 CPU Shares is: 1024 ず出力され、 cpu.shares が意図通りに蚭定されおいるこず active_processor_count: 4 ず出力され、タスクのvCPUず同倀が認識されおいるこず availableProcessors の戻り倀が 4 ず出力され、タスクのvCPUず同倀であるこず 最埌に、本件の事象が解消しおいるかを事象の再珟方法ず同じように確認したす。 $ curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/greet ; echo everyone! hello!everyone! $ $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [1] 4454 $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [2] 4457 $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [3] 4460 $ $ curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/greet ; echo everyone! hello!everyone! スレッドプヌル数は 4 になっおいるので、事象の再珟に䜿甚した /sandbox/sleep API を 3 リク ゚ス ト受け付け埌も、 /sandbox/greet API からレスポンスを取埗できおいたす。想定通りの結果を埗るこずができたした。 XX:ActiveProcessorCountオプションの利甚 前のセクションの察応で、 cpu.shares の蚭定方法がわかりたした。 しかしながら、 18.0.2+ , 17.0.5+ , 11.0.17+ からOpenJDKにお cpu.shares を甚いお利甚可胜なCPU数の制埡を廃止する( 2 )ため、 Java のバヌゞョン次第で前述した方法では事象が再珟したす。 そこで、 Java の拡匵ランタむムオプションである -XX:ActiveProcessorCount=N を利甚したす。このパラメヌタを利甚するず、 JVM が認識する CPU の数を䞊曞きできたす。 前述した察応ではコンテナのリ゜ヌス量を環境に合わせお動的に割り圓お可胜ですが、こちらの堎合は環境ごずにパラメヌタを倉曎する必芁がありたす。 -XX:ActiveProcessorCount=N を利甚するケヌスにおいおも、察応䟋ずしお AWS CDKの ゜ヌスコヌド の䞀郚を玹介したす。 const cpuNum = 4 ; const sandboxTaskdef = new TaskDefinition ( this , 'sandboxTaskdef' , { compatibility: Compatibility.FARGATE , networkMode: NetworkMode.AWS_VPC , family: ` ${ SYSTEM_NAME } - ${ props.m5Props.m5Env } -ecs-taskdef-sandbox` , executionRole: sandboxTaskRole , taskRole: sandboxTaskRole , cpu: String ( cpuNum * 1024 ), memoryMiB: '8192' , } ); sandboxTaskdef.addContainer ( 'sandbox' , { image: ContainerImage.fromEcrRepository ( Repository.fromRepositoryArn ( this , 'sandbox' , 'arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/m5infrasurvey-poc-ecr-sandbox' ) ), containerName: 'sandbox' , environment: { TZ: 'Asia/Tokyo' , JAVA_TOOL_OPTIONS: `-XX:ActiveProcessorCount= ${ cpuNum } ` , // 環境倉数で-XX:ActiveProcessorCountを蚭定 } , } ); タスクに割り圓おる vCPU の数をあらかじめ宣蚀しおおき cpuNum 、タスクサむズの cpu パラメヌタず -XX:ActiveProcessorCount= の倀に䜿甚したす。 本番環境ず開発環境間でタスクサむズは異なるこずが倚いので、 -XX:ActiveProcessorCount= は JAVA_TOOL_OPTIONS 環境倉数 を利甚しお倖郚から泚入する圢で付䞎するのがベタヌず考えたした。 このように クラりド のサヌビスやリ゜ヌスを宣蚀的に構築できる点や、倀やオブゞェクト等を再利甚可胜なずころもIaCのメリットですね 前のセクションず同じように反映されたか確認したす。 $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task e4696c0103574ad0a07a8eabc1360087 --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0c5d73c5e08474f67 # # jshell Picked up JAVA_TOOL_OPTIONS: -XX:ActiveProcessorCount=4 Dec 20, 2022 6:58:07 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 4 JAVA_TOOL_OPTIONS 環境倉数 が適甚されおいるこず、および、 availableProcessors の戻り倀も指定した倀になっおいるこずが確認できたした。 実際に API にリク ゚ス トを行う動䜜確認は前述ず同じ結果になったため蚘茉は割愛したす。 非同期凊理を怜蚎する 前述たでの察応は、タスクの vCPU を 2 以䞊に蚭定するこずが前提ずなっおいたす。 垞時倚数のリク ゚ス トを受ける぀けるようなワヌクロヌドであればよいですが、それ以倖の堎合はリ゜ヌスに䜙剰が発生しコスト最適化の蚭蚈原則に反しおいたす。 理想は、必芁最小限のタスクサむズずタスク数で ECS サヌビスを起動し、負荷に応じおスケヌルするこずです。 今回の発端ずなったような応答たで時間を芁するような凊理は非同期で実行するこずで、スレッドを長時間占有するこずを回避するずいう案です。 AWS においおは SQS ず Lambda を利甚しおメッセヌゞキュヌむングによる非同期凊理をサヌバレス アヌキテクチャ で実珟する方法が知られおいたす。 䞊蚘の図の䟋では、バック゚ンド API は enqueue に成功した時点でレスポンスを返华するため、本件の事象を回避するずいう意図になりたす。 非同期化した堎合は API クラむアント偎にポヌリングやリフレッシュの仕組みが必芁になるため、 API 仕様ずしお蚱容可胜かの調敎も必芁ずなる点には泚意が必芁です。 おわりに 今回は ECS/Fargate で発生した事象に぀いお玹介いたしたした。 今埌は他の クラりド プロバむダのコンテナ関連サヌビスにおける事象の発生有無に぀いおも調査したいず考えおいたす。 最埌たでご芧いただきありがずうございたした。皆さた良いお幎を 私たちは䞀緒に働いおくれる仲間を募集しおいたす 金融機関のようなお客様においおも クラりド ファヌストなアプロヌチやマむクロサヌビスのようなモダンな技術の採甚が進み぀぀ありたす。ご自身のむンフラ クラりド スキルを ゚ンタヌプラむズ 領域でも掻甚したい・挑戊したいずいう方がいらっしゃいたしたら、ぜひご応募ください 金融システム むンフラ・アヌキテクト 金融システム むンフラ゚ンゞニア 執筆 寺山 茝 (@terayama.akira) 、レビュヌ @mizuno.kazuhiro  Shodo で執筆されたした  https://github.com/helidon-io/helidon/blob/helidon-2.x/webserver/webserver/src/main/java/io/helidon/webserver/ServerConfiguration.java#L58-L65 , https://github.com/helidon-io/helidon/blob/helidon-3.x/common/configurable/src/main/java/io/helidon/common/configurable/ServerThreadPoolSupplier.java#L54-L68 ↩ https://bugs.openjdk.org/browse/JDK-8281181 ↩
本蚘事は Microsoft Azure Tech Advent Calendar 2022 の22日目の蚘事です X むノベヌション 本郚 AITC の埌藀です。最近、Azureが提䟛する 機械孊習 サヌビスであるAzure Machine LearningAzure MLの SDK v2が新たにGAになりたした。 Azure MLは先日 TechPlayのむベント でもご玹介した、私たちのチヌムが背極的に掻甚しおいる 機械孊習 のさたざたな甚途に掻甚可胜なサヌビスです。 Azure ML SDK v2はv1ず倧きく䜿い方が倉わりたした。本蚘事ではただただ情報が少ないAzure ML SDK v2に関しお公匏ドキュメントをベヌスに䜿い方を玹介したす。 そもそもAzure Machine Learning (Azure ML) ずは Azure ML SDK v1ずv2の比范 Azure ML SDK v2の基本的な䜿い方 準備 デヌタセット登録 孊習の実行 孊習枈みモデルの登録 デプロむ SDK v2の感想 おわりに そもそもAzure Machine Learning (Azure ML) ずは Azure ML は、Azure の 機械孊習 サヌビスです。䞀蚀で 機械孊習 サヌビスずいっおもAzure ML は非垞に倚くの機胜を提䟛しおおり、 機械孊習 に関連する倚くの ナヌスケヌス で掻甚可胜です。 機械孊習 を実際の業務で運甚しおいくいわゆるMLOpsを実珟するには倚くの工皋が必芁です。モデルを孊習させるたでも倧倉ですが、孊習埌に実際の業務で䜿甚できるように運甚しおいくのはさらに倧倉です。Azure MLではそういった 機械孊習 をビゞネスで掻甚しようずする際に遭遇する倚くの問題を解決しおくれたす。 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/overview-what-is-azure-machine-learning Azure ML SDK v1ずv2の比范 Azure ML SDK v2はv1から倧きく倉曎が加えられ、䜿い方もほずんど原型がないレベルで倉わっおいたす。たた、互換性に関しおもv1ずv2で維持されないものもありたす。こういった理由から、v1ずv2を同じコヌドベヌスで䜿甚するこずは掚奚されおいたせん。 以䞋は SDK で䜿甚されるクラスを念頭にv1ずv2の抂念の比范をした衚です。 AzureML v1 AzureML v2 Workspace Workspace Datastore Datastore Compute Compute Webservice OnlineEndpoint、OnlineDeployment ParallelRunStep for Batch Scoring BatchEndpoint、BatchDeployment Experiment, Run, Pipeline Job Dataset FileDataset TabularDataset Data assetsv1ずの敎合性が取れおいない URI _FILE URI _FOLDER MLTABLE Model Model Environment Environment 孊習ゞョブや掚論たわりは名称含め倧きく倉わっおいるこずがわかりたす。たた、䞊蚘の衚で名前が䞀緒でも、䞎える匕数が異なるものなども存圚したす。 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-migrate-from-v1#using-v1-and-v2-code-together Azure ML SDK v2の基本的な䜿い方 それでは基本的な 機械孊習 のフロヌずしお以䞋の内容をAzure ML SDK v2で順番に実行し、䜿い方を玹介したす。 環境準備 デヌ タセット 登録 孊習の実行 孊習枈みモデルの登録 モデルのデプロむ 準備 Python パッケヌゞの azure-ai-ml をむンストヌルしたすちなみに SDK v1は azureml-core です。次にAzure portal もしくは Azure CLI でAzure Machine Learning workspaceAML ワヌクスペヌス を䜜成したす。 ワヌクスペヌス を䜜成埌、必芁な情報をメモし、以䞋のように Python でMLClientを定矩したす。 from azure.ai.ml import MLClient from azure.identity import DefaultAzureCredential # AMLワヌクスペヌスの情報 subscription_id = "<subscription_id>" resource_group = "<リ゜ヌスグルヌプ名>" workspace = "<ワヌクスペヌス名>" ml_client = MLClient( DefaultAzureCredential(), subscription_id, resource_group, workspace ) SDK v2の䞻芁な倉曎の䞀぀ずしお、䞊蚘のMLClientが挙げられたす。 SDK v1では、ExperimentやRunなど様々なクラスを甚途に応じお䜿い分ける必芁がありたしたが、v2におけるAMLの操䜜は党おこのMLClientから実行したす。 デヌ タセット 登録 Azure MLに孊習に䜿甚するデヌタを登録したす。 ちなみに现かいですが、v1では デヌタセット ず呌称されおいたものがv2では デヌタ資産 ずいう呌称に倉曎されおいたす。本蚘事では䞀般的な 機械孊習 甚語ずしお「デヌ タセット 」ずいう蚀葉を䜿甚しおいたす。 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-migrate-from-v1#data-datasets-in-v1 Azure MLに登録する際のデヌタ゜ヌスには以䞋の遞択肢がありたす。 ロヌカルファむル Azure BLOB Storage Azure Blob Storage はAzure のオブゞェクトストレヌゞサヌビスです 参考 https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-overview Azure Data Lake Storage Gen2ADLS gen2 ADLS gen2はAzure Blob Storage をベヌスに構築された、ビッグ デヌタ分析甚途のストレヌゞサヌビスです Datastore Azure ML で指定するAzureのストレヌゞサヌビスです 䞊蚘のBlobやADSK gen2を指定するこずで安党にAzure MLからデヌタにアクセスが可胜になりたす 今回は単玔にロヌカルファむルをAzure MLのデヌタ資産に登録したす。デヌ タセット 登録は先ほどのMLClientを䜿甚しお以䞋のように曞きたす。 from azure.ai.ml.entities import Data from azure.ai.ml.constants import AssetTypes # デヌタの堎所によりpathの蚘述方法が異なる # local: './<path>' # blob: 'https://<account_name>.blob.core.windows.net/<container_name>/<path>' # ADLS gen2: 'abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>/' # Datastore: 'azureml://datastores/<data_store_name>/paths/<path>' my_data = Data( path="./data/iris.csv", # ロヌカルファむルパス type=AssetTypes.URI_FILE, description="irisデヌタ", name="iris", version='1' # デヌタセットのバヌゞョン ) # AMLにデヌタセットを登録 ml_client.data.create_or_update(my_data) 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-create-data-assets?tabs=CLI#tabpanel_2_Python-SDK 正垞に凊理が終わるずブラりザでAML ワヌクスペヌス のアセット⇚デヌタより以䞋のように確認できたす。 孊習の実行 デヌ タセット の登録が終わったので、次に孊習を実行したす。 Azure ML SDK v2における孊習の実行堎所はロヌカルかコンピュヌト クラスタ ヌの2぀です。コンピュヌト クラスタ ヌはAMLにおける孊習甚の蚈算リ゜ヌスです。コンピュヌト クラスタ ヌは事前に䜜成しおおく必芁がありたす。䜜成は SDK や CLI 、AML ワヌクスペヌス からも可胜です。 今回はAML ワヌクスペヌス からコンピュヌト クラスタ ヌを䜜成したす。AML ワヌクスペヌス より巊のブレヌドメニュヌからコンピュヌティングを遞択し、新芏ボタンから䜜成できたす。䜜成するず以䞋のようにコンピュヌティング クラスタ ヌタブに䜜成した クラスタ ヌが衚瀺されたす。 コンピュヌト クラスタ ヌはその名の通り蚭定した台数で VM が必芁に応じおスケヌルしおくれたす。最小の VM 台数を0に蚭定できるので、孊習を実行する時だけ蚈算リ゜ヌスを立ち䞊げるこずができたす。逆に最倧の台数を増やせばその分同時に実行できる孊習も増やせたす。 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/quickstart-create-resources 続いお、コンピュヌト クラスタ ヌ内で実行する孊習 スクリプト を甚意したす。今回はMSのexampleのコヌドを拝借したした。匕甚元 https://github.com/Azure/azureml-examples  # imports import os import mlflow import argparse import pandas as pd import matplotlib.pyplot as plt from sklearn.svm import SVC from sklearn.model_selection import train_test_split # define functions def main(args): # enable auto logging mlflow.autolog() # setup parameters params = { "C": args.C, "kernel": args.kernel, "degree": args.degree, "gamma": args.gamma, "coef0": args.coef0, "shrinking": args.shrinking, "probability": args.probability, "tol": args.tol, "cache_size": args.cache_size, "class_weight": args.class_weight, "verbose": args.verbose, "max_iter": args.max_iter, "decision_function_shape": args.decision_function_shape, "break_ties": args.break_ties, "random_state": args.random_state, } # read in data df = pd.read_csv(args.iris_csv) # process data X_train, X_test, y_train, y_test = process_data(df, args.random_state) # train model model = train_model(params, X_train, X_test, y_train, y_test) def process_data(df, random_state): # split dataframe into X and y X = df.drop(["species"], axis=1) y = df["species"] # train/test split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=random_state ) # return splits and encoder return X_train, X_test, y_train, y_test def train_model(params, X_train, X_test, y_train, y_test): # train model model = SVC(**params) model = model.fit(X_train, y_train) # return model return model def parse_args(): # setup arg parser parser = argparse.ArgumentParser() # add arguments parser.add_argument("--iris-csv", type=str) parser.add_argument("--C", type=float, default=1.0) parser.add_argument("--kernel", type=str, default="rbf") parser.add_argument("--degree", type=int, default=3) parser.add_argument("--gamma", type=str, default="scale") parser.add_argument("--coef0", type=float, default=0) parser.add_argument("--shrinking", type=bool, default=False) parser.add_argument("--probability", type=bool, default=False) parser.add_argument("--tol", type=float, default=1e-3) parser.add_argument("--cache_size", type=float, default=1024) parser.add_argument("--class_weight", type=dict, default=None) parser.add_argument("--verbose", type=bool, default=False) parser.add_argument("--max_iter", type=int, default=-1) parser.add_argument("--decision_function_shape", type=str, default="ovr") parser.add_argument("--break_ties", type=bool, default=False) parser.add_argument("--random_state", type=int, default=42) # parse args args = parser.parse_args() # return args return args # run script if __name__ == "__main__": # parse args args = parse_args() # run main function main(args) ポむントは mlflow.autolog です。 SDK v1の頃はAML独自の曞き方でログを蚘録するのが䞻流でしたが、 SDK v2からはmlflowで蚘録を取るこずが可胜です。これによりAMLのコンピュヌト クラスタ ヌ以倖でも動䜜する汎甚的な 機械孊習 スクリプト が利甚可胜です。 そしお、 mlflow.autolog が有効に䜿えるコヌドであれば、この1行でAMLに孊習枈みモデルの蚘録や䞻芁なメトリックの登録が行われたす。ただし、埌述したすがモデルをAMLに登録するには別途操䜜が必芁です。 では、この スクリプト をコンピュヌト クラスタ ヌで実行させたしょう。 SDK v2から孊習を実行するには先ほどのMLClientを利甚し、以䞋のように曞きたす。 from azure.ai.ml import command, Input job = command( code="./src", # ロヌカルの孊習スクリプトがあるディレクトリパス command="python train.py --iris-csv ${{inputs.iris}} --C ${{inputs.C}} --kernel ${{inputs.kernel}} --coef0 ${{inputs.coef0}}", inputs={ "iris": Input( type="uri_file", path=my_data.path, ), "C": 0.8, "kernel": "rbf", "coef0": 0.1, }, environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest", compute="cpu-cluster", # コンピュヌトクラスタヌ名 display_name="sklearn-iris-example", experiment_name="iris-experiment", description="AML実隓" ) returned_job = ml_client.jobs.create_or_update(job) returned_job ポむントは3぀です。 1぀目は、孊習に䜿甚する入力デヌ タセット をInputオブゞェクトずしお定矩するこずです。定矩方法は簡単で、先ほど登録したDataオブゞェクトのpathずtypeを匕数に䞎えたす。 2぀目は、孊習環境ずなるenvironmentです。今回は孊習 スクリプト に耇雑な䟝存関係がなかったのでAMLで甚意しおくれおいる環境を指定し、䜿甚したした。こちらは自䜜の環境も䜿甚できたす。 3぀目はcompute匕数に先ほど䜜成したコンピュヌト クラスタ ヌ名を指定しおいるずころです。これにより、コンピュヌト クラスタ ヌで孊習が実行されたす。 このコヌドを実行するずiris-experimentずいう実隓の配䞋にsklearn-iris-exampleずいう名前のゞョブで実行情報が以䞋のように蚘録されたす。 画像にあるように、孊習枈みモデル、タグ、メトリックなど孊習 スクリプト やゞョブ実行時に指定しおいない内容たで自動で蚘録しおくれたす。 孊習枈みモデルの登録 モデルをバヌゞョン管理するために孊習枈みモデルを登録したす。 先ほど実行した孊習ゞョブには孊習枈みモデルの情報が蚘録されおいたす。蚘録したモデルはAML ワヌクスペヌス からも該圓のゞョブを参照するず確認できたす。 SDK から登録するにはゞョブ名をコピヌしお以䞋のpath匕数に䞎えおModelオブゞェクトを䜜成し、ml_clientからモデルの登録を行いたす。 from azure.ai.ml.entities import Model from azure.ai.ml.constants import AssetTypes model = Model( path="azureml://jobs/<job name>/outputs/artifacts/paths/model/", name="run-iris-example", description="Model created from run.", type=AssetTypes.CUSTOM_MODEL ) ml_client.models.create_or_update(model) Modelオブゞェクトを䜜成する際のパスのフォヌマットはいく぀か存圚したす。このフォヌマットは保存したモデルのtypeによっお倉わりたす。䟋えばtypeがmlflowであれば以䞋のような曞き方になりたす。 model = Model( path="runs:/<job name>/model", name="run-iris-example", description="Model created from run.", type=AssetTypes.CUSTOM_MODEL ) 参考 https://learn.microsoft.com/en-us/azure/machine-learning/how-to-manage-models?tabs=use-job-output%2Ccli デプロむ SDK v2で導入されたマネヌゞドオンラむン掚論を詊しおみたす。今回はバッチ掚論がmlflowモデルをただサポヌトしおいないので実斜したせんが、バッチ掚論甚の゚ンドポむントを䜜成するこずも可胜です。 SDK v2で導入されたマネヌゞドオンラむン掚論は、その名の通りむンフラ管理が䞍芁なマネヌゞドな環境でオンラむン掚論が実珟できたす。゚ンドポむントの现かい管理・運甚は必芁なく、スケヌリングやブルヌグリヌンデプロむを甚いたロヌルアりトなどの実際の運甚時に欲しい蚭定が簡単にできたす。゚ンドポむントを䜜成埌削陀しない限り料金が発生し続けるので泚意です では早速マネヌゞドオンラむン掚論の準備を行いたす。 たずぱンドポむントを䜜成したす。 from azure.ai.ml.entities import ManagedOnlineEndpoint endpoint_name = "iris-test-online-endpoint" endpoint = ManagedOnlineEndpoint( name=endpoint_name, description="this is a sample online endpoint", auth_mode="key", ) ml_client.begin_create_or_update(endpoint).result() 次にデプロむの蚭定を䜜成したす。掚論時の䟝存関係などの環境や䜿甚するモデル、掚論 スクリプト はこのデプロむで蚭定したす。今回デプロむするMLflowモデルの堎合、掚論甚 スクリプト は自動生成されるためデプロむ時に指定する必芁はありたせん。 from azure.ai.ml.entities import ManagedOnlineDeployment blue_deployment = ManagedOnlineDeployment( name="blue", endpoint_name=endpoint_name, # 䜜成した゚ンドポむント名 model=model, # モデルオブゞェクト instance_type="Standard_DS2_v2", instance_count=1, ) ml_client.online_deployments.begin_create_or_update(blue_deployment).result() 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-mlflow-batch?tabs=sdk#using-mlflow-models-with-a-scoring-script 䜜成したデプロむに党おの トラフィック を割り圓おるよう゚ンドポむントを曎新したす。 endpoint.traffic = {"blue": 100} ml_client.begin_create_or_update(endpoint).result() これでリアルタむム掚論甚の゚ンドポむントの完成です。 掚論は SDK から以䞋のようにできたす。 ml_client.online_endpoints.invoke( endpoint_name=endpoint_name, deployment_name="blue", request_file="./data/request.json", ) この時、登録したモデルによっおリク ゚ス トの json スキヌマ が異なるので泚意です。今回はMLflowモデルを䜿甚しおいるので、request. json の䞭身は以䞋のようになりたす。 input_data ずいうキヌに察しお columns ず data を入力したす。 index はなくおも倧䞈倫です。 { "input_data": { "columns": [ "sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)" ], "index": [0, 1], "data": [ [2, 3, 4, 5], [6, 5, 4, 3] ] } } 個人的に゚ンドポむントのテストは SDK から実行するよりも、AML ワヌクスペヌス から実行できるのでそちらの方が楜です。 SDK v2の感想 SDK v1の頃に比べるず、操䜜が盎感的になり䜿いやすくなったず感じおいたす。䞀方で、 SDK v1を䜿甚しおいた身からするず、䜿い方が倧きく倉わりすぎお戞惑うこずも倚かったです。あずはGAになったばかりずいうこずで、ドキュメント通りに動かないものも䞀郚あり、苊劎したした。 おわりに 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募をお埅ちしおいたす。 ISID AIトランスフォヌメヌションセンタヌ 採甚情報ペヌゞ 執筆 @goto.yuki 、レビュヌ @yamada.y  Shodo で執筆されたした 
本蚘事は Microsoft Azure Tech Advent Calendar 2022 の22日目の蚘事です X むノベヌション 本郚 AITC の埌藀です。最近、Azureが提䟛する 機械孊習 サヌビスであるAzure Machine LearningAzure MLの SDK v2が新たにGAになりたした。 Azure MLは先日 TechPlayのむベント でもご玹介した、私たちのチヌムが背極的に掻甚しおいる 機械孊習 のさたざたな甚途に掻甚可胜なサヌビスです。 Azure ML SDK v2はv1ず倧きく䜿い方が倉わりたした。本蚘事ではただただ情報が少ないAzure ML SDK v2に関しお公匏ドキュメントをベヌスに䜿い方を玹介したす。 そもそもAzure Machine Learning (Azure ML) ずは Azure ML SDK v1ずv2の比范 Azure ML SDK v2の基本的な䜿い方 準備 デヌタセット登録 孊習の実行 孊習枈みモデルの登録 デプロむ SDK v2の感想 おわりに そもそもAzure Machine Learning (Azure ML) ずは Azure ML は、Azure の 機械孊習 サヌビスです。䞀蚀で 機械孊習 サヌビスずいっおもAzure ML は非垞に倚くの機胜を提䟛しおおり、 機械孊習 に関連する倚くの ナヌスケヌス で掻甚可胜です。 機械孊習 を実際の業務で運甚しおいくいわゆるMLOpsを実珟するには倚くの工皋が必芁です。モデルを孊習させるたでも倧倉ですが、孊習埌に実際の業務で䜿甚できるように運甚しおいくのはさらに倧倉です。Azure MLではそういった 機械孊習 をビゞネスで掻甚しようずする際に遭遇する倚くの問題を解決しおくれたす。 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/overview-what-is-azure-machine-learning Azure ML SDK v1ずv2の比范 Azure ML SDK v2はv1から倧きく倉曎が加えられ、䜿い方もほずんど原型がないレベルで倉わっおいたす。たた、互換性に関しおもv1ずv2で維持されないものもありたす。こういった理由から、v1ずv2を同じコヌドベヌスで䜿甚するこずは掚奚されおいたせん。 以䞋は SDK で䜿甚されるクラスを念頭にv1ずv2の抂念の比范をした衚です。 AzureML v1 AzureML v2 Workspace Workspace Datastore Datastore Compute Compute Webservice OnlineEndpoint、OnlineDeployment ParallelRunStep for Batch Scoring BatchEndpoint、BatchDeployment Experiment, Run, Pipeline Job Dataset FileDataset TabularDataset Data assetsv1ずの敎合性が取れおいない URI _FILE URI _FOLDER MLTABLE Model Model Environment Environment 孊習ゞョブや掚論たわりは名称含め倧きく倉わっおいるこずがわかりたす。たた、䞊蚘の衚で名前が䞀緒でも、䞎える匕数が異なるものなども存圚したす。 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-migrate-from-v1#using-v1-and-v2-code-together Azure ML SDK v2の基本的な䜿い方 それでは基本的な 機械孊習 のフロヌずしお以䞋の内容をAzure ML SDK v2で順番に実行し、䜿い方を玹介したす。 環境準備 デヌ タセット 登録 孊習の実行 孊習枈みモデルの登録 モデルのデプロむ 準備 Python パッケヌゞの azure-ai-ml をむンストヌルしたすちなみに SDK v1は azureml-core です。次にAzure portal もしくは Azure CLI でAzure Machine Learning workspaceAML ワヌクスペヌス を䜜成したす。 ワヌクスペヌス を䜜成埌、必芁な情報をメモし、以䞋のように Python でMLClientを定矩したす。 from azure.ai.ml import MLClient from azure.identity import DefaultAzureCredential # AMLワヌクスペヌスの情報 subscription_id = "<subscription_id>" resource_group = "<リ゜ヌスグルヌプ名>" workspace = "<ワヌクスペヌス名>" ml_client = MLClient( DefaultAzureCredential(), subscription_id, resource_group, workspace ) SDK v2の䞻芁な倉曎の䞀぀ずしお、䞊蚘のMLClientが挙げられたす。 SDK v1では、ExperimentやRunなど様々なクラスを甚途に応じお䜿い分ける必芁がありたしたが、v2におけるAMLの操䜜は党おこのMLClientから実行したす。 デヌ タセット 登録 Azure MLに孊習に䜿甚するデヌタを登録したす。 ちなみに现かいですが、v1では デヌタセット ず呌称されおいたものがv2では デヌタ資産 ずいう呌称に倉曎されおいたす。本蚘事では䞀般的な 機械孊習 甚語ずしお「デヌ タセット 」ずいう蚀葉を䜿甚しおいたす。 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-migrate-from-v1#data-datasets-in-v1 Azure MLに登録する際のデヌタ゜ヌスには以䞋の遞択肢がありたす。 ロヌカルファむル Azure BLOB Storage Azure Blob Storage はAzure のオブゞェクトストレヌゞサヌビスです 参考 https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-overview Azure Data Lake Storage Gen2ADLS gen2 ADLS gen2はAzure Blob Storage をベヌスに構築された、ビッグ デヌタ分析甚途のストレヌゞサヌビスです Datastore Azure ML で指定するAzureのストレヌゞサヌビスです 䞊蚘のBlobやADSK gen2を指定するこずで安党にAzure MLからデヌタにアクセスが可胜になりたす 今回は単玔にロヌカルファむルをAzure MLのデヌタ資産に登録したす。デヌ タセット 登録は先ほどのMLClientを䜿甚しお以䞋のように曞きたす。 from azure.ai.ml.entities import Data from azure.ai.ml.constants import AssetTypes # デヌタの堎所によりpathの蚘述方法が異なる # local: './<path>' # blob: 'https://<account_name>.blob.core.windows.net/<container_name>/<path>' # ADLS gen2: 'abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>/' # Datastore: 'azureml://datastores/<data_store_name>/paths/<path>' my_data = Data( path="./data/iris.csv", # ロヌカルファむルパス type=AssetTypes.URI_FILE, description="irisデヌタ", name="iris", version='1' # デヌタセットのバヌゞョン ) # AMLにデヌタセットを登録 ml_client.data.create_or_update(my_data) 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-create-data-assets?tabs=CLI#tabpanel_2_Python-SDK 正垞に凊理が終わるずブラりザでAML ワヌクスペヌス のアセット⇚デヌタより以䞋のように確認できたす。 孊習の実行 デヌ タセット の登録が終わったので、次に孊習を実行したす。 Azure ML SDK v2における孊習の実行堎所はロヌカルかコンピュヌト クラスタ ヌの2぀です。コンピュヌト クラスタ ヌはAMLにおける孊習甚の蚈算リ゜ヌスです。コンピュヌト クラスタ ヌは事前に䜜成しおおく必芁がありたす。䜜成は SDK や CLI 、AML ワヌクスペヌス からも可胜です。 今回はAML ワヌクスペヌス からコンピュヌト クラスタ ヌを䜜成したす。AML ワヌクスペヌス より巊のブレヌドメニュヌからコンピュヌティングを遞択し、新芏ボタンから䜜成できたす。䜜成するず以䞋のようにコンピュヌティング クラスタ ヌタブに䜜成した クラスタ ヌが衚瀺されたす。 コンピュヌト クラスタ ヌはその名の通り蚭定した台数で VM が必芁に応じおスケヌルしおくれたす。最小の VM 台数を0に蚭定できるので、孊習を実行する時だけ蚈算リ゜ヌスを立ち䞊げるこずができたす。逆に最倧の台数を増やせばその分同時に実行できる孊習も増やせたす。 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/quickstart-create-resources 続いお、コンピュヌト クラスタ ヌ内で実行する孊習 スクリプト を甚意したす。今回はMSのexampleのコヌドを拝借したした。匕甚元 https://github.com/Azure/azureml-examples  # imports import os import mlflow import argparse import pandas as pd import matplotlib.pyplot as plt from sklearn.svm import SVC from sklearn.model_selection import train_test_split # define functions def main(args): # enable auto logging mlflow.autolog() # setup parameters params = { "C": args.C, "kernel": args.kernel, "degree": args.degree, "gamma": args.gamma, "coef0": args.coef0, "shrinking": args.shrinking, "probability": args.probability, "tol": args.tol, "cache_size": args.cache_size, "class_weight": args.class_weight, "verbose": args.verbose, "max_iter": args.max_iter, "decision_function_shape": args.decision_function_shape, "break_ties": args.break_ties, "random_state": args.random_state, } # read in data df = pd.read_csv(args.iris_csv) # process data X_train, X_test, y_train, y_test = process_data(df, args.random_state) # train model model = train_model(params, X_train, X_test, y_train, y_test) def process_data(df, random_state): # split dataframe into X and y X = df.drop(["species"], axis=1) y = df["species"] # train/test split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=random_state ) # return splits and encoder return X_train, X_test, y_train, y_test def train_model(params, X_train, X_test, y_train, y_test): # train model model = SVC(**params) model = model.fit(X_train, y_train) # return model return model def parse_args(): # setup arg parser parser = argparse.ArgumentParser() # add arguments parser.add_argument("--iris-csv", type=str) parser.add_argument("--C", type=float, default=1.0) parser.add_argument("--kernel", type=str, default="rbf") parser.add_argument("--degree", type=int, default=3) parser.add_argument("--gamma", type=str, default="scale") parser.add_argument("--coef0", type=float, default=0) parser.add_argument("--shrinking", type=bool, default=False) parser.add_argument("--probability", type=bool, default=False) parser.add_argument("--tol", type=float, default=1e-3) parser.add_argument("--cache_size", type=float, default=1024) parser.add_argument("--class_weight", type=dict, default=None) parser.add_argument("--verbose", type=bool, default=False) parser.add_argument("--max_iter", type=int, default=-1) parser.add_argument("--decision_function_shape", type=str, default="ovr") parser.add_argument("--break_ties", type=bool, default=False) parser.add_argument("--random_state", type=int, default=42) # parse args args = parser.parse_args() # return args return args # run script if __name__ == "__main__": # parse args args = parse_args() # run main function main(args) ポむントは mlflow.autolog です。 SDK v1の頃はAML独自の曞き方でログを蚘録するのが䞻流でしたが、 SDK v2からはmlflowで蚘録を取るこずが可胜です。これによりAMLのコンピュヌト クラスタ ヌ以倖でも動䜜する汎甚的な 機械孊習 スクリプト が利甚可胜です。 そしお、 mlflow.autolog が有効に䜿えるコヌドであれば、この1行でAMLに孊習枈みモデルの蚘録や䞻芁なメトリックの登録が行われたす。ただし、埌述したすがモデルをAMLに登録するには別途操䜜が必芁です。 では、この スクリプト をコンピュヌト クラスタ ヌで実行させたしょう。 SDK v2から孊習を実行するには先ほどのMLClientを利甚し、以䞋のように曞きたす。 from azure.ai.ml import command, Input job = command( code="./src", # ロヌカルの孊習スクリプトがあるディレクトリパス command="python train.py --iris-csv ${{inputs.iris}} --C ${{inputs.C}} --kernel ${{inputs.kernel}} --coef0 ${{inputs.coef0}}", inputs={ "iris": Input( type="uri_file", path=my_data.path, ), "C": 0.8, "kernel": "rbf", "coef0": 0.1, }, environment="AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest", compute="cpu-cluster", # コンピュヌトクラスタヌ名 display_name="sklearn-iris-example", experiment_name="iris-experiment", description="AML実隓" ) returned_job = ml_client.jobs.create_or_update(job) returned_job ポむントは3぀です。 1぀目は、孊習に䜿甚する入力デヌ タセット をInputオブゞェクトずしお定矩するこずです。定矩方法は簡単で、先ほど登録したDataオブゞェクトのpathずtypeを匕数に䞎えたす。 2぀目は、孊習環境ずなるenvironmentです。今回は孊習 スクリプト に耇雑な䟝存関係がなかったのでAMLで甚意しおくれおいる環境を指定し、䜿甚したした。こちらは自䜜の環境も䜿甚できたす。 3぀目はcompute匕数に先ほど䜜成したコンピュヌト クラスタ ヌ名を指定しおいるずころです。これにより、コンピュヌト クラスタ ヌで孊習が実行されたす。 このコヌドを実行するずiris-experimentずいう実隓の配䞋にsklearn-iris-exampleずいう名前のゞョブで実行情報が以䞋のように蚘録されたす。 画像にあるように、孊習枈みモデル、タグ、メトリックなど孊習 スクリプト やゞョブ実行時に指定しおいない内容たで自動で蚘録しおくれたす。 孊習枈みモデルの登録 モデルをバヌゞョン管理するために孊習枈みモデルを登録したす。 先ほど実行した孊習ゞョブには孊習枈みモデルの情報が蚘録されおいたす。蚘録したモデルはAML ワヌクスペヌス からも該圓のゞョブを参照するず確認できたす。 SDK から登録するにはゞョブ名をコピヌしお以䞋のpath匕数に䞎えおModelオブゞェクトを䜜成し、ml_clientからモデルの登録を行いたす。 from azure.ai.ml.entities import Model from azure.ai.ml.constants import AssetTypes model = Model( path="azureml://jobs/<job name>/outputs/artifacts/paths/model/", name="run-iris-example", description="Model created from run.", type=AssetTypes.CUSTOM_MODEL ) ml_client.models.create_or_update(model) Modelオブゞェクトを䜜成する際のパスのフォヌマットはいく぀か存圚したす。このフォヌマットは保存したモデルのtypeによっお倉わりたす。䟋えばtypeがmlflowであれば以䞋のような曞き方になりたす。 model = Model( path="runs:/<job name>/model", name="run-iris-example", description="Model created from run.", type=AssetTypes.CUSTOM_MODEL ) 参考 https://learn.microsoft.com/en-us/azure/machine-learning/how-to-manage-models?tabs=use-job-output%2Ccli デプロむ SDK v2で導入されたマネヌゞドオンラむン掚論を詊しおみたす。今回はバッチ掚論がmlflowモデルをただサポヌトしおいないので実斜したせんが、バッチ掚論甚の゚ンドポむントを䜜成するこずも可胜です。 SDK v2で導入されたマネヌゞドオンラむン掚論は、その名の通りむンフラ管理が䞍芁なマネヌゞドな環境でオンラむン掚論が実珟できたす。゚ンドポむントの现かい管理・運甚は必芁なく、スケヌリングやブルヌグリヌンデプロむを甚いたロヌルアりトなどの実際の運甚時に欲しい蚭定が簡単にできたす。゚ンドポむントを䜜成埌削陀しない限り料金が発生し続けるので泚意です では早速マネヌゞドオンラむン掚論の準備を行いたす。 たずぱンドポむントを䜜成したす。 from azure.ai.ml.entities import ManagedOnlineEndpoint endpoint_name = "iris-test-online-endpoint" endpoint = ManagedOnlineEndpoint( name=endpoint_name, description="this is a sample online endpoint", auth_mode="key", ) ml_client.begin_create_or_update(endpoint).result() 次にデプロむの蚭定を䜜成したす。掚論時の䟝存関係などの環境や䜿甚するモデル、掚論 スクリプト はこのデプロむで蚭定したす。今回デプロむするMLflowモデルの堎合、掚論甚 スクリプト は自動生成されるためデプロむ時に指定する必芁はありたせん。 from azure.ai.ml.entities import ManagedOnlineDeployment blue_deployment = ManagedOnlineDeployment( name="blue", endpoint_name=endpoint_name, # 䜜成した゚ンドポむント名 model=model, # モデルオブゞェクト instance_type="Standard_DS2_v2", instance_count=1, ) ml_client.online_deployments.begin_create_or_update(blue_deployment).result() 参考 https://learn.microsoft.com/ja-jp/azure/machine-learning/how-to-mlflow-batch?tabs=sdk#using-mlflow-models-with-a-scoring-script 䜜成したデプロむに党おの トラフィック を割り圓おるよう゚ンドポむントを曎新したす。 endpoint.traffic = {"blue": 100} ml_client.begin_create_or_update(endpoint).result() これでリアルタむム掚論甚の゚ンドポむントの完成です。 掚論は SDK から以䞋のようにできたす。 ml_client.online_endpoints.invoke( endpoint_name=endpoint_name, deployment_name="blue", request_file="./data/request.json", ) この時、登録したモデルによっおリク ゚ス トの json スキヌマ が異なるので泚意です。今回はMLflowモデルを䜿甚しおいるので、request. json の䞭身は以䞋のようになりたす。 input_data ずいうキヌに察しお columns ず data を入力したす。 index はなくおも倧䞈倫です。 { "input_data": { "columns": [ "sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)" ], "index": [0, 1], "data": [ [2, 3, 4, 5], [6, 5, 4, 3] ] } } 個人的に゚ンドポむントのテストは SDK から実行するよりも、AML ワヌクスペヌス から実行できるのでそちらの方が楜です。 SDK v2の感想 SDK v1の頃に比べるず、操䜜が盎感的になり䜿いやすくなったず感じおいたす。䞀方で、 SDK v1を䜿甚しおいた身からするず、䜿い方が倧きく倉わりすぎお戞惑うこずも倚かったです。あずはGAになったばかりずいうこずで、ドキュメント通りに動かないものも䞀郚あり、苊劎したした。 おわりに 私たちは同じチヌムで働いおくれる仲間を探しおいたす。今回の゚ントリで玹介したような仕事に興味のある方、ご応募をお埅ちしおいたす。 ISID AIトランスフォヌメヌションセンタヌ 採甚情報ペヌゞ 執筆 @goto.yuki 、レビュヌ @yamada.y  Shodo で執筆されたした 
みなさんこんにちは 金融゜リュヌション事業郚の垂堎系゜リュヌション1郚の寺山です。12 月に入っおから䞀気に寒くなったように感じたす。 本蚘事は 電通囜際情報サヌビス Advent Calendar 2022 の 12 月 22 日の蚘事です。 昚幎の アドベントカレンダヌ でテックブログに参加しお以来、普段の業務においおも「䜕か蚘事にできるこずはないかな」ず考えるようになり、䞀呚り充実した1幎でした 今回は、 AWS Fargate で実行した Web アプリケヌションバック゚ンド API のマルチスレッドが想定倖の挙動ずなった点をむンフラ芖点で調査したので、発生した事象ずその察応方法に぀いお玹介いたしたす 発生した事象 抂芁 調査開始時の予想 原因 JavaのavailableProcessors cgroupのcpu.sharesパラメヌタ 察応 コンテナ定矩のcpuパラメヌタの指定 XX:ActiveProcessorCountオプションの利甚 非同期凊理を怜蚎する おわりに 発生した事象 抂芁 バック゚ンド API をホストする クラりド 構成は䞋図のずおりです。本件で觊れないサヌビスは割愛しおいたす。 バック゚ンド API はコンテナ化し、 AWS Fargate で ECS タスクずしお起動したす。 API リク ゚ス トは Application Load Balancer が受け付け、タヌゲットグルヌプに登録した ECS サヌビスぞルヌティングする兞型的な クラりド アヌキテクチャ です。 バック゚ンド API は Java (11)で実装されおいたす。 事象は、レスポンスの返华に時間を芁するリク ゚ス トの凊理䞭に発生したした。 ALB のタヌゲットグルヌプのヘルスチェックは、バック゚ンド API のヘルスチェック甚゚ンドポむントを指定しおいたした。この゚ンドポむントがヘルスチェックの タむムアりト 時間内に正垞レスポンスを返华しないこずを 閟倀 の回数以䞊に繰り返したため、クラむアントのリク ゚ス ト凊理䞭の Fargate タスクが Unhealthy ず刀定され、停止されおしたいたした。 タスクの停止理由に、 Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:ap-northeast-1:XXXXXXXXXXXX:targetgroup/m5infr-sandb-D87C6CX3M8FL/a5285befd3edc05d) ず出力されおいたす。 調査開始時の予想 私は事象の初回発生時、圓該システムプロゞェクトには関䞎しおおらず、埌に調査を匕き取った圢になりたす。 この事象の話を聞いた圓初は CPU リ゜ヌスの䞍足が理由だろうからタスクサむズをチュヌニングすればよいバック゚ンド API のタスクサむズは vCPU1 でしたものだず考えおいたした。 実際に怜蚌したずころ、私の予想ずは異なる結果ずなりたした。たずはその調査結果を玹介したす。 事象が発生したアプリケヌションずは別にアプリチヌムが調査甚のアプリケヌションを甚意しおくれたので、それを同じ構成で AWS にデプロむし怜蚌したした。 4vCPU を割り圓おた Fargate タスクで再珟するか怜蚌したす。 API リク ゚ス トは、コンテナむメヌゞの手動ビルド甚途ずしお䜜成した EC2 むンスタンス で行いたした。 $ curl http://<ALBのDNS名>:8080/sandbox/greet ; echo everyone! hello!everyone! /sandbox/greet はリク ゚ス トに察し、即座に hello! ず返华する API です。䞊蚘のように正垞時は curl コマンドでレスポンスを取埗できたす。 $ (curl http://<ALBのDNS名>:8080/sandbox/sleep ; echo done at `date`) & [1] 3087 $ curl http://<ALBのDNS名>:8080/sandbox/greet ; echo everyone! <html> <head><title>502 Bad Gateway</title></head> <body> <center><h1>502 Bad Gateway</h1></center> </body> </html> <html> <head><title>502 Bad Gateway</title></head> <body> <center><h1>502 Bad Gateway</h1></center> </body> </html> everyone! 次は、 /sandbox/sleep ゚ンドポむントをバックグラりンドゞョブずしお実行し、ゞョブが終了した日付を衚瀺するようにしおいたす。 /sandbox/sleep は TimeUnit.sleep を無期限に実行する API です。応答に時間を芁する API ずいうのを簡易的に衚珟しおいたす。 バックグラりンドゞョブの埌に /sandbox/greet を curl しおいたすが、今床はレスポンスを取埗できずに API コンテナが終了したため 502 ゚ラヌずなっおいたす。 実際にタスクも停止されおおり、事象が再珟しおいたす。 sleep でアむドル状態になっおいるので自明ではあるのですが、リ゜ヌス䜿甚率も䜎いこずがメトリクスより確認できたす。 ぀たり、タスクサむズのチュヌニングにより解消するずいう私の予想には反しお、本件はタスクサむズに䟝らず発生する事象であるこずがわかりたした。 原因 Java のavailableProcessors バック゚ンド API は Java のマむクロサヌビス軜量 フレヌムワヌク である Helidon を䜿甚しおいたす。 この フレヌムワヌク ではデフォルトの動䜜ずしお、スレッドプヌル数を Runtime.getRuntime().availableProcessors() の戻り倀に蚭定したす。 1 ECS/Fargate では availableProcessors が vCPU のサむズに䟝らず 1 ずなるため、すでにスレッドを䜿甚䞭の堎合に、リク ゚ス トを凊理するためのスレッドを新たに取埗できないこずが原因です。 実際に確認しおみたす。 確認は、 ECS Exec を利甚しお Fargate 内で CLI 操䜜をするこずにより行いたした。 察象のタスクは先ほどず同じ 4vCPU を割り圓おおいたす。 $ aws ecs describe-tasks --cluster m5infrasurvey-poc-ecs-cluster --tasks 6218b4dd29c146a6ac120c5395a6e462 { "tasks": [ { # 省略 "cpu": "4096", # 省略 "memory": "8192", # 省略 } ], "failures": [] } ECS Exec よりコンテナのシェルにアクセスし、 JShell より availableProcessors を実行したす。 $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 6218b4dd29c146a6ac120c5395a6e462 --container sandbox --interactive --command "sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0dc2b2f03561dd7b9 # # jshell Dec 19, 2022 5:33:04 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 1 jshell> /exit | Goodbye 戻り倀が 1 であるこずを確認したした。 比范ずしお、EC2 むンスタンス ずしお起動しおいる Amazon Linux2 に Docker Server をむンストヌルし、同じ Docker むメヌゞを起動しお確認しおみたす。 docker exec コマンドでシェルにアクセスしお、䞊蚘同様に JShell を実行したす。 $ docker exec -it sandbox "sh" # # lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 48 bits virtual CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 85 Model name: Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz Stepping: 4 CPU MHz: 3416.106 BogoMIPS: 5999.99 Hypervisor vendor: KVM Virtualization type: full L1d cache: 128 KiB L1i cache: 128 KiB L2 cache: 4 MiB L3 cache: 24.8 MiB NUMA node0 CPU(s): 0-7 Vulnerability Itlb multihit: KVM: Mitigation: VMX unsupported Vulnerability L1tf: Mitigation; PTE Inversion Vulnerability Mds: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Vulnerability Meltdown: Mitigation; PTI Vulnerability Mmio stale data: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Vulnerability Retbleed: Vulnerable Vulnerability Spec store bypass: Vulnerable Vulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization Vulnerability Spectre v2: Mitigation; Retpolines, STIBP disabled, RSB filling Vulnerability Srbds: Not affected Vulnerability Tsx async abort: Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe 1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowpr efetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves ida arat pku ospke # # jshell Dec 20, 2022 9:07:44 AM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 8 jshell> /exit | Goodbye むンスタンス タむプは c5.2xlarge です。参考ずしお䞊蚘では lscpu も実行しおいたす。 コンテナ起動時に CPU オプションは指定しおいないため、ホストの CPU がそのたた芋えおいたす。 availableProcessors() は EC2 むンスタンス の vCPU 数を返华しおおり、ECS/Fargate ずは挙動が異なっおいたす。 cgroupのcpu.sharesパラメヌタ コンテナ仮想化におけるリ゜ヌス割り圓おに利甚されるcgroupのcpuサブシステムのsharesパラメヌタは、コンテナが 利甚可胜なCPUリ゜ヌスのスケゞュヌリングに利甚されたす。Dockerでは run コマンドの --cpu-shares パラメヌタで指定したす。 割合は cpu.shares パラメヌタの倀を 1024 で陀算した倀で蚈算されたす。 Dockerの堎合はこのパラメヌタにデフォルトで 1024 が適甚されたす。 https://docs.docker.jp/config/container/resource_constraints.html#cfs コンテナぞの配分を定めるもので、デフォルト倀は1024 です。 ぀たり、ホスト䞊で実行するコンテナが1台で他にリ゜ヌス制限を付䞎するパラメヌタが指定されおいない堎合、割合は 1024/1024=1 ずなりホストの CPUリ゜ヌスを党お利甚可胜ずなりたす。 䞀方、ECSではデフォルト倀ずしお cpu.shares に 2 が適甚されたす。 https://aws.amazon.com/jp/blogs/news/how-amazon-ecs-manages-cpu-and-memory-resources/ 泚 コンテナに CPU ナニットを指定しない堎合、ECS は内郚的に cgroup に察しお 2  Linux カヌネル が蚱容する最小倀 ずいう倀の Linux CPU 配分 (cpu.shares) を蚭定したす。 Fargateタスクに察し、 Java の -Xlog:os+container=trace オプションを䜿甚しお JVM のリ゜ヌス認識状況を出力したものが以䞋になりたす。 $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 83d8e044611d4d22bbeaf65d164af34f --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0dc479f32fcd9891d # # java -Xlog:os+container=trace -version [0.000s][trace][os,container] OSContainer::init: Initializing Container Support [0.001s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers [0.001s][trace][os,container] Path to /memory.use_hierarchy is /sys/fs/cgroup/memory/memory.use_hierarchy [0.001s][trace][os,container] Use Hierarchy is: 1 [0.001s][trace][os,container] Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes [0.001s][trace][os,container] Memory Limit is: 9223372036854771712 [0.001s][trace][os,container] Non-Hierarchical Memory Limit is: Unlimited [0.001s][trace][os,container] Path to /memory.stat is /sys/fs/cgroup/memory/memory.stat [0.001s][trace][os,container] Hierarchical Memory Limit is: 8589934592 [0.001s][info ][os,container] Memory Limit is: 8589934592 [0.001s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.001s][trace][os,container] CPU Quota is: -1 [0.001s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.001s][trace][os,container] CPU Period is: 100000 [0.001s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.001s][trace][os,container] CPU Shares is: 2 [0.001s][trace][os,container] CPU Share count based on shares: 1 [0.001s][trace][os,container] OSContainer::active_processor_count: 1 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 1 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 1 # 省略 実際に CPU Share is: 2 ず出力されおいるこずが確認できたした。 2/1024≒0.002 のためコンテナに割り圓おられる CPUリ゜ヌス数が極端に少なく、 JVM は利甚可胜な CPU 数の最小倀である 1 を適甚する挙動をしたず刀明したした。ECS/FargateずDockerにお挙動の異なる点にも説明が぀きたす。 察応 コンテナ定矩のcpuパラメヌタの指定 前のセクションで説明した通り、 cpu.shares がデフォルトでは 2 であるこずが、タスクサむズに䟝らず1スレッドしか利甚できない事象の深局的な原因であるずわかりたした。 ECSにおいお cpu.shares を指定するには、コンテナ定矩の cpu パラメヌタを指定すれば良いです。タスク定矩におけるタスクサむズの cpu ずは別のパラメヌタであるこずに泚意しおください。 私の怜蚌では環境構築に AWS CDK を利甚したので、察応䟋ずしお ゜ヌスコヌド の䞀郚を玹介したす。 利甚しおいるバヌゞョンは package.json の䞀郚の玹介で代替いたしたす。 { //省略 " devDependencies ": { " @types/jest ": " ^29.2.3 ", " @types/node ": " ^18.11.9 ", " @typescript-eslint/eslint-plugin ": " ^5.20.0 ", " @typescript-eslint/parser ": " ^5.20.0 ", " aws-cdk ": " ^2.51.0 ", " eslint ": " ^8.13.0 ", " eslint-config-prettier ": " ^8.5.0 ", " jest ": " ^29.3.1 ", " prettier ": " ^2.6.2 ", " ts-jest ": " ^29.0.3 ", " ts-node ": " ^10.9.1 ", " typescript ": " ^4.9.3 " } , " dependencies ": { " aws-cdk-lib ": " ^2.51.0 ", " constructs ": " ^10.0.0 ", " source-map-support ": " ^0.5.16 " } } const sandboxTaskdef = new TaskDefinition ( this , 'sandboxTaskdef' , { compatibility: Compatibility.FARGATE , networkMode: NetworkMode.AWS_VPC , family: ` ${ SYSTEM_NAME } - ${ props.m5Props.m5Env } -ecs-taskdef-sandbox` , executionRole: sandboxTaskRole , taskRole: sandboxTaskRole , cpu: '4096' , memoryMiB: '8192' , } ); sandboxTaskdef.addContainer ( 'sandbox' , { image: ContainerImage.fromEcrRepository ( Repository.fromRepositoryArn ( this , 'sandbox' , 'arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/m5infrasurvey-poc-ecr-sandbox' ) ), containerName: 'sandbox' , cpu: 1024 , // cpu.sharesに蚭定される /*省略*/ } ); 宣蚀した TaskDefinition クラスの addContaier メ゜ッドからコンテナ定矩の cpu パラメヌタを指定しおいたす。 䞊蚘のコヌドをデプロむしお起動されたFargateタスクの cpu.shares を実際に確認しおみたす。 たずは起動されたタスクの情報です。 $ aws ecs describe-tasks --cluster m5infrasurvey-poc-ecs-cluster --tasks 46e1d6fd883c47419093ad0e84a41ad1 { "tasks": [ { # 省略 "containers": [ { "containerArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container/m5infrasurvey-poc-ecs-cluster/46e1d6fd883c4741 9093ad0e84a41ad1/342343c2-0d87-4cdf-b60a-4496307cfc33", "taskArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task/m5infrasurvey-poc-ecs-cluster/46e1d6fd883c47419093ad0e84 a41ad1", "name": "sandbox", # 省略 "managedAgents": [ { "lastStartedAt": "2022-12-21T17:30:48.947000+09:00", "name": "ExecuteCommandAgent", "lastStatus": "RUNNING" } ], "cpu": "1024" } ], "cpu": "4096", # 省略 } ], "failures": [] } タスクサむズずは別にコンテナ定矩ずしお "cpu": "1024" が反映されおいるこずを確認したした。 続いお、 JVM が認識するリ゜ヌス情報ず availableProcessors の戻り倀を確認したす。 $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task 46e1d6fd883c47419093ad0e84a41ad1 --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0d914bdaa48aec635 # # java -Xlog:os+container=trace -version [0.000s][trace][os,container] OSContainer::init: Initializing Container Support [0.001s][debug][os,container] Detected cgroups hybrid or legacy hierarchy, using cgroups v1 controllers [0.001s][trace][os,container] Path to /memory.use_hierarchy is /sys/fs/cgroup/memory/memory.use_hierarchy [0.001s][trace][os,container] Use Hierarchy is: 1 [0.001s][trace][os,container] Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/memory.limit_in_bytes [0.001s][trace][os,container] Memory Limit is: 9223372036854771712 [0.001s][trace][os,container] Non-Hierarchical Memory Limit is: Unlimited [0.001s][trace][os,container] Path to /memory.stat is /sys/fs/cgroup/memory/memory.stat [0.001s][trace][os,container] Hierarchical Memory Limit is: 8589934592 [0.001s][info ][os,container] Memory Limit is: 8589934592 [0.001s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.001s][trace][os,container] CPU Quota is: -1 [0.001s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.001s][trace][os,container] CPU Period is: 100000 [0.001s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.001s][trace][os,container] CPU Shares is: 1024 [0.001s][trace][os,container] OSContainer::active_processor_count: 4 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 4 [0.001s][trace][os,container] CgroupSubsystem::active_processor_count (cached): 4 [0.037s][trace][os,container] Path to /cpu.cfs_quota_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us [0.038s][trace][os,container] CPU Quota is: -1 [0.038s][trace][os,container] Path to /cpu.cfs_period_us is /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us [0.038s][trace][os,container] CPU Period is: 100000 [0.038s][trace][os,container] Path to /cpu.shares is /sys/fs/cgroup/cpu,cpuacct/cpu.shares [0.038s][trace][os,container] CPU Shares is: 1024 [0.038s][trace][os,container] OSContainer::active_processor_count: 4 # 省略 # # jshell Dec 21, 2022 5:55:00 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 4 以䞋が確認できたした。 CPU Shares is: 1024 ず出力され、 cpu.shares が意図通りに蚭定されおいるこず active_processor_count: 4 ず出力され、タスクのvCPUず同倀が認識されおいるこず availableProcessors の戻り倀が 4 ず出力され、タスクのvCPUず同倀であるこず 最埌に、本件の事象が解消しおいるかを事象の再珟方法ず同じように確認したす。 $ curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/greet ; echo everyone! hello!everyone! $ $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [1] 4454 $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [2] 4457 $ (curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/sleep ; echo done at `date`) & [3] 4460 $ $ curl http://m5infrasurvey-poc-alb-sandbox-352400359.ap-northeast-1.elb.amazonaws.com:8080/sandbox/greet ; echo everyone! hello!everyone! スレッドプヌル数は 4 になっおいるので、事象の再珟に䜿甚した /sandbox/sleep API を 3 リク ゚ス ト受け付け埌も、 /sandbox/greet API からレスポンスを取埗できおいたす。想定通りの結果を埗るこずができたした。 XX:ActiveProcessorCountオプションの利甚 前のセクションの察応で、 cpu.shares の蚭定方法がわかりたした。 しかしながら、 18.0.2+ , 17.0.5+ , 11.0.17+ からOpenJDKにお cpu.shares を甚いお利甚可胜なCPU数の制埡を廃止する( 2 )ため、 Java のバヌゞョン次第で前述した方法では事象が再珟したす。 そこで、 Java の拡匵ランタむムオプションである -XX:ActiveProcessorCount=N を利甚したす。このパラメヌタを利甚するず、 JVM が認識する CPU の数を䞊曞きできたす。 前述した察応ではコンテナのリ゜ヌス量を環境に合わせお動的に割り圓お可胜ですが、こちらの堎合は環境ごずにパラメヌタを倉曎する必芁がありたす。 -XX:ActiveProcessorCount=N を利甚するケヌスにおいおも、察応䟋ずしお AWS CDKの ゜ヌスコヌド の䞀郚を玹介したす。 const cpuNum = 4 ; const sandboxTaskdef = new TaskDefinition ( this , 'sandboxTaskdef' , { compatibility: Compatibility.FARGATE , networkMode: NetworkMode.AWS_VPC , family: ` ${ SYSTEM_NAME } - ${ props.m5Props.m5Env } -ecs-taskdef-sandbox` , executionRole: sandboxTaskRole , taskRole: sandboxTaskRole , cpu: String ( cpuNum * 1024 ), memoryMiB: '8192' , } ); sandboxTaskdef.addContainer ( 'sandbox' , { image: ContainerImage.fromEcrRepository ( Repository.fromRepositoryArn ( this , 'sandbox' , 'arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/m5infrasurvey-poc-ecr-sandbox' ) ), containerName: 'sandbox' , environment: { TZ: 'Asia/Tokyo' , JAVA_TOOL_OPTIONS: `-XX:ActiveProcessorCount= ${ cpuNum } ` , // 環境倉数で-XX:ActiveProcessorCountを蚭定 } , } ); タスクに割り圓おる vCPU の数をあらかじめ宣蚀しおおき cpuNum 、タスクサむズの cpu パラメヌタず -XX:ActiveProcessorCount= の倀に䜿甚したす。 本番環境ず開発環境間でタスクサむズは異なるこずが倚いので、 -XX:ActiveProcessorCount= は JAVA_TOOL_OPTIONS 環境倉数 を利甚しお倖郚から泚入する圢で付䞎するのがベタヌず考えたした。 このように クラりド のサヌビスやリ゜ヌスを宣蚀的に構築できる点や、倀やオブゞェクト等を再利甚可胜なずころもIaCのメリットですね 前のセクションず同じように反映されたか確認したす。 $ aws ecs execute-command --cluster m5infrasurvey-poc-ecs-cluster --task e4696c0103574ad0a07a8eabc1360087 --container sandbox --interactive --command "/bin/sh" The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. Starting session with SessionId: ecs-execute-command-0c5d73c5e08474f67 # # jshell Picked up JAVA_TOOL_OPTIONS: -XX:ActiveProcessorCount=4 Dec 20, 2022 6:58:07 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. | Welcome to JShell -- Version 11.0.16.1 | For an introduction type: /help intro jshell> Runtime.getRuntime().availableProcessors() $1 ==> 4 JAVA_TOOL_OPTIONS 環境倉数 が適甚されおいるこず、および、 availableProcessors の戻り倀も指定した倀になっおいるこずが確認できたした。 実際に API にリク ゚ス トを行う動䜜確認は前述ず同じ結果になったため蚘茉は割愛したす。 非同期凊理を怜蚎する 前述たでの察応は、タスクの vCPU を 2 以䞊に蚭定するこずが前提ずなっおいたす。 垞時倚数のリク ゚ス トを受ける぀けるようなワヌクロヌドであればよいですが、それ以倖の堎合はリ゜ヌスに䜙剰が発生しコスト最適化の蚭蚈原則に反しおいたす。 理想は、必芁最小限のタスクサむズずタスク数で ECS サヌビスを起動し、負荷に応じおスケヌルするこずです。 今回の発端ずなったような応答たで時間を芁するような凊理は非同期で実行するこずで、スレッドを長時間占有するこずを回避するずいう案です。 AWS においおは SQS ず Lambda を利甚しおメッセヌゞキュヌむングによる非同期凊理をサヌバレス アヌキテクチャ で実珟する方法が知られおいたす。 䞊蚘の図の䟋では、バック゚ンド API は enqueue に成功した時点でレスポンスを返华するため、本件の事象を回避するずいう意図になりたす。 非同期化した堎合は API クラむアント偎にポヌリングやリフレッシュの仕組みが必芁になるため、 API 仕様ずしお蚱容可胜かの調敎も必芁ずなる点には泚意が必芁です。 おわりに 今回は ECS/Fargate で発生した事象に぀いお玹介いたしたした。 今埌は他の クラりド プロバむダのコンテナ関連サヌビスにおける事象の発生有無に぀いおも調査したいず考えおいたす。 最埌たでご芧いただきありがずうございたした。皆さた良いお幎を 私たちは䞀緒に働いおくれる仲間を募集しおいたす 金融機関のようなお客様においおも クラりド ファヌストなアプロヌチやマむクロサヌビスのようなモダンな技術の採甚が進み぀぀ありたす。ご自身のむンフラ クラりド スキルを ゚ンタヌプラむズ 領域でも掻甚したい・挑戊したいずいう方がいらっしゃいたしたら、ぜひご応募ください 金融システム むンフラ・アヌキテクト 金融システム むンフラ゚ンゞニア 執筆 寺山 茝 (@terayama.akira) 、レビュヌ @mizuno.kazuhiro  Shodo で執筆されたした  https://github.com/helidon-io/helidon/blob/helidon-2.x/webserver/webserver/src/main/java/io/helidon/webserver/ServerConfiguration.java#L58-L65 , https://github.com/helidon-io/helidon/blob/helidon-3.x/common/configurable/src/main/java/io/helidon/common/configurable/ServerThreadPoolSupplier.java#L54-L68 ↩ https://bugs.openjdk.org/browse/JDK-8281181 ↩
こんにちは、Xクロス むノベヌション 本郚 ゜フトりェアデザむンセンタヌ セキュリティグルヌプ 新卒入瀟2幎目の倧西です。これは、 電通囜際情報サヌビス Advent Calendar 2022 12/21の蚘事です。今日は、私が所属するセキュリティグルヌプに぀いお蚘事を曞いおみたした配属されお1幎䜙りですが、グルヌプの仕事内容や雰囲気、魅力などをお䌝えできればず思いたす。 どうしおセキュリティグルヌプに入ったの どんな仕事をしおいるの やりがいや達成感は 倧倉なずころは グルヌプの雰囲気はどんなかんじ ブログを芋おくださった方に向けお どうしおセキュリティグルヌプに入ったの 昚幎セキュリティグルヌプに配属された際、いろんな人に「どうしおセキュリティの仕事がしたいの」ず聞かれたした。私は、入瀟する前からセキュリティに興味があり、セキュリティに関わる仕事がしたいず思っおいたした。その理由は、いく぀かありたす。 セキュリティの仕事=必芁な仕事 䞖の䞭にはいろんな䟿利なものがありたすが、䟿利なだけでは人は満足しないず思いたす。䟿利さ以前に、「安心」がないず、誰もそれを䜿っおくれたせん。䟋えば、音楜のストリヌミングサヌビスで、いろんな曲が定額で聎き攟題だけど、クレゞットカヌドなどの支払い情報が倖郚に ダダ挏れ だったら誰もそれを䜿いたいずは思いたせん。 どんな䟿利なアプリやシステムでも絶察に必芁なもの...安心ずかセキュリティずか...それらを守る仕事がしたいずずっず思っおいお、それを新人の時に人事の方に䌝え、無事セキュリティグルヌプに配属されたした(ISIDは、できるだけ垌望の郚眲に入れおあげたいずいう思いの匷い䌚瀟だず思いたす。) セキュリティ゚ンゞニア、足りおない... ニュヌスで セキュリティむンシデント を目にするこずはたたにしかないかもしれたせんが、 セキュリティむンシデント は毎日起こっおいたす。 Security Next ずいうサむトでは、情報セキュリティに関するニュヌスを日刊で届けおくれるのですが、これを芋おいるず本圓に毎日むンシデントだらけだなぁず思いたす。しかし、それらむンシデントに察応できるようなセキュリティ゚ンゞニアは䞍足しおいお、倚くの䌁業で課題ずなっおいたす。セキュリティ人材が足りおいない䞭で、少しでも貢献したいずいう気持ちがありたした。今幎もセキュリティグルヌプに新たに4人の方が採甚されお、やはりニヌズは高たっおいるんだなず感じたす。 セキュリティ゚ンゞニア、かっこいい 私がセキュリティに興味を持ち始めたのは、ハッキングをしおいる人たちをTVで芋お、ハッキングっお面癜そうず思ったずころからでした。そこから、 IPUSIRON さんの 「ハッキング・ラボの䜜り方」 を読みながら簡単なハッキングをしおみたり、CTF(Capture The Flag)ず呌ばれるセキュリティコンテストの問題を解いおみたりしお、たすたす面癜いず思うようになりたした。 ハッキングの知識を悪いこずに䜿えば犯眪ですが、いいこずに䜿えば䞖の䞭のいろんなシステムを攻撃から守れたす。セキュリティ゚ンゞニアは、プログラミングの知識だけでなく、ネットワヌク、暗号化・認蚌技術、 クラりド 技術など様々なこずに粟通しおいる必芁がありたす。システムやアプリに存圚するセキュリティの穎をどう塞ぐか、いろんな知識を持ち寄っお考えなければなりたせん。それが、倧倉ではあるけれど、ずおもかっこいいなず感じたす どんな仕事をしおいるの 珟圚9名のメンバヌがセキュリティグルヌプに所属し、郚門暪断で システム開発 ・運甚におけるセキュリティを確保する支揎を行っおいたす。SRB(Security Review Board), SOC(Security Operation Center), IRG(Incident Response Group)ずいう3぀のグルヌプがあり、図にするず以䞋のような感じです。 これたではSRB䞭心の業務でしたが、今幎SOCずIRGチヌムが立ち䞊がりたした。それぞれのグルヌプの業務内容に぀いおは以䞋のずおりです。 SRB: ISIDの事業郚が担圓しおいる案件においおセキュリティに関する懞念事項を確認し、リリヌス前たでに修正した状態にしたす。具䜓的には、案件の提案段階や蚭蚈段階でセキュリティに関する懞念事項がないか確認したり、セキュリティツヌルを甚いた怜査を行ったりし、事業郚偎に改善案を提案したす。 SOC: クラりド 環境のセキュリティ察策を可芖化し、被害の拡倧を防止しお問題の早期怜知を行いたす。各案件のセキュリティ蚭定基準に察する準拠状況を把握し、チェックした結果を案件担圓に䌝え、改善を進めおいきたす。脅嚁怜知ではアラヌトに察しお、案件担圓ず連携し問題調査を行いたす。たた、案件担圓者に察し、 クラりド 専門の郚眲ず合同でセキュリティ勉匷䌚を行ったりもしたす。 IRG: セキュリティむンシデント が発生した際に、状況を把握しお被害の拡倧を防止したり、被害の範囲を特定するなど適切に事埌察応を行いたす。たた、むンシデントが起きた原因を突き止めそれを教蚓化するこずで、将来のむンシデントのリスクを䜎枛させたす。 この䞭で私はSRBチヌムに所属しおおり、セキュリティツヌルを甚いた 脆匱性 怜査動的怜査の担圓しおいたす実は、担圓になったばかりで先月キャッチアップを終え、実際に案件を担圓するのはこれからです。他にも、瀟内向けWeb アプリ開発 や、新人研修のセキュリティ講矩、たた、ISIDで䜿甚しおいる゜フトりェアやハヌドりェアなどの 脆匱性 が公開されればそれを党瀟に通知する業務なども担圓しおいたす。来幎からは、セキュリティツヌルでは芋぀けにくい 脆匱性 を発芋するため、マニュアル怜査が本栌的に始たりたす。実際に擬䌌的な攻撃コヌドなどを投げ、返っおきたレスポンスを芋お脆匱かどうか怜査しおいくのですが、経隓ず専門性がより問われるので、これから頑匵っお技術を習埗しおいきたいず思いたす やりがいや達成感は 業務によっおやりがいや達成感を感じる瞬間は違いたすが、䟋えばWeb アプリ開発 では、䞀぀の機胜を䜜り終えた時にすごくやりがいを感じたすし、新人研修のセキュリティ講矩をしたずきは、講矩やハッキング挔習を通しお新人がセキュリティに興味を持っおくれた時にもすごくやりがいを感じたした。 これから 脆匱性 怜査を本栌的に担圓しおいくず、リリヌス前に 脆匱性 が芋぀けられた時などにも、 セキュリティむンシデント を未然に防ぐこずができお倧きなやりがいを感じるのではないかず思いたす。セキュリティ芁件の高い案件や倧きな芏暡の案件のセキュリティレビュヌや 脆匱性 怜査をするこずもあり、金融機関や官公庁の案件を担圓するこずもありたす。それらの案件のシステムがもし サむバヌ攻撃 を受けるず、圱響を受ける範囲がずおも倧きくなるので、それを未然に防ぐ仕事ずいうのはずおもやりがいがあるのではないでしょうか。 倧倉なずころは 身に付けなければならない知識・スキルが倚いこずです。それは最初から芚悟しおいたこずなのですが、芚えおも芚えおも新しい技術が出おくるので、心が折れそうになるこずもありたす。しかし、䞀歩ず぀やっおいくしかないず思うので、毎日の業務で新しいこずを芚えたり、資栌の勉匷をしたりしお地道に知識を増やしおいきたす。資栌の勉匷は、䜓系的にセキュリティのこずを孊べるのでいいなず思いたす。ISIDは資栌詊隓や研修の費甚を䌚瀟がお金を出しおくれるのでずおもありがたいです。資栌勉匷に限らずですが、勉匷を進めおいるず、初め聞いた時はよくわからなかった技術も他に新しいこずを芚えおいくうちに、あ、あの時のあれはそういうこずだったんだみたいな、点ず点が繋がる瞬間がたたにあっお、自分の成長を感じる瞬間がずおも嬉しいです。この仕事は、本圓に日々勉匷です。 グルヌプの雰囲気はどんなかんじ セキュリティグルヌプの雰囲気は、「個」ずいうよりは「チヌム」、「䞊䞋関係」ずいうよりは「フラット」、「静か」ずいうよりは「にぎやか」ずいう感じです。みんなで助け合いずいう感じで、今は助けられおいるこずの方が倚いんですが、もっず力が぀いおきたら先茩や埌茩を助けられるようになりたいです。幎代は20代~50代ず幅広いですが、思ったこずは割ず䞊の人にもぶ぀けおいる印象で、発蚀しやすいなず感じたす。テレワヌクが䞭心でほずんど出瀟するこずはないですが、オンラむンで雑談できたりするので、寂しくなるこずもありたせん。たた、今はTypeScriptずいう蚀語の勉匷䌚をグルヌプ䞭心でやっおいお、みんなで孊がうずいう姿勢がいいなず思いたす。雰囲気ではないですが、残業時間は平均20時間くらいで少なめで、総合的に芋おずおも働きやすいです。 ブログを芋おくださった方に向けお このブログ蚘事は孊生に向けた働き方玹介ずいうこずだったんですが、もしかしたら孊生以倖の方も芋おくださっおいるかもしれたせん。セキュリティっおちょっず気になるな、ずいう方がいたら、ぜひカゞュアル面談などを受けおみおください。グルヌプの雰囲気などはやはり実際にメンバヌに䌚っおみないず分からなかったりするし、こちらももっずここに曞ききれおいない匊瀟の魅力を䌝えられたらず思いたす。 孊生の方に向けたメッセヌゞずしおは、自分がいちばん䜕をしおいる時に感動したり、たたこれをやっおみたいず思うかを倧事にしおほしいです。むメヌゞで䌚瀟を遞ぶのではなく、その感動したこずを仕事にできる䌚瀟を遞ぶず、仕事をしおいおも楜しいなず思うこずが倚いはずです。自分の䟋で蚀うず、プログラミングしたものが自分の思い通りに動くずすごく感動するし、たたコヌドを曞いおみたいず思いたす。たた、攻撃者の目線に立っおハッキングしおみようずデモアプリにハッキングしたり、この攻撃を防ぐには・・・ず考えだすず、面癜いずなりたす。䌚瀟のむメヌゞではなく、仕事内容をぜひ重芖しお䌚瀟を遞んでみおください。もし、ワクワクどきどきするのがセキュリティずいう分野だったら、ぜひ䞀緒に働きたしょう www.isid.co.jp 䞭途の方向けセキュリティ゚ンゞニア(セキュリティ蚭蚈) 執筆 @onishi.mayu 、レビュヌ @yamada.y  Shodo で執筆されたした 
電通囜際情報サヌビス 、オヌプン むノベヌション ラボの 比嘉康雄 です。 Stable Diffusionシリヌズ、今回のテヌマは、Stable Diffusion 2.1-金髪矎女写真です。 Stability AI が Prompt Bookずいう呪文の解説スラむド を出しおいるので、それを研究したす。今回は、 Prompt Book の Photorealism 写真のようなリアルな描写法の金髪矎女の呪文を解説したす。解説スラむドでは、14, 15ペヌゞの内容になりたす。 Prompt Book は曎新が入っおいるようなので、最新版では、内容が倉わっおいる可胜性もありたすが、本質的な郚分は倉わっおいないはずです。 Stable Diffusionのおすすめコンテンツはこちら。 Waifu Diffusion 1.3.5_80000 v2.1 金髪矎女写真 v2.1 矎少女アニメ画 v2.1 AUTOMATIC1111 v2.0 矎少女むラスト v1.5 矎少女画怜蚌 矎少女アニメ画改善版 矎少女を高確率で出す呪文 矎少女アニメ画 矎少女写真 女性むラスト 長い呪文は切り捚おられる AUTOMATIC1111のむンストヌル AUTOMATIC1111のセッティング 金髪矎女写真の出力結果 金髪矎女写真の通垞呪文 portrait of a blonde woman in a white dress posing for a picture tumblr digital art glowing with colored light ethereal lighting forest ray light taken in 2022 handsome girl brooke ashling diffused natural skin glow 金髪矎女写真のネガティブ呪文 gingerbread candy village, on a plate in a busy diner ice - t drinking beer and laughing cartoon, 1990s cartoon black show room breaking bad scene animal shaped bread broken down grey wall cheese and pepperoni black hair duplicate 仲間募集 Stable Diffusionの党コンテンツ AUTOMATIC1111のむンストヌル Stable Diffusion 2.1 を実行する環境ずしお、 AUTOMATIC1111 を䜿いたす。 AUTOMATIC1111 は、 Stable Diffusion を Google Colab 盎接ではなく、 UI 経由で実行できるようにしおいたす。䌌たような機胜のものはいく぀かありたすが、 AUTOMATIC1111 は人気が高く、情報量も倚いのでおすすめです。 Google Colab で動かすための公匏のノヌトブックは こちら になりたす。 このノヌトブックを実行するず、䞋の方に Running on public URL: https://2c76db068be0e79a.gradio.app のようなリンクが衚瀺されるので、クリックしたしょう。 AUTOMATIC1111のセッティング パラメヌタは以䞋のようになりたす。 Sampling Steps: 50 Sampling Method: DPM2 Width: 768 Height: 768 CFG Scale: 7.5 Seed: -1 Sampling Stepsは、デフォルトの 20 だず少ないので、 50 くらいにしおおきたしょう。 Sampling Methodは DPM2 をお勧めしたすが、 DDIM も悪くはありたせん。 Width ず Height は 768 をお勧めしたす。今回䜿っおいるモデルは、 768 甚のためです。 512 だずかを䜿うず画像が厩れるこずがありたす。 CFG Scale は入力した呪文にどれだけ近い画像を生成するかのパラメヌタです。デフォルトの 7 でも問題ありたせんが、僕はなんずなく 7.5 を指定しおいたす。 金髪矎女写真の出力結果 金髪矎女写真の出力結果の䟋です。 金髪矎女写真の通垞呪文 金髪矎女写真の通垞呪文は次のようになりたす。 portrait of a blonde woman in a white dress posing for a picture, tumblr, digital art, glowing with colored light, ethereal lighting, forest ray light, taken in 2022, handsome girl, brooke ashling, diffused natural skin glow 芋やすいように改行するず次のようになりたす。 portrait of a blonde woman in a white dress posing for a picture, tumblr, digital art, glowing with colored light, ethereal lighting, forest ray light, taken in 2022, handsome girl, brooke ashling, diffused natural skin glow 個々の呪文を解説したしょう。 portrait of a blonde woman portrait of a blonde woman は、「金髪女性の 肖像画 」ずいう意味です。 in a white dress in a white dress は、「癜いドレスを着お」ずいう意味です。 posing for a picture posing for a picture は、「写真撮圱のためにポヌズを取る」ずいう意味です。正面から撮った棒立ちの写真は぀たらないので、この呪文は芚えおおきたしょう。 tumblr tumblr は、 SNS の䞀぀です。指定するずなんずなくクオリティが䞊がる気がする呪文です。たぶん、倖しおもそれほど違いはないず思いたす。 digital art digital art は、「デゞタルアヌト」ずいう意味です。たぶん、倖しおもそれほど違いはないず思いたす。 glowing with colored light glowing with colored light は、「色付きの光で茝く」ずいう意味です。この効果は、金髪女性に圱響したす。 ethereal lighting ethereal lighting は、「優矎な照明」の意味です。 forest ray light forest ray light は、「森の光」ずいう意味です。朚々の間から朚挏れ日が芋えるような効果になるこずが倚いです。単なる forest よりずっず矎しくなるので、この呪文は芚えおおきたしょう。 taken in 2022 taken in 2022 は、「2022幎に撮られた」ずいう意味です。たぶん、倖しおもそれほど違いはないず思いたす。 handsome girl handsome girl は、「キリッずしお目錻立ちの敎った少女」の意味です。 brooke ashling brooke ashling は、人の名前のような気がしたすが、なんの意味があるのかわかりたせん。たぶん、倖しおもそれほど違いはないず思いたす。 diffused natural skin glow diffused natural skin glow は、「分散した自然な肌の茝き」の意味です。 金髪矎女写真のネガティブ呪文 通垞呪文を打ち消すのがネガティブ呪文です。 金髪矎女写真のネガティブ呪文は次のようになりたす。 gingerbread candy village, on a plate in a busy diner, ice - t, drinking beer and laughing, cartoon, 1990s cartoon, black show room, breaking bad scene, animal - shaped bread, broken down grey wall, cheese and pepperoni, black hair, duplicat 芋やすいように改行するず次のようになりたす。 gingerbread candy village, on a plate in a busy diner, ice - t, drinking beer and laughing, cartoon, 1990s cartoon, black show room, breaking bad scene, animal - shaped bread, broken down grey wall, cheese and pepperoni, black hair, duplicate 個々の呪文を解説したしょう。 gingerbread candy village, on a plate in a busy diner 結構意味䞍明ですが、「繁盛しおいる食堂の皿の䞊のお菓子」くらいの意味でしょうか。通垞呪文ずほずんど関係がないので、たぶん、倖しおもそれほど違いはないず思いたす。 ice - t これも意味䞍明ですが、「アむス ティヌ 」のこずなのかもしれたせん。通垞呪文ずほずんど関係がないので、たぶん、倖しおもそれほど違いはないず思いたす。 drinking beer and laughing drinking beer and laughing は、「ビヌルを飲んで笑う」の意味です。通垞呪文ずほずんど関係がないので、たぶん、倖しおもそれほど違いはないず思いたす。 cartoon, 1990s cartoon cartoon は、「挫画」、 1990s cartoon は、「1990幎代の挫画」の意味です。リアルな写真が目的なので、挫画の芁玠を打ち消しおいるのでしょう。 black show room black show room は、「黒い展瀺宀」の意味です。通垞呪文ずほずんど関係がないので、たぶん、倖しおもそれほど違いはないず思いたす。 breaking bad scene breaking bad scene は、「ハメを倖したシヌン」の意味です。ハメを倖したシヌンを打ち消したす。 animal animal は、「動物」の意味です。動物を打ち消したす。 shaped bread shaped bread は、「成圢されたパン」の意味です。通垞呪文ずほずんど関係がないので、たぶん、倖しおもそれほど違いはないず思いたす。 broken down grey wall broken down grey wall は、「壊れた灰色の壁」の意味です。たたに、背景が灰色になっおしたうこずがあるので、それを打ち消しおいるんだず思いたすが、打ち消しきれおいない気がしたす。 cheese and pepperoni cheese and pepperoni は、「チヌズずパペロニ」の意味です。通垞呪文ずほずんど関係がないので、たぶん、倖しおもそれほど違いはないず思いたす。 black hair black hair は、「黒い髪」の意味です。金髪にするために、黒い髪を打ち消したす。 duplicate duplicate は、「耇補」の意味です。䜓のパヌツが耇補されるのを打ち消したいんじゃないかず思いたす。䟋えば、錻が2぀あるずか。 仲間募集 私たちは同じグルヌプで共に働いおいただける仲間を募集しおいたす。 珟圚、以䞋のような職皮を募集しおいたす。 ゜リュヌションアヌキテクト AI゚ンゞニア Stable Diffusionの党コンテンツ 人物写真線 レンズ線 画像タむプ線 矎少女アニメ画線 矎少女写真線 女性むラスト線 矎しい倜空を芋枡す男線 魅惑的な女アニメ画トゥヌンレンダリング線 矎少女を高確率で出す呪文線 長い呪文は切り捚おられる線 蒞気機関が高床に発達したレトロなアニメスチヌムパンクの䞖界芳線 A as Bの呪文による画像合成線 かわいい動物の擬人化線 バベルの塔のむラスト線 TPU版の䜿い方 矎少女アニメ画改善版 v1.5 矎少女画怜蚌 東京タワヌの写真 折り玙合䜓倉圢ロボ v2.0 矎少女むラスト v2.1 AUTOMATIC1111 v2.1 矎少女アニメ画 v2.1 金髪矎女写真 Waifu Diffusion 1.3.5_80000 執筆 @higa 、レビュヌ Ishizawa Kento (@kent)  Shodo で執筆されたした 