
- TOP
- ã¿ã°äžèЧ
- ããã°ã©ãã³ã°
ããã°ã©ãã³ã°
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
ãªãC++/JSéã®ã¡ã¢ãªç®¡çã¯é£ããã®ã çæ§ãã¯ãããŸããŠãã°ããŒãã«ãããã¯ãéçºæ¬éš ã°ããŒãã«ã·ã¹ãã éš æè¡æšé²ãããã¯ã®ææšãšç³ããŸããç§ãã¡ã®ããŒã ã§ã¯ãOpenCVã«ããç»ååŠçããã¥ãŒã©ã«ãããã¯ãŒã¯ã«ããç»åèªèãå«ãå€§èŠæš¡ãªC++è³ç£ããEmscriptenã§WebAssemblyã«ã³ã³ãã€ã«ãããã©ãŠã¶ãžç§»æ€ãããããžã§ã¯ãã«åãçµãã§ããŸãã ãã®äžã§ç§ã«ãšã£ãŠé£æãšãªã£ãã®ããã¡ã¢ãªç®¡çã®çè§£ã§ãããEmscriptenã䜿çšããéçºã§ã¯ãã¡ã¢ãªã®èãæ¹ãç°ãªã2ã€ã®èšèªãC++ãšJavaScriptããŸããã åŠçãå®è£
ããããšããããŸããC++ã§ã¯ãªããžã§ã¯ãã®å¯¿åœãã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ã«ããRAIIã§å¶åŸ¡ãããã®ã«å¯ŸããJavaScriptã§ã¯ãªããžã§ã¯ãã®å¯¿åœãGCïŒã¬ããŒãžã³ã¬ã¯ã¿ïŒã管çããéåžžãéçºè
ãè§£æŸãæèããããšã¯ãããŸããã ãã®ã¡ã¢ãªã¢ãã«ã®éãã«å ããC++ã®ãªããžã§ã¯ããJavaScriptåŽãžæž¡ããšãããã®å¯¿åœãæææš©ã«é¢ããæ
å ±ã¯åŒãç¶ãããªãããšãããã£ãããšçè§£ããŠããå¿
èŠããããŸãã JavaScriptåŽããèŠããšãC++ã®ãªããžã§ã¯ãã¯åãªãæ°å€ïŒã¡ã¢ãªäžã®ã¢ãã¬ã¹ïŒã«éããããã®ãæ°å€ãã«ã¯ãã誰ã確ä¿ããã®ããããã€ãŸã§æå¹ãªã®ããã誰ãè§£æŸãã¹ããããšãã£ãæææš©ã®æ
å ±ã¯å«ãŸããŠããŸããããŸããJSã®GCã¯C++åŽã®ã¡ã¢ãªé åãèªèã§ããŸããã ãã®ãããWasmã®å¢çãè¶ãããªããžã§ã¯ãã«ã€ããŠã¯ãææè
ãšæå¹æéãè§£æŸã®è²¬ä»»ãæç¢ºã«ããããã§å®è£
ããå¿
èŠããããŸãããã®ç¹ãçè§£ããŠããããšããEmscriptenã«ãããéçºã®éèŠãªãã€ã³ãã§ããã EmscriptenãæäŸããembindã䜿ãã°ãC++ã®ã¯ã©ã¹ã std::vector ãJavaScriptã®ãªããžã§ã¯ãã«è¿ãåœ¢ã§æ±ããŸãããã ãããã®æœè±¡åãããAPIã®èåŸã§ããªããžã§ã¯ãã®åãæž¡ããšå¯¿åœç®¡çãã©ã®ããã«è¡ãããŠããã®ããçè§£ããŠããå¿
èŠããããŸãã æ¬èšäºã§ã¯ããŸãWasmã®ã¡ã¢ãªã¢ãã«ã®åºç€ãæŠèгãããã®äžã§embindã«ããå®è£
ã詳ãã解説ããŸãã ç®æ¬¡ ãªãC++/JSéã®ã¡ã¢ãªç®¡çã¯é£ããã®ã ç®æ¬¡ Wasmã®ã¡ã¢ãªã¢ãã« C++ãªããžã§ã¯ãã®å®äœ å¢çãè¶ãããšå¯¿åœã®æ
å ±ã倱ããã embindã¯äœãé ããäœãé ããªãã®ã value_objectã¯ã³ã㌠class_ã¯ãã³ãã« typed_memory_viewã¯ãã¥ãŒ ãããã« Wasmã®ã¡ã¢ãªã¢ãã« WebAssemblyïŒWasmïŒã®ã¡ã¢ãªã¢ãã«ã¯éåžžã«ã·ã³ãã«ã§ããWasmã¢ãžã¥ãŒã«ã¯ã Linear MemoryïŒç·åœ¢ã¡ã¢ãªïŒ ãšåŒã°ãããåäžã®é£ç¶ãããã€ãåãèªèº«ã®ã¡ã¢ãªç©ºéãšããŠæã¡ãŸãããã®ç·åœ¢ã¡ã¢ãªã¯ãJavaScriptåŽãã㯠WebAssembly.Memory ãªããžã§ã¯ãã® buffer ãšããŠèŠããŸãïŒå㯠ArrayBuffer ïŒã C++ã³ãŒããWasmã«ã³ã³ãã€ã«ããããšãã°ããŒãã«å€æ°ãã¹ã¿ãã¯é åããã㊠malloc / new ã«ãã£ãŠç¢ºä¿ãããããŒãé åã¯ããã¹ãŠãã®ç·åœ¢ã¡ã¢ãªã®äžã«é
眮ãããŸãããããã£ãŠãC++ãªããžã§ã¯ãã®ãå®äœããšã¯ããã®ç·åœ¢ã¡ã¢ãªäžã®ç¹å®ã®ã¢ãã¬ã¹ããå§ãŸãé åã«ã»ããªããŸãããJavaScriptã®èŠç¹ã§èšãæããã°ãC++ã®ãªããžã§ã¯ãã¯ã巚倧㪠ArrayBuffer ïŒïŒ WebAssembly.Memory ãå
éšã«ä¿æããäžæ¬ã®é
åïŒã®äžã«ããã€ãåãšããŠæ ŒçŽãããŠããã®ã§ãã ãŸãã¯ãã®ããšããç°¡åãªã³ãŒãã§ç¢ºèªããŠãããŸãã C++åŽã§ãæå®ãããã¢ãã¬ã¹ããå§ãŸããã€ãåã®åèšå€ãèšç®ããã颿°ãå®è£
ããŸãã // C++åŽïŒptrã¯ç·åœ¢ã¡ã¢ãªå
ã®ãªãã»ããïŒã¢ãã¬ã¹ïŒ extern "C" int sum_bytes ( const uint8_t * ptr, int len) { int total = 0 ; for ( int i = 0 ; i < len; i++) total += ptr[i]; return total; } JavaScriptåŽã§ã¯ãEmscriptenãæäŸãã _malloc ã§ç·åœ¢ã¡ã¢ãªäžã®é åã確ä¿ãã HEAPU8 ãéããŠå€ãæžã蟌ã¿ãŸãããã®ãšãã颿°ã«æž¡ã ptr ã¯åãªãæ°å€ïŒã¢ãã¬ã¹ïŒã§ãã const bytes = new Uint8Array ([ 10 , 20 , 30 ]) ; // 1. ç·åœ¢ã¡ã¢ãªäžã«3ãã€ãç¢ºä¿ const ptr = Module . _malloc ( bytes . length ) ; // 2. JSããç·åœ¢ã¡ã¢ãªãžæžã蟌ã Module . HEAPU8 . set ( bytes , ptr ) ; // 3. C++åŽã§åãã¡ã¢ãªé åãèªã¿åã£ãŠåèšãèšç® const total = Module . _sum_bytes ( ptr , bytes . length ) ; // 4. ã¡ã¢ãªãè§£æŸ Module . _free ( ptr ) ; console . log ( total ) ; // 60 ptr ã¯C++ããèŠãã°ããã€ã³ã¿ãã§ãããJSããèŠãã° HEAPU8 ã®ãæ·»åïŒnumberïŒãã«éããŸããã HEAPU8[ptr] ãšèšè¿°ããããšã§ãC++åŽããã€ã³ã¿ãéããŠã¢ã¯ã»ã¹ããã®ãšãå
šãåãã¡ã¢ãªé åãJSåŽã§ãåç
§ã§ããŸãã C++ãªããžã§ã¯ãã®å®äœ Emscriptenã§ã³ã³ãã€ã«ãããC++ã³ãŒãã«ãããŠã new ã std::vector ãªã©ã«ããåçãªã¡ã¢ãªç¢ºä¿ã¯ããã¹ãŠWasmã®ç·åœ¢ã¡ã¢ãªå
ïŒã®ããŒãé åïŒã«å¯ŸããŠè¡ãããŸããJSåŽããåŒã³åºã _malloc ããåãããŒãé åããã¡ã¢ãªãåãåºããŸãã C++ãªããžã§ã¯ãã®ãå®äœããšã¯ãlinear memoryäžã®ç¹å®ã®ã¢ãã¬ã¹ããå§ãŸããæ°ãã€ãããæ°ã¡ã¬ãã€ãã®é åã®ããšã§ããäŸãã°ã以äžã®ã¯ã©ã¹ãèããŸãã class ByteBuffer { public : explicit ByteBuffer ( size_t n) : data_ (n, 0 ) {} size_t size () const { return data_. size (); } private : std :: vector < uint8_t > data_; // äžèº«ã¯ããŒãäžã®å¥é åãæã }; new ByteBuffer(1024) ãå®è¡ãããšããŸã ByteBuffer æ¬äœïŒvectorã®ãã€ã³ã¿ããµã€ãºæ
å ±ãªã©ïŒãããŒãã«ç¢ºä¿ããããã®å
éšã®vectorãããã«1024ãã€ããããŒãã«ç¢ºä¿ããŸãããããã¯ããããlinear memoryå
ã«ååšããŸãã C++ã®äžã§å®çµããŠããéãããã®å¯¿åœç®¡çã¯èšèªä»æ§ã«ãã£ãŠä¿èšŒãããŠããŸããã¹ã³ãŒããæããã°ã¹ã¿ãã¯äžã®ãªããžã§ã¯ãã¯ç Žæ£ããã std::vector ã確ä¿ããã¡ã¢ãªãèªåçã«è§£æŸãããŸãã delete ãåŒã³åºãã°ãã¹ãã©ã¯ã¿ãé£éããã¡ã¢ãªã¯å®å
šã«ååãããŸããã€ãŸãã RAIIïŒResource Acquisition Is InitializationïŒãšãã¹ãã©ã¯ã¿ã®ä»çµã¿ããã¡ã¢ãªã®ç¢ºä¿ãšè§£æŸã®å¯Ÿå¿ãæ
ä¿ããŠãã ã®ã§ãã ãããããã®ä¿èšŒãæå¹ãªã®ã¯ãC++ã®ã©ã€ãã¿ã€ã 管çãå±ãç¯å²ã«ãããéã ãã§ãããªããžã§ã¯ããžã®åç
§ãJSåŽã«æž¡ããšããã®åæã¯åŽ©ããŸãã å¢çãè¶ãããšå¯¿åœã®æ
å ±ã倱ããã JavaScriptã§ã¯ãã©ããããåç
§ãããªããªã£ããªããžã§ã¯ãã¯GCïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒã«ãã£ãŠèªåçã«ååãããŸããããããGCã寿åœã管çã§ããã®ã¯ãJSããŒãäžã«ããJSã®å€ãã ãã§ããC++ãªããžã§ã¯ãã®å®äœã¯ãåè¿°ã®ãšããç·åœ¢ã¡ã¢ãªïŒå·šå€§ãª ArrayBuffer ïŒã®äžé åã«ããããGCããèŠãã°ãçåããŠãã1ã€ã®å€§ããªç®±ãã®å
åŽã§ãããããŸããããã®ç®±ã®å
éšã®ã©ããæå¹ã§ãã©ããè§£æŸæžã¿ãªã®ãããGCã¯é¢ç¥ããªãã®ã§ãã ãã®ãããC++ãªããžã§ã¯ãã®ã¢ãã¬ã¹ãä¿æããŠããJS倿°ã䜿ãããªããªããGCã«ååããããšããŠããç·åœ¢ã¡ã¢ãªäžã®å®äœã¯ç¢ºä¿ããããŸãŸæ®ãç¶ããŸããC++ã®ãã¹ãã©ã¯ã¿ã¯åŒã°ãããã¡ã¢ãªã¯ãªãŒã¯ããŸãã éã®ã±ãŒã¹ãåæ§ã§ãC++åŽã§ free ãåŒãã§ã¡ã¢ãªãè§£æŸããŠããJS倿°ãæ¡ã£ãŠããã¢ãã¬ã¹ïŒãã ã®æ°å€ïŒã¯ãã®ãŸãŸæ®ããŸãããã§ã«ç¡å¹ã«ãªã£ãé åãæãç¶ãããã®æ°å€ã䜿ãã°ãè§£æŸæžã¿ã¡ã¢ãªãèªã¿æžããããUse-after-freeããåŒãèµ·ãããŸãã ããããC++/JSéã®å¢çãè¶ããéã«ãããã®ã¢ãã¬ã¹ã¯ByteBufferãæããæææš©ã¯ãã¡ãã«ããããšããåãšæææš©ã®ã¡ã¿æ
å ±ãåãªãæ°å€ã«å€æãããŠå€±ãããŸãããã®çµæãã誰ããã€è§£æŸããã®ãããšããæææš©ã®æåšãåã·ã¹ãã ãããã©ã³ã¿ã€ã ãããèŠããªããªããåé¡ãçºçããŸãã embindã¯äœãé ããäœãé ããªãã®ã ãããŸã§ãWebAssemblyãšJavaScriptéã§ããŒã¿ãããåãããããã«ã以äžã®äœã¬ã€ã€ãŒãªæé ãå¿
èŠã§ããããšã確èªããŸããã _malloc ã§ã¡ã¢ãªã確ä¿ãã HEAPU8.set çãä»ããŠæåã§ããŒã¿ãã³ããŒãã 確ä¿ããã¡ã¢ãªã®ã¢ãã¬ã¹ãæ°å€ãšããŠç®¡çãã embindã¯ãããããäœã¬ã€ã€ãŒã®ãé
管ãåŠçã宣èšçãªèšè¿°ã«çœ®ãæããJavaScriptãšC++ã®éã®ãã€ã³ãã£ã³ã°å®è£
ãçååå¯èœãªãEmscriptenã®åŒ·åãªæ©èœã§ãã embindãæå¹ã«ããã«ã¯ããã«ãæã« -lembind ãªãã·ã§ã³ãä»äžããŸããå©çšã«ããã£ãŠã¯ãC++åŽã§ EMSCRIPTEN_BINDINGS ãããã¯ãèšè¿°ããå
¬éããã颿°ãã¯ã©ã¹ãæç€ºããŸãã #include <emscripten/bind.h> using namespace emscripten; // æ§é äœïŒåçŽãªå€ã®ã»ãã struct Point { float x; float y; }; Point midpoint ( const Point& a, const Point& b) { return Point{(a.x + b.x) / 2 , (a.y + b.y) / 2 }; } // ã¯ã©ã¹ïŒç¶æ
ãæã€ãªããžã§ã¯ã class ByteBuffer { public : explicit ByteBuffer ( size_t n) : data_ (n, 0 ) {} size_t size () const { return data_. size (); } void fill ( uint8_t v) { std :: fill (data_. begin (), data_. end (), v); } private : std :: vector < uint8_t > data_; }; EMSCRIPTEN_BINDINGS (demo) { // æ§é äœãJSã®ãã¬ãŒã³ãªãªããžã§ã¯ããšããŠãããã³ã° value_object<Point>( "Point" ) . field ( "x" , &Point::x) . field ( "y" , &Point::y); function ( "midpoint" , &midpoint); // ã¯ã©ã¹ãJSã®ã¯ã©ã¹ãšããŠãããã³ã° class_<ByteBuffer>( "ByteBuffer" ) .constructor< size_t >() . function ( "size" , &ByteBuffer::size) . function ( "fill" , &ByteBuffer::fill); // åç»é²ïŒJSããæäœå¯èœã«ããïŒ register_vector< float >( "VectorFloat" ); } ãã®å®çŸ©ã«ãããJavaScriptåŽããã¯ããããããã€ãã£ããªãªããžã§ã¯ããæ±ããã®ããã«ãC++åŽã®æ©èœãå©çšã§ããŸãã // JSåŽããã®å©çšäŸ const m = Module . midpoint ({ x : 0 , y : 0 } , { x : 10 , y : 4 }) ; console . log ( m . x , m . y ) ; // 5 2 const buf = new Module . ByteBuffer ( 1024 ) ; buf . fill ( 0xff ) ; console . log ( buf . size ()) ; // 1024 embindãå©çšããããšã§ã _malloc ã«ããæåã¡ã¢ãªç¢ºä¿ã HEAPU8 ã®çŽæ¥æäœãšãã£ãäœã¬ãã«ãªèšè¿°ã¯é èœãããã³ãŒããç°¡æœã«ãªããŸãã ãããç§ã¯ãåç¯ã§è¿°ã¹ãäœã¬ã€ã€ãŒã«ãããåŠçã®çè§£ã¯éèŠã ãšèããŠããŸããç§èªèº«ã«ã€ããŠèšãã°ãåç¯ã§èŠãç·åœ¢ã¡ã¢ãªã®æåãäžåºŠèªåã®æã§ç¢ºãããããšã§ãããããembindã®å®£èšçãªèšæ³ã䜿ãããªããããã«ãªã£ãããã§ãããŸãããã€ãã³ãã«ã delete() ãã¹ããããªã確ä¿ããã¯ãã®ãã¥ãŒãå£ããããšãããã®ããšãã£ãçåã«ããçéãç«ãŠãŠèããããããã«ãªããŸããã 以éã§ã¯ãembindã䜿ã£ãŠJS/C++éã§ããŒã¿ãåãæž¡ãææ³ãèŠãŠãããŸãããã®èгç¹ã§æŽçãããšãæ¬èšäºãæ±ã代衚çãªãã¿ãŒã³ã¯ã ã³ã㌠ã ãã³ãã« ã ãŒãã³ããŒã®ãã¥ãŒ ã®3ã€ã«åããããŸãã value_object ã¯ã³ã㌠value_object<Point> ãšããŠå
¬éããæ§é äœã¯ãJS/C++ã®å¢çãè¶ãããã³ã«ãJSã®ãã¬ãŒã³ãªãªããžã§ã¯ããžè©°ãæ¿ããããŸããéæ¹åãåãã§ãããã®ãããè¿ã£ãŠãã m ã¯C++åŽã®å®äœãžã®åç
§ã§ã¯ãªããç¬ç«ããè€è£œã§ããããšãã° m.x = 99 ãšæžãæããŠãC++åŽã«ã¯åœ±é¿ããŸããã䜿ãçµãã£ãããšã¯ãéåžžã®JSãªããžã§ã¯ããšåãããã«GCã«ãã£ãŠååãããŸãã ã€ãŸãã value_object ã¯ãæææš©ãæèããã«æ±ããäžæ¹ã§ãJS/C++ã®å¢çãè¶ãããã³ã«ã³ããŒãçºçããä»çµã¿ã§ãã ãã®ä»çµã¿ã¯ã座æšãèšæž¬å€ã®ãããªå°ããªå€ã®ãŸãšãŸããæ±ãã®ã«åããŠããŸããäžæ¹ã§ã倧ããªé
åãå
å
ããæ§é äœãæ¯ãã¬ãŒã åŸåŸ©ããããããªçšéã«ã¯åããŸããã ãŸãã value_object ã¯çŽç²ãªå€ã®æã§ããããšãåæã§ãããã£ãŒã«ãã«çãã€ã³ã¿ãæææš©ãæã€ãªãœãŒã¹ãå«ããèšèšã¯é¿ããã¹ãã§ããã³ããŒãããå
ã§ããã®ãã€ã³ã¿ãäœãæããŠããã®ãã誰ãè§£æŸããã®ããšããæ
å ±ã倱ãããåãªãã¢ãã¬ã¹å€ã ããæ®ã£ãŠããŸãããã§ãã class_ ã¯ãã³ãã« new Module.ByteBuffer(1024) ãå®è¡ãããšãC++ã®ããŒããããªãã¡linear memoryå
ã« ByteBuffer ã®å®äœã new ãããŸããJSåŽã«è¿ã£ãŠããã®ã¯ããã®å®äœãæããã³ãã«ãå
èµããèãã©ãããŒãªããžã§ã¯ãã§ãã 第1éšã§èŠããšãããC++ãªããžã§ã¯ãã®å®äœã¯linear memoryäžã«ãããŸããJSã®å€æ°ãä¿æããŠããã®ã¯ããã®å®äœãã®ãã®ã§ã¯ãªããå®äœãæããã³ãã«ã§ãã buf.fill(0xff) ãåŒã¶ãã³ã«ãåŒã³åºãã¯JSããWasmäžã®åãC++å®äœã«å±ããŸããããã§ã¯ã³ããŒã¯èµ·ããŸããã ãã®ä»£ããã å®äœã®è§£æŸã¯JSåŽãåŒãåããæç€ºçã« delete() ãå®è¡ãã å¿
èŠããããŸãã register_vector ã§å
¬éãã std::vector ããåºæ¬çã«ã¯ class_ ãšåã系統ã§ããè¿ã£ãŠããã®ã¯çŽ ã®JSé
åã§ã¯ãªãã .size() ã .get(i) ã .set(i, x) ã .push_back(x) ãªã©ãæã€ãã³ãã«ã§ãã ãã®ä»çµã¿ã®ãããèŠçŽ ã¢ã¯ã»ã¹ã®ãã³ã«JSããC++åŽãžã®åŒã³åºããçºçããŸãããã£ãŠã巚倧ãªé
åã .get(i) ã®ã«ãŒãã§äžèŠçŽ ãã€èµ°æ»ãããšãJS/C++éåŒã³åºãã®ã³ã¹ãããã®åæ°åã ãç©ã¿äžãããŸãããŸãããã³ãã«èªäœã«ã¯æç€ºçãªç Žæ£ãå¿
èŠã§ãã èŠçŽ ãã®ãã®ã¯ã³ããŒã«ãã£ãŠå®å
šã«ããåããããŸããããã³ãã«ã®åŸå§æ«ã¯JSåŽãæ
ãå¿
èŠããããŸããæ¬¡ã«èŠã typed_memory_view ãšå¯Ÿæ¯ãããšã register_vector ã¯ãäžèº«ã®æ±ãã¯å®å
šå¯ãã ããç Žæ£ã®è²¬åã¯æ®ãé
åããšäœçœ®ã¥ããããŸãã typed_memory_view ã¯ãã¥ãŒ typed_memory_view ãæäŸããã®ã¯ããŒãã³ããŒã®ã¢ã¯ã»ã¹ã§ããC++åŽã®é£ç¶é åãäžåè€è£œãããJSã® TypedArray ãšããŠãã®ãŸãŸèŠãããŸããããšãã°ãã«ã¡ã©ç»åã®ãããªRGBAãããã¡ãè¿ãäŸãèããŠã¿ãŸãã #include <emscripten/val.h> class FrameBuffer { public : FrameBuffer ( int w, int h) : pixels_ (w * h * 4 , 0 ) {} // å
éšãããã¡ãæããã¥ãŒãè¿ããã³ããŒã¯çºçããªã emscripten::val pixels () { return emscripten:: val ( emscripten:: typed_memory_view (pixels_. size (), pixels_. data ())); } private : std :: vector < uint8_t > pixels_; // RGBA }; const frame = new Module . FrameBuffer ( 640 , 480 ) ; const view: Uint8Array = frame . pixels () ; // linear memoryãçŽæ¥æãçª view [ 0 ] = 255 ; // C++åŽã®pixels_[0]ãçŽæ¥æžãæãã ãã® view ã®æ£äœã¯ã第1éšã§èŠã HEAPU8 ã®éšåãã¥ãŒã§ããlinear memoryäžã® pixels_.data() ããå§ãŸãé åããJSã® Uint8Array ãšããŠçŽæ¥èŠãŠããã ãã§ããã³ããŒãçºçããªããããã¡ã¬ãã€ãçŽã®ãããã¡ã§ãã»ãŒäžç¬ã§JSåŽãžãæž¡ããããšãã§ããŸãã ãã ãããã¥ãŒã¯ãããŸã§ããã¥ãŒããªããããã®æå¹æéã¯ãå
ã®ãããã¡ã®å¯¿åœã«å®å
šã«æ¯é
ãããŸããå
·äœçã«ã¯ã次ã®ãããããèµ·ããæç¹ã§ãã¥ãŒã¯ç¡å¹ã«ãªããŸãã å
ã®ãªããžã§ã¯ããã€ãŸã frame ãç Žæ£ããã â viewã¯è§£æŸæžã¿é åãæãããšã«ãªã å
éšã® std::vector ãå確ä¿ããã â viewã¯å€ãã¢ãã¬ã¹ãæãããŸãŸã«ãªã ç·åœ¢ã¡ã¢ãªãæé·ãã 第1éšã§äºåãããšããã ArrayBuffer ãå·®ãæ¿ãããå€ããã¥ãŒã¯detachããããæé·ã¯å¥ã®å Žæã® malloc ããã£ããã«èµ·ããããšããããããèªåã®ã³ãŒãããã®ãããã¡ã«äœãããŠããªããŠãããã¥ãŒãç¡å¹ã«ãªãå¯èœæ§ãããã ãããã£ãŠ typed_memory_view ã®éåã¯ã ååŸãããå³åº§ã«èªã¿æžãããæã¡è¶ããªã ãã§ããä¿æããŠäœ¿çšãç¶ãããããŒã¿ã¯ã view.slice() ãªã©ã§ãã®å Žã§JSåŽãžã³ããŒããåãé¢ããŠããå¿
èŠããããŸãã 3ã€ã®æž¡ãæ¹ããŸãšãããšã次ã®ããã«æŽçã§ããŸãã ã³ããŒïŒ value_object ïŒã¯ãæææš©ãèããªããŠãã代ããã«ã³ããŒã³ã¹ããæãã ãã³ãã«ïŒ class_ / register_vector ïŒã¯ãã³ããŒãé¿ãããã代ããã«ãJSåŽãè§£æŸã®è²¬åãè² ãã ãã¥ãŒïŒ typed_memory_view ïŒã¯é«éã ããå
ãããã¡ã®å¯¿åœãšå®å
šã«çµã³ã€ãã ãããã« æ¬èšäºã§ã¯ããŸãWasmã®ç·åœ¢ã¡ã¢ãªãšããåå°ã確èªãããã®äžã§embindãæäŸãã3ã€ã®ããŒã¿ã®æž¡ãæ¹ãèŠãŠããŸããã embindã®å®£èšçãªAPIã¯ã _malloc ã HEAPU8 ãšãã£ãäœã¬ã€ã€ãŒãé èœããŠãããŸãããããæææš©ãšå¯¿åœã®è²¬åã¯ãããã°ã©ããååã«èªèãã管çããå¿
èŠããããŸããæ¬èšäºã§ã¯ãäœã¬ã€ã€ãŒã®æåããé ã远ã£ãŠè§£èª¬ããããšã§ãembindãå®è£
ã«æ¡çšããå Žåãããã®APIã®èåŸã§æææš©ãšå¯¿åœãã©ãæ±ãããŠããããèŠéããããã«ãªãããšãç®æããŸããã åãããã«Emscriptenãšåãåãæ¹ã«ãšã£ãŠãæ¬èšäºãã¡ã¢ãªç®¡çãçéç«ãŠãŠèããããã®äžå©ãšãªãã°å¹žãã§ãã ZOZOã§ã¯ãäžç·ã«ãµãŒãã¹ãäœãäžããŠãããæ¹ãåéäžã§ãããèå³ã®ããæ¹ã¯ã以äžã®ãªã³ã¯ãããã²ãå¿åãã ããã corp.zozo.com
æ¬ããã°ã¯ 2026 幎 7 æ 30 æ¥ã«å
¬éããã AWS Blog â Extend Amazon Inspector SBOM Generator with Plugins â ã翻蚳ãããã®ã§ãã Amazon Inspector ã¯ã Amazon Web Services (AWS) ã®ã¯ãŒã¯ããŒããç¶ç¶çã«ã¹ãã£ã³ããŠãœãããŠã§ã¢ã®è匱æ§ãæ€åºãããèªååãããè匱æ§ç®¡çãµãŒãã¹ã§ããAmazon Inspector ã®è匱æ§ç®¡çæ©èœã¯ã Amazon Inspector SBOM Generator (inspector-sbomgen) ãšåŒã°ããè³ç£ã€ã³ãã³ããªãšã³ãžã³ã«ãã£ãŠæ¯ããããŠããŸããããã¯ã¹ã¿ã³ãã¢ãã³ã®ã³ãã³ãã©ã€ã³ããŒã«ã§ãã³ã³ããã€ã¡ãŒãžããã£ã¬ã¯ããªãã¢ãŒã«ã€ããããŒã«ã«ã·ã¹ãã ãã³ã³ãã€ã«æžã¿ãã€ããªãªã©ãã ãœãããŠã§ã¢éšå衚 (SBOM) ãçæããŸããéå» 2 幎éã§ãAWS 㯠inspector-sbomgen ã®ã«ãã¬ããžãæ°åã®ããã°ã©ãã³ã°èšèªãšã³ã·ã¹ãã ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãåºãå°å
¥ãããŠããã¢ããªã±ãŒã·ã§ã³ãžãšæ¡å€§ããŠããŸããã ä»åãinspector-sbomgen ãå©çšãããã«ããŒåãã®æ°æ©èœãšããŠãç¬èªã®ã«ã¹ã¿ã ããã±ãŒãžã³ã¬ã¯ã¿ãŒãèšè¿°ã§ãã ãã©ã°ã€ã³ã·ã¹ãã ãçºè¡šããŸãããœãŒã¹ã³ãŒãã®ã³ã³ãã€ã«ãå
¬åŒãªãªãŒã¹ãåŸ
ã€å¿
èŠã¯ãªããããã«äœ¿ãå§ããããšãã§ããŸãã inspector-sbomgen ã®ææ°ããŒãžã§ã³ã¯ã Amazon Inspector ãŠãŒã¶ãŒã¬ã€ã ããããŠã³ããŒãã§ããŸãã ãã®èšäºã§ã¯ãinspector-sbomgen ãã©ã°ã€ã³ã·ã¹ãã ã§ã§ããããšããããæ§ç¯ããçç±ããããŠæ°åã§æåã®ãã©ã°ã€ã³ãæžãæ¹æ³ã玹ä»ããŸããããããŠããã©ã°ã€ã³ãçæããããã±ãŒãžã³ã³ããŒãã³ãã Amazon Inspector ã®è匱æ§ã¹ãã£ã³ãšçµ±åããæ¹æ³ããã»ãã¥ãªãã£ã匷åãããäºæž¬å¯èœãªãã©ã°ã€ã³åäœãå®çŸãããã©ã°ã€ã³ã®å®å
šæ§ã¢ãã«ã«ã€ããŠã解説ããŸãã ãã©ã°ã€ã³ã·ã¹ãã ãæ§ç¯ããçç± ãœãããŠã§ã¢ã®ãšã³ã·ã¹ãã ã¯åçã§ããæ°ããèšèªããã±ãŒãžãããŒãžã£ãŒãããã¯ãã¡ã€ã«åœ¢åŒããšã³ããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ãçµ¶ãããªãªãŒã¹ããããã®å€ãã¯è¿
éã«æ¡çšãããŸããäžã«ã¯ã»ãã¥ãªãã£ã®æ€èšŒãã»ãšãã©è¡ãããªããŸãŸäœ¿ããããã®ããããŸãããã®çµæãã»ãã¥ãªãã£ããŒã ã«ã¯å¯èŠæ§ã®ã®ã£ãããæ®ããŸããã€ãŸããSBOM ããŒã«ããŸã èªèã§ããªããœãããŠã§ã¢ãæ¬çªã¯ãŒã¯ããŒãã§åããŠãããšããç¶æ
ã§ããã客æ§ããã¯ããããããšã³ã·ã¹ãã ã®å€ããçŽæ¥ã€ã³ãã³ããªåããããšããèŠæãããã ããŠããŸãããæè¿ãŸã§ããããå®çŸããå¯äžã®æ¹æ³ã¯ãæ©èœãªã¯ãšã¹ããåºã㊠inspector-sbomgen ããŒã ããšã³ã·ã¹ãã ã«å¯Ÿå¿ããæ°ãããªãªãŒã¹ããããã€ããã®ãåŸ
ã€ããšã§ããã inspector-sbomgen ãã©ã°ã€ã³ã·ã¹ãã ã¯ããã®ç¶æ³ãå€ããŸãããã©ã°ã€ã³ã䜿ããšã次ã®ããšãã§ããŸãã inspector-sbomgen ãæšæºã§ã¯å¯Ÿå¿ããŠããªããšã³ã·ã¹ãã ãžã®å¯Ÿå¿ â æ°ãããªãŒãã³ãœãŒã¹ãšã³ã·ã¹ãã ãããããŸãã¯å€åã®éãããã±ãŒãžåœ¢åŒãçµç¹ç¬èªã®ããŒã«ãªã©ãinspector-sbomgen ã倿Žããããšãªãã€ã³ãã³ããªåã§ããŸã ãšã³ã·ã¹ãã æ€åºã®è¿
éãªãããã¿ã€ãã³ã° â éçºè
ã«ã AI ã³ãŒãã£ã³ã°ã¢ã·ã¹ã¿ã³ãã«ãæ±ãããããã©ã°ã€ã³ã·ã¹ãã ãèšèšããŸããããã©ã°ã€ã³ã¯ Lua ã§èšè¿°ãããå®è¡æã«ããŒãããããããGo ããŒã«ãã§ãŒã³ãã³ã³ãã€ã«ãäžèŠã§ããçµã¿èŸŒã¿ã®ãã¹ãããŒãã¹ã䜿ã£ãŠãã©ã°ã€ã³ãç¹°ãè¿ãæ¹åããããã«çµæã確èªã§ããŸã å®å®ããåºç€ã®äžã§ã®æ§ç¯ â ãã©ã°ã€ã³ API ã¯ã¢ãŒãã£ãã¡ã¯ãã®çš®é¡ã«ããéããæœè±¡åãããããæ€åºããžãã¯ãäžåºŠæžãã ãã§ãã³ã³ããã€ã¡ãŒãžãã¢ãŒã«ã€ããããŒã«ã«ã·ã¹ãã ãªã©ã§ã·ãŒã ã¬ã¹ã«åäœããŸãããŸãããã©ã°ã€ã³ã¯ sbomgen ã®å
éšæ§é ããåé¢ãããŠãããããã³ã¢ããŒã«ã§ãªã°ã¬ãã·ã§ã³ãçºçããå Žåã®åœ±é¿ç¯å²ãå°ããæããããŸã å®éãç§ãã¡èªèº«ããã®ãã©ã°ã€ã³ã·ã¹ãã ãå
éšã§æŽ»çšããæ°ãããšã³ã·ã¹ãã ã®ã«ãã¬ããžã以åããéãæäŸã§ããããã«ãªããŸããã 1.13 ãªãªãŒã¹ ã§ã¯ãApache TomcatãNGINXãMySQLãRedisãWordPressãOpenSSH ããŒã«ãã§ãŒã³ãªã©ããããŸã§ Go ã§å®è£
ãããŠãã 20 以äžã®ãšã³ã·ã¹ãã ãããã©ã°ã€ã³ãšã㊠sbomgen ãã€ããªã«çµã¿èŸŒãŸããŠããŸããåããªãªãŒã¹ã§ã¯ãApache CassandraãApache StrutsãCondaãSwift ããã±ãŒãžãAI ãšãŒãžã§ã³ãã³ã¬ã¯ã¿ãŒ (Amazon Q DeveloperãKiro CLIãClaude CodeãGitHub CopilotãOllama) ãªã©ã10 ãè¶
ããæ°ãããšã³ã·ã¹ãã ããã©ã°ã€ã³ãšããŠè¿œå ãããŸããã inspector-sbomgen ãã©ã°ã€ã³ã®ä»çµã¿ sbomgen ãã©ã°ã€ã³ã¯ 2 段éã®ãã€ãã©ã€ã³ã§åäœããŸãã æ€åº (discovery) â ã¢ãŒãã£ãã¡ã¯ãã®ãã¡ã€ã«ã·ã¹ãã ãã¹ãã£ã³ããã€ã³ã¹ããŒã«æžã¿ããã±ãŒãžã®ã¡ã¿ããŒã¿ãå«ããã¡ã€ã«ãç¹å®ããŸã åé (collection) â æ€åºãããåãã¡ã€ã«ãéãããã¡ã€ã«ã®å
容ãè§£æããŠãçµæã SBOM ã«ãããªãã·ã¥ããŸã å
éšã§ã¯ãã€ãã³ããã¹ãæ€åºãã©ã°ã€ã³ãšåéãã©ã°ã€ã³ãã€ãªãã§ããŸããæ€åºãã©ã°ã€ã³ã¯æ€åºãããã¡ã€ã«ã®äžèЧãã€ãã³ããšããŠãããªãã·ã¥ãã1 ã€ä»¥äžã®åéãã©ã°ã€ã³ããã®ã€ãã³ãããµãã¹ã¯ã©ã€ãããŠãããã±ãŒãžåéãããªã¬ãŒããŸããéçºè
ã«ãšã£ãŠã¯ããã㯠ãªãã¶ãŒããŒãã¿ãŒã³ ãšããŠããªãã¿ã®åäœã§ãããã ãã®åé¢ã«ããã1 ã€ã®æ€åºãã©ã°ã€ã³ãè€æ°ã®ã³ã¬ã¯ã¿ãŒã«ããŒã¿ãäŸçµŠã§ããŸããäŸãã°ãããã³ã¬ã¯ã¿ãŒã¯ããã±ãŒãžã¡ã¿ããŒã¿ãæœåºããå¥ã®ã³ã¬ã¯ã¿ãŒã¯ã·ãŒã¯ã¬ãããã¹ãã£ã³ããããã«å¥ã®ã³ã¬ã¯ã¿ãŒã¯ããªã·ãŒããã§ãã¯ããããšãã£ãæ§æãå¯èœã§ããååéãã©ã°ã€ã³ã¯ãèšç®ã³ã¹ãã®é«ãã¢ãŒãã£ãã¡ã¯ããã¡ã€ã«ã·ã¹ãã ã®åèµ°æ»ãè¡ãããšãªããåããã¡ã€ã«ãªã¹ããå©çšã§ããŸãã 5 åã§æžããæåã®ãã©ã°ã€ã³ inspector-sbomgen ã䜿ãã°ããã©ã°ã€ã³ç°å¢ãç°¡åã«ã»ããã¢ããã§ããŸãã plugin new ã³ãã³ãã§ sbomgen ã«æ°ãããã©ã°ã€ã³ã¯ãŒã¯ã¹ããŒã¹ãäœæããã --with-example ãã©ã°ãæå®ãããšãããã«å®è¡ã§ããæ€åºãã©ã°ã€ã³ãšåéãã©ã°ã€ã³ã®ãã¢ãã¯ãŒã¯ã¹ããŒã¹ã«çšæãããŸãã inspector-sbomgen plugin new --with-example äžèšã®ã³ãã³ããå®è¡ãããšããã©ã°ã€ã³åãšããã©ã°ã€ã³ã¯ãŒã¯ã¹ããŒã¹ãæ ŒçŽãããã£ã¬ã¯ããªã®å
¥åãæ±ããããŸããã«ã¹ã¿ã å€ãæå®ããããšããããã©ã«ãå€ããã®ãŸãŸäœ¿ãããšãã§ããŸãã Plugin name (identifies the software ecosystem your plugin will inventory, e.g. debian-dpkg, rhel-rpm, python-pip, cmake) [my-custom-ecosystem]: <enter> Project directory [my-sbomgen-plugins]: <enter> Created plugin "my-custom-ecosystem" in my-sbomgen-plugins/ ãªãã察å¿ããã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ (CLI) åŒæ°ã§ãã©ã°ã€ã³åãšãã£ã¬ã¯ããªãæå®ããã°ã察話圢åŒã®ããã³ãããã¹ãããã§ããŸãã inspector-sbomgen plugin new \ --with-example \ --name my-custom-ecosystem \ --path my-sbomgen-plugins ãã©ã°ã€ã³ã¯ãŒã¯ã¹ããŒã¹ãäœæãããšãinspector-sbomgen ã¯æ¬¡ã®ã¹ããããæ¡å
ããç»é¢ã衚瀺ããŸããéçºè
ã AI ã³ãŒãã£ã³ã°ã¢ã·ã¹ã¿ã³ãã«å¯ŸããŠã倿Žãå¿
èŠãªãœãŒã¹ãã¡ã€ã«ãé¢é£ããã¥ã¡ã³ãã®å Žæã瀺ããŠãããŸãã Next steps: Get started: 1. Open plugin folder in a code editor (VS Code recommended) 2. Add test files that your plugin will discover and parse (e.g., config files, lockfiles, binaries, etc.): my-sbomgen-plugins/discovery/cross-platform/extra-ecosystems/my-custom-ecosystem/_testdata/ Develop: 3. Edit discovery: my-sbomgen-plugins/discovery/cross-platform/extra-ecosystems/my-custom-ecosystem/init.lua 4. Edit collection: my-sbomgen-plugins/collection/cross-platform/extra-ecosystems/my-custom-ecosystem/init.lua Test: 5. Write unit tests: my-sbomgen-plugins/discovery/cross-platform/extra-ecosystems/my-custom-ecosystem/init_test.lua 6. Run unit tests: inspector-sbomgen plugin test --path my-sbomgen-plugins Deploy: 7. Distribute your plugin directory wherever you run inspector-sbomgen: inspector-sbomgen <arguments> --plugin-dir /path/to/my-sbomgen-plugins Example: inspector-sbomgen container --image alpine:latest -o /tmp/sbom.json --plugin-dir /path/to/my-sbomgen-plugins For code completion, install the VS Code Lua language server extension: https://luals.github.io/#vscode-install For more information: - Plugin guide: my-sbomgen-plugins/docs/sbomgen-plugin-developer-guide.md - Testing guide: my-sbomgen-plugins/docs/sbomgen-plugin-testing-guide.md - API reference: my-sbomgen-plugins/docs/sbomgen-plugin-api-reference.md - Documentation: https://docs.aws.amazon.com/inspector/latest/user/sbom-generator.html ãã©ã°ã€ã³ã¯ãŒã¯ã¹ããŒã¹ãã§ããã®ã§ããã®äžèº«ã詳ããèŠãŠã¿ãŸãããã tree my-sbomgen-plugins âââ AGENTS.md âââ collection â âââ cross-platform â âââ extra-ecosystems â âââ my-custom-ecosystem â âââ init.lua âââ discovery â âââ cross-platform â âââ extra-ecosystems â âââ my-custom-ecosystem â âââ _testdata â â âââ empty â â âââ example.lock â âââ init_test.lua â âââ init.lua âââ docs â âââ sbomgen-plugin-api-reference.md â âââ sbomgen-plugin-developer-guide.md â âââ sbomgen-plugin-testing-guide.md âââ library â âââ sbomgen.lua âââ README.md ã¹ãã£ãã©ãŒã«ãã£ã³ã°ããããããžã§ã¯ãã«ã¯ãåäœããæ€åºãã©ã°ã€ã³ãšåéãã©ã°ã€ã³ã®ãã¢ã _testdata/ é
äžã®ãã¹ããã£ã¯ã¹ãã£ã䜿ã£ãŠãã¹ãããŠããããã¹ããçµ±åéçºç°å¢ (IDE) 飿ºçšã® .vscode/settings.json ãéçºè
ããã¥ã¡ã³ãã®ããŒã«ã«ã³ããŒãå«ãŸããŠããŸãã ã¹ãã£ãã©ãŒã«ãã£ã³ã°ã¯ã人éãš AI ã³ãŒãã£ã³ã°ã¢ã·ã¹ã¿ã³ãã®äž¡æ¹ãèªã¿ãããããã«ãæå³çã«ç°¡æœã§å®çµããå
容ã«ãªã£ãŠããŸããåãã¡ã€ã«ã«ã¯ãããããã®é¢æ°ã®åœ¹å²ãšããã©ã°ã€ã³äœæè
ãèšè¿°ãã¹ãç®æã説æããæç¢ºãªã³ã¡ã³ããä»ããŠããŸãã ãã©ã°ã€ã³ããã¹ãããã«ã¯ããŸãããã±ãŒãžããã¯ãã¡ã€ã«ãã³ã³ãã€ã«æžã¿ãã€ããªãªã©ãã¹ãã£ã³å¯Ÿè±¡ãšãªããã®ãå¿
èŠã§ãããµã³ãã«ãã©ã°ã€ã³ã¯ã次ã®å
容ãæã€æ¶ç©ºã® example.lock ãã€ã³ãã³ããªåããŸãã my-package-alpha==1.0.0 my-package-beta==2.3.1 my-package-gamma==0.9.5 ä»å±ã®æ€åºãã©ã°ã€ã³ã¯ãã¢ãŒãã£ãã¡ã¯ãã®ãã¡ã€ã«ã·ã¹ãã å
ã§ example.lock ã®ã€ã³ã¹ã¿ã³ã¹ãæ¢ãæ¹æ³ãç¥ã£ãŠããŸãã -- my-custom-ecosystem discovery plugin -- Discovers example.lock files in the artifact file list. function discover() return sbomgen.find_files_by_name({"example.lock"}) end ãããŠãä»å±ã®åéãã©ã°ã€ã³ã¯ã example.lock ã®å
容ãè§£æããããã±ãŒãžæ
å ±ãåºå SBOM ã«ãããªãã·ã¥ããæ¹æ³ãç¥ã£ãŠããŸãã -- my-custom-ecosystem collection plugin -- Parses example.lock files and extracts package name and version. function collect(file_path) local content = sbomgen.read_file(file_path) if content == nil then return end for line in content:gmatch("[^\n]+") do local name, ver = line:match("^(.+)==(.+)$") if name and ver then sbomgen.push_package({ name = name, version = ver, purl_type = "generic", namespace = "my-custom-ecosystem", component_type = sbomgen.component_types.APPLICATION, }) end end end ãã¹ãã®å®è¡ ãã©ã°ã€ã³ã«ã¯ãã¹ããã¬ãŒã ã¯ãŒã¯ãçµã¿èŸŒãŸããŠãããããå®éã®ã¢ãŒãã£ãã¡ã¯ããã¹ãã£ã³ããåã«ããžãã¯ãæ€èšŒã§ããŸãããã¹ã㯠Lua ã§èšè¿°ãããã©ã°ã€ã³ãšåãå Žæã® init_test.lua ã«é
眮ããŠã _testdata/ å
ã®ãã£ã¯ã¹ãã£ããŒã¿ãåç
§ããŸãã function test_discovers_packages() local result = testing.scan_directory("_testdata") testing.assert_equals(3, #result.findings) testing.assert_equals("my-package-alpha", result.findings[1].name) testing.assert_equals("1.0.0", result.findings[1].version) end function test_no_findings_for_empty_directory() local result = testing.scan_directory("_testdata/empty") testing.assert_equals(0, #result.findings) end 次ã®ã³ãã³ãã§ãã¹ããå®è¡ããŸãã inspector-sbomgen plugin test --path my-sbomgen-plugins -v === RUN my-custom-ecosystem/discovery/init_test/test_discovers_packages --- PASS: my-custom-ecosystem/discovery/init_test/test_discovers_packages (0.04s) === RUN my-custom-ecosystem/discovery/init_test/test_no_findings_for_empty_directory --- PASS: my-custom-ecosystem/discovery/init_test/test_no_findings_for_empty_directory (0.04s) ok 2 tests passed ããã¯ãç§ãã¡ãèšèšãåŸãæãçãéçºã«ãŒãã§ããGo ããŒã«ãã§ãŒã³ããåãã«ãããã³ã³ããã®èµ·åãäžèŠã§ãããã¹ããæžããå®è¡ããç¹°ãè¿ãæ¹åããã ãã§ãã å®éã®ã¢ãŒãã£ãã¡ã¯ãã®ã¹ãã£ã³ ãã©ã°ã€ã³ãçµæãçæããã«ã¯ããã©ã°ã€ã³ãæ¢ããã¡ã€ã«ãå«ãã¢ãŒãã£ãã¡ã¯ãã inspector-sbomgen ã«äžããå¿
èŠããããŸãããµã³ãã«ãã©ã°ã€ã³ã®å Žåã example.lock ãã¡ã€ã«ãå«ãä»»æã®ãã£ã¬ã¯ããªã察象ã«ãªããŸããå
ã»ã©çæãããã£ã¯ã¹ãã£ãã¡ããã©è¯ã顿ã§ãã inspector-sbomgen directory \ --plugin-dir ./my-sbomgen-plugins \ --path ./my-sbomgen-plugins/discovery/cross-platform/extra-ecosystems/my-custom-ecosystem/_testdata \ -o sbom.json --plugin-dir ãã©ã°ã¯ãLua ãã©ã°ã€ã³ã®èªã¿èŸŒã¿å
ã inspector-sbomgen ã«äŒããŸããçæããã SBOM ã«ã¯ã example.lock å
ã® 3 ã€ã®ããã±ãŒãžããããã«å¯Ÿå¿ãã CycloneDX ã³ã³ããŒãã³ããå«ãŸããŸããäŸã以äžã«ç€ºããŸãã { "bom-ref": "comp-2", "type": "application", "name": "my-package-alpha", "version": "1.0.0", "scope": "optional", "purl": "pkg:generic/my-sbomgen-plugin/my-package-alpha@1.0.0", "properties": [ { "name": "amazon:inspector:sbom_generator:source_path", "value": "./my-sbomgen-plugins/example.lock" } ] } ãã©ã°ã€ã³ãçæãããã¹ãŠã®ã³ã³ããŒãã³ãã«ã¯ãåéå
ã®ãã¡ã€ã«ãèšé²ãã amazon:inspector:sbom_generator:source_path ããããã£ãä»ããŠããŸãããã®ãããã³ã³ããŒãã³ããçæå
ã®ã¢ãŒãã£ãã¡ã¯ããŸã§åžžã«ãã©ãããšãã§ããŸãã Amazon Inspector ã«ããè匱æ§ã¹ãã£ã³ ãã©ã°ã€ã³ãçæããããã±ãŒãžæ
å ±ã¯ãä»ã®ã³ã³ããŒãã³ããšåçã®æ£åŒãª SBOM ã³ã³ããŒãã³ããšããŠæ±ãããŸããAmazon Inspector ãå«ããCycloneDX SBOM ãèªã¿åãããããäžæµã®ããŒã«ã§å©çšã§ããŸããSBOM ã Amazon Inspector ã«éä¿¡ããŠè匱æ§åæãè¡ãã«ã¯ã --scan-sbom ãã©ã°ã远å ããŸã (æå¹ãª AWS ã¢ã«ãŠã³ããå¿
èŠã§ã)ã inspector-sbomgen directory \ --path ./my-sbomgen-plugins/discovery/cross-platform/extra-ecosystems/my-custom-ecosystem/_testdata \ --plugin-dir ./my-sbomgen-plugins \ --scan-sbom \ --aws-profile your_profile \ --aws-region your_region \ -o /tmp/sbom.json ãŸã£ããæ°ãããšã³ã·ã¹ãã ã«å¯Ÿå¿ããéã®éèŠãªæ³šæç¹ : ãã©ã°ã€ã³äœæè
ã¯ä»»æã®ãšã³ã·ã¹ãã ãã€ã³ãã³ããªåã§ããŸãããAmazon Inspector ãè匱æ§ãå ±åã§ããã®ã¯ãã¢ããã€ã¶ãªãååšããã³ã³ããŒãã³ãã«éãããŸããã¢ããã€ã¶ãªãã£ãŒãã«ãŸã å«ãŸããŠããªããšã³ã·ã¹ãã ã®ã³ã³ããŒãã³ãã Amazon Inspector ã«æž¡ããšãAmazon Inspector 㯠Component skipped: no supported rules found (ã³ã³ããŒãã³ãã¯ã¹ããããããŸãã: ãµããŒããããã«ãŒã«ãèŠã€ãããŸãã) ãšããããããã£ä»ãã§ã³ã³ããŒãã³ããè¿ããŸãã以äžã«äŸã瀺ããŸãã { "bom-ref": "comp-1", "name": "my-package-alpha", "properties": [ { "name": "amazon:inspector:sbom_scanner:path", "value": "my-sbomgen-plugins/discovery/cross-platform/extra-ecosystems/my-custom-ecosystem/_testdata/example.lock" }, { "name": "amazon:inspector:sbom_scanner:info", "value": "Component skipped: no supported rules found." } ], "purl": "pkg:generic/my-custom-ecosystem/my-package-alpha@1.0.0", "type": "application", "version": "1.0.0" } ããã¯ãšã©ãŒã§ã¯ãªããæ³å®ã©ããã®åäœã§ããSBOM ã¯æ£ããçæãããã³ã³ããŒãã³ãã¯åŒãç¶ã远跡ããã source_path ã«ãã£ãŠã©ã®ãã¡ã€ã«ããçæãããããæ£ç¢ºã«ææ¡ã§ããŸããAmazon Inspector ããã®ãšã³ã·ã¹ãã ã®ã¢ããã€ã¶ãªã«ãã¬ããžã远å ããã°ããã©ã°ã€ã³ãäžå倿Žããããšãªããåã SBOM ããè匱æ§ã®æ€åºçµæãçæãããããã«ãªããŸããAmazon Inspector ããã§ã«ãµããŒãããŠãããšã³ã·ã¹ãã ã«ã€ããŠã¯ããã©ã°ã€ã³ãçæããã³ã³ããŒãã³ãã¯çµã¿èŸŒã¿ã¹ãã£ããŒãçæããã³ã³ããŒãã³ããšåºå¥ãªãæ±ãããŸãã ãã¡ãŒã¹ãã¯ã©ã¹ã® IDE ãµããŒã AWS ã¯ããã©ã°ã€ã³ãæžããšãã®çç£æ§ãšå¹çãéèŠããŠããŸãããªãŒãã³ã³ããªãŒãã®ãããªã¢ãã³ãªäŸ¿å©æ©èœãªãã§ Lua ãæžãã®ã¯å¿«é©ãšã¯èšããŸããããã®ããã plugin new ã³ãã³ãã§ã¹ãã£ãã©ãŒã«ãã£ã³ã°ããããã¹ãŠã®ãã©ã°ã€ã³ãããžã§ã¯ãã«ã¯ã library/sbomgen.lua å®çŸ©ãã¡ã€ã«ãšãããã VS Code ã® Lua Language Server æ¡åŒµæ©èœã«èªåçã«æ¥ç¶ãã .vscode/settings.json ãä»å±ããŸãã ã³ãŒãè£å®ãš IDE ãµããŒããå©çšããã«ã¯ããŸã sumneko.lua æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããVS Code ã§ãã©ã°ã€ã³ãããžã§ã¯ããéããŸããããã«ããããã¹ãŠã® sbomgen.* 颿°ã§æ¬¡ã®æ©èœã䜿ããããã«ãªããŸãã åæ
å ±ä»ãã®ãã©ã¡ãŒã¿ãã³ã ãããŒæã®ããã¥ã¡ã³ã衚瀺 宿°ã®ãªãŒãã³ã³ããªãŒã ( sbomgen.component_types.* ã sbomgen.groups.* ã sbomgen.platform.* ) 颿°åŒã³åºãã®åãã§ã㯠push_package() ã«å¿
é ãã£ãŒã«ããæ¬ ããŠããå Žåã®ã€ã³ã©ã€ã³èŠå ãã®å®çŸ©ãã¡ã€ã«ã®ãããã§ãAI ã³ãŒãã£ã³ã°ã¢ã·ã¹ã¿ã³ãã«ãããã©ã°ã€ã³éçºãããŸãæ©èœããŸããåæ
å ±ãšããã¥ã¡ã³ããããŒã«ã§èªã¿åãã圢åŒã§åã蟌ãŸããŠãããããã¢ã·ã¹ã¿ã³ãã¯ãçŽ ã® Lua ã§èšè¿°ããå Žåã«æ¯ã¹ãŠã¯ããã«å°ãªã人æã®ç¢ºèªã§æ£ãããã©ã°ã€ã³ã³ãŒããçæã§ããŸãã å®å
šãªåºç€ ãã©ã°ã€ã³ã¯ inspector-sbomgen ãšåãããã»ã¹å
ã§å®éã®ã³ãŒããå®è¡ããããããã®ã³ãŒããå®å®ããã»ãã¥ãªãã£ã匷åãããç¶æ
ãä¿ãŠãããã«å®è¡ç°å¢ãèšèšããŸããããã¹ãŠã® Lua ãã©ã°ã€ã³ã¯éé¢ããããµã³ãããã¯ã¹å
ã§å®è¡ãããŸããå Lua ä»®æ³ãã·ã³ (VM) ã¯ãå®å
šãªæäœã®ã¿ãèš±å¯ãããããã«ãLua æšæºã©ã€ãã©ãªã®å¶éããããµãã»ããã«ã®ã¿ã¢ã¯ã»ã¹ã§ããŸãã ãã¡ã€ã«ã·ã¹ãã ãžã®çŽæ¥ã¢ã¯ã»ã¹ã®çŠæ¢ â Lua ã® io ã©ã€ãã©ãªã¯ããŒããããŸããããã¹ãŠã®ãã¡ã€ã«æäœã¯ sbomgen.* 颿°ãçµç±ã㊠sbomgen ã®å
éšåŠçã«ã«ãŒãã£ã³ã°ãããããããã£ã¹ã¯äžã®ãã£ã¬ã¯ããªãã³ã³ããã€ã¡ãŒãžãå§çž®ã¢ãŒã«ã€ããããŠã³ããããããªã¥ãŒã ã®ããããã¹ãã£ã³ããå Žåã§ãããã©ã°ã€ã³ã¯åãããã«åäœããŸã ãµãããã»ã¹ã®å®è¡ãç°å¢ã®å€æŽã®çŠæ¢ â Lua ã® os ã©ã€ãã©ãªã¯ãããã¯ãããŠããããããã©ã°ã€ã³ã¯ããã»ã¹ã®èµ·åãç°å¢å€æ°ã®å€æŽãã¢ãŒãã£ãã¡ã¯ãå€ã®ãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãã§ããŸãã VM ã®ã€ã³ããã¹ãã¯ã·ã§ã³ã®çŠæ¢ â Lua ã® debug ã©ã€ãã©ãªã¯ãããã¯ãããŠããŸã ç¡å¶éãªã³ãŒãããŒãã®çŠæ¢ â dofile ã loadfile ã loadstring ã¯åé€ãããŠããŸãã require() ã¯å©çšã§ããŸããããã©ã°ã€ã³èªèº«ã®ãã£ã¬ã¯ããªããªãŒã«å¶éãããŠããããããã©ã°ã€ã³ã¯èªèº«ã®ãã«ããŒã¢ãžã¥ãŒã«ãå
±æã§ããäžæ¹ãä»ã®ãã©ã°ã€ã³ãã·ã¹ãã ãã¹ããã³ãŒããããŒãããããšã¯ã§ããŸãã ãã©ã°ã€ã³ãæªåŠçã® Lua ãšã©ãŒãçºçãããå Žåãinspector-sbomgen ã¯èŠåããã°ã«èšé²ããæ¬¡ã®ãã¡ã€ã«ãŸãã¯ãã©ã°ã€ã³ã®åŠçãç¶è¡ããŸãã1 ã€ã®äžå
·åã®ãããã©ã°ã€ã³ãä»ã®ãã©ã°ã€ã³ã®å®è¡ã劚ããããšã¯ãããŸããããŸãããã©ã°ã€ã³ã inspector-sbomgen ã®çµã¿èŸŒã¿ããã±ãŒãžã³ã¬ã¯ã¿ãŒãäžæžãããããšããããŸããããã¹ãŠã®ãã©ã°ã€ã³ã¯äžæã®ååã宣èšããå¿
èŠããããã«ã¹ã¿ã ãã©ã°ã€ã³ãå
¬åŒã®çµã¿èŸŒã¿ãã©ã°ã€ã³ã§ãã§ã«äœ¿ãããŠããååã䜿çšããå Žåããã®ã«ã¹ã¿ã ãã©ã°ã€ã³ã¯èŠåä»ãã§ã¹ããããããŸããçµã¿èŸŒã¿ãã©ã°ã€ã³ãåžžã«åªå
ããããããã«ã¹ã¿ã ãã©ã°ã€ã³ãããŒã«èªèº«ã®æ€åºåäœãã²ããã«çœ®ãæãããé ãããããããšã¯ã§ããŸããã æ¬¡ã®ã¹ããã ä»ããç¬èªã®ãã©ã°ã€ã³ã®æ§ç¯ãå§ããã«ã¯ãæ¬¡ã®æé ã«åŸã£ãŠãã ããã Amazon Inspector ãŠãŒã¶ãŒã¬ã€ã ããææ°ã® inspector-sbomgen ãã€ã³ã¹ããŒã«ããŸã inspector-sbomgen plugin new --with-example ãå®è¡ããããã³ããã«åŸããŸã inspector-sbomgen plugin test --path ./my-sbomgen-plugins -v ãå®è¡ãããµã³ãã«ãã¹ãããã¹ããããšã確èªããŸã ãµã³ãã«ã®ããžãã¯ããç¬èªã®ãšã³ã·ã¹ãã åãã®æ€åºããžãã¯ã«çœ®ãæããŸã ãã¹ãŠã®é¢æ°ã宿°ãã³ãã³ãã«ã€ããŠã¯ã以äžã®å®å
šãªãªãã¡ã¬ã³ã¹ããã¥ã¡ã³ãã§è©³ãã説æããŠããŸãã Lua ãã©ã°ã€ã³éçºè
ã¬ã€ã : ãã©ã°ã€ã³ã®æŠå¿µããã£ã¬ã¯ããªæ§é ãã©ã€ããµã€ã¯ã« Lua ãã©ã°ã€ã³ãã¹ãã¬ã€ã : ãã¹ããã¬ãŒã ã¯ãŒã¯ã®ãªãã¡ã¬ã³ã¹ãšãã£ã¯ã¹ãã£ã®èŠçŽ Lua ãã©ã°ã€ã³ API ãªãã¡ã¬ã³ã¹ : sbomgen.* API ã®å®å
šãªã«ã¿ãã° ãŸãšã çµç¹ç¬èªã®ããã¯ãã¡ã€ã«åœ¢åŒãžã®å¯Ÿå¿ã®è¿œå ãæ°ãããªãŒãã³ãœãŒã¹ãšã³ã·ã¹ãã åãæ€åºã®ãããã¿ã€ãã³ã°ããããã¯èªäœã¹ãã£ããŒããçµç¹å
šäœã§å€§èŠæš¡ã«éçšã§ããä»çµã¿ãžã®çœ®ãæããªã©ãã©ã®ãããªçšéã§ãã£ãŠãããã®ãã©ã°ã€ã³ã·ã¹ãã ã¯ãã¢ã€ãã¢ããåäœãã SBOM ãŸã§ã®éã®ããã§ããéãçãããããã«èšèšãããŠããŸããçãããããã䜿ã£ãŠäœãäœãã®ãããšãŠã楜ãã¿ã«ããŠããŸãã ãã®èšäºã«é¢ããã質åãããå Žåã¯ã AWS ãµããŒãã«ãåãåãããã ãã ã Michael Long Michael 㯠AWS ã® Amazon Inspector æ
åœ Senior Security Researcher ã§ããAmazon Inspector SBOM Generator ãš Amazon Inspector for GitHub Actions ã®ç ç©¶éçºãçããŠããŸããAWS å
¥ç€Ÿåã¯ãMITRE ATT&CK ããŒã ã§ principal adversary emulation engineer ãåããŠããŸããããŸããU.S. Army (ç±³åœéžè») ã§çŽ 10 幎éãè»äºæ
å ±ããã³ãµã€ããŒäœæŠã«åŸäºããŸããã Charlie Bacon Charlie 㯠AWS ã® Amazon Inspector æ
åœ Head of Security Engineering and Research ã§ããAmazon Inspector ãä»ã® Amazon Security ã®è匱æ§ç®¡çããŒã«ãæ¯ããè匱æ§ã¹ãã£ã³ããã³ã€ã³ãã³ããªåéãµãŒãã¹ãæ
åœããããŒã ãçããŠããŸããAWS å
¥ç€Ÿåã¯ãéèæ¥çãšã»ãã¥ãªãã£æ¥çã§ 20 幎éã«ããããç ç©¶ãšè£œåéçºã®äž¡åéã§äžçŽè·ãåããŸããã Anthony Verleysen Anthony 㯠Amazon Inspector æ
åœã® Senior Technical Product Management ã§ããAmazon Inspector ã®åã¯ãAWS Systems Manager ã® Product Manager ãšã㊠Node Management æ©èœãæ
åœããŠããŸãããä»äºä»¥å€ã§ã¯ãããã¹ãšãµãã«ãŒã«ç±å¿ã«åãçµãã§ããŸãã æ¬ããã°ã¯ Security Solutions Architect ã® äžå³¶ ç« å ã翻蚳ããŸããã
æ¬ããã°ã¯ 2026 幎 6 æ 11 æ¥ã«å
¬éããã AWS Blog â AWS Nitro Isolation Engine: Formally verifying the hypervisor in the AWS Nitro System â ã翻蚳ãããã®ã§ãã Ali Saidi 㯠AWS ã® VP å
Œ Distinguished Engineer ã§ã äœçŸäžãã®ã客æ§ããæãæ©å¯æ§ã®é«ãã¯ãŒã¯ããŒãã®ä¿è·ã« AWS Nitro System ãå©çšããŠãããAWS ã¯ã客æ§ã®ããŒã¿ãä¿è·ããã€ãããŒã·ã§ã³ã«ãããŠæ¥çããªãŒãããŠããŸããã客æ§ã®ããŒã¿ã®å®å
šæ§ãšæ©å¯æ§ãå®ãããšã¯ AWS ã®æåªå
äºé
ã§ãããããŒã¿ã®åé¢ãšä¿è·ã®ããã®å°çšããŒããŠã§ã¢ãšãœãããŠã§ã¢ãžã®æè³ãç¶ç¶ããŠããŸãã 2017 幎ãAWS 㯠Nitro System ããªãªãŒã¹ããŸãããããã¯ããŒããªãã¬ãŒã¿ãŒã¢ã¯ã»ã¹ (ãªãã¬ãŒã¿ãŒãã客æ§ã®ããŒã¿ã«äžåã¢ã¯ã»ã¹ã§ããªãç¶æ
) ãåæã«èšèšããããåã®äž»èŠãªã¯ã©ãŠããã©ãããã©ãŒã ã§ããNitro System ã¯ã次äžä»£ã®ãã¹ãŠã® Amazon EC2 ã€ã³ã¹ã¿ã³ã¹ ã®åºç€ãšãªãå°çšã®ããŒããŠã§ã¢ãšãœãããŠã§ã¢ã§ãããä»®æ³åãã¹ãã¬ãŒãžããããã¯ãŒãã³ã°ã®æ©èœãå°çšããŒããŠã§ã¢ãšæå°éã®ãã€ããŒãã€ã¶ãŒã«ãªãããŒãããŸããNitro System ã§ã¯ãæãé«ãæš©éãæã€ AWS ãªãã¬ãŒã¿ãŒã§ãã£ãŠããèªèšŒãšç£æ»ãè¡ããã管ççš API ãéããŠã®ã¿ã·ã¹ãã ãšããåãã§ãããããã® API ããã客æ§ã®ã¯ãŒã¯ããŒãã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããããã®ã¢ãŒããã¯ãã£ã¯ã¯ã©ãŠãã»ãã¥ãªãã£ã®æ¥çæšæºã確ç«ããNCC Group ãªã©ã®ç¬¬äžè
æ©é¢ãç¬ç«ããç«å Žã§ãã®ã¢ãããŒãã®åŠ¥åœæ§ã確èªããŠããŸããã ãããŠä»ãAWS ã¯ããã«æ°Žæºãé«ããŸããAWS Nitro System ã®äž»ãªåœ¹å²ã® 1 ã€ã¯ãã€ã³ã¹ã¿ã³ã¹ãäºãã«åé¢ããAWS ãªãã¬ãŒã¿ãŒãããåé¢ããããšã§ãããã㯠10 幎以äžã«ããã Nitro System ã¢ãŒããã¯ãã£ã®åºç€ãšãªã£ãŠããŸãããAWS Nitro Isolation Engine ã¯ãAWS re:Invent 2025 ã§åããŠçºè¡šãããæ¬æ¥ (2026 幎 6 æ 11 æ¥) ãããã¹ãŠã® Graviton5 ããŒã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§äžè¬æäŸãéå§ããŸããããã㯠Nitro Hypervisor å
ã®å°çšã³ã³ããŒãã³ãã§ããããã®åé¢ã宿œãããããæ°åŠçãªå³å¯ãã§èšŒæãã圹å²ãæ
ããŸããNitro Isolation Engine ã¯åœ¢åŒçæ€èšŒãæ¡çšããŠããŸãã圢åŒçæ€èšŒãšã¯ãããŒããŠã§ã¢ããœãããŠã§ã¢ãç¹å®ã®ãã¹ãã±ãŒã¹ã ãã§ãªããããããç¶æ³ã§æå³ãããšããã«åäœããããšãæ°åŠçã«èšŒæããææ³ã§ãããã®åŸ¹åºçãªæ€èšŒææ³ã«ãããNitro ã¯åœ¢åŒçã«æ€èšŒãããåã®ã¯ã©ãŠããã€ããŒãã€ã¶ãŒãšãªããæ°åŠçã«èšŒæãããã¯ã©ãŠãã»ãã¥ãªãã£ã®æ°ããæšæºã確ç«ããŸããã AWS Nitro Isolation Engine Nitro System ã«ãããŠãAWS Nitro Hypervisor ã¯ããã¹ãŠã®ä»®æ³ãã·ã³ã«ã€ããŠãæš©éã®ãªããšã³ãã£ãã£ãã客æ§ã®ããŒã¿ãèªã¿åã£ãã倿Žãããã§ããªãããã«èšèšãããŠããŸããNitro Isolation Engine 㯠Nitro Hypervisor ã®å°çšã³ã³ããŒãã³ãã§ããããããã®ä»®æ³ãã·ã³éã®åé¢ã宿œããŸããä»®æ³ãã·ã³ã®ã¡ã¢ãªãCPU ã¬ãžã¹ã¿ã®ç¶æ
ãããã³ I/O ããã€ã¹ãžã®ãã¹ãŠã®ã¢ã¯ã»ã¹ããNitro Hypervisor ã®ä»ã®éšåã«å
¬éãããæå°éã® API ã»ãããéããŠä»²ä»ããŸããNitro Isolation Engine ã¯ãã客æ§ã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ã仲ä»ããå¯äžã®ã·ã¹ãã ã³ã³ããŒãã³ãã§ããNitro Hypervisor ã®ä»ã®ã³ã³ããŒãã³ãã¯ããã®å¶éãããã€ã³ã¿ãŒãã§ã€ã¹ãéããŠåäœããå¿
èŠããããã客æ§ã®ã¯ãŒã¯ããŒãã«çŽæ¥ã¢ã¯ã»ã¹ããããšã¯ã§ããŸãããNitro Isolation Engine ã®ã³ãŒãããŒã¹ã¯æå°éã«æããããŠããããã人ã«ããç£æ»ã容æã«ãªãããã°ãæ··å
¥ãåŸãç¯å²ãæžãããã®èšèšãšå®è£
ã«åœ¢åŒçæ€èšŒãé©çšããããšãçŸå®çã«ãªã£ãŠããŸãã 圢åŒçæ€èšŒ 圢åŒçæ€èšŒã¯ãæ°åŠç蚌æãçšããŠãã·ã¹ãã ã®åœ¢åŒçã¢ãã«ã®ç¹æ§ããããåŸããã¹ãŠã®ã·ã¹ãã ç¶æ
ãšãã¹ãŠã®å
¥åã«ãããŠæç«ããããšã瀺ããŸããããã¯ãããåŸãç¶æ
ãšå
¥åã®ãã¡ (å Žåã«ãã£ãŠã¯å€§èŠæš¡ãª) äžéšã«å¯ŸããŠã·ã¹ãã ã®åäœã確èªãããã¹ããšã¯å¯Ÿç
§çã§ãã圢åŒçæ€èšŒã¯ãåŸæ¥ã®ãã¹ããããæ£ç¢ºæ§ã«ã€ããŠã¯ããã«åŒ·ãæ ¹æ ãæäŸããŸããNitro Isolation Engine ã®å Žåãåé¢ç¹æ§ã¯ãããåŸããã¹ãŠã®ã·ã¹ãã ã®åäœã«ããã£ãŠä¿èšŒãããŸãããã¹ããšæ€èšŒã¯çžäºè£å®çãªé¢ä¿ã«ãããŸããæ€èšŒã¯ãã¹ããè£åŒ·ãããã¹ãã¯ãŸã æ€èšŒãããŠããªãã·ã¹ãã ã®é åãã«ããŒããŠãã·ã¹ãã ãæå³ãããšããã«åäœããŠãããšããçµéšçãªè£ä»ããäžããŸãã ã客æ§ã«ãšã£ãŠãåé¢ã宿œããã³ãŒãã圢åŒçã«æ€èšŒãããŠããããšã¯ãå
æ¬çãªãã¹ããè¶
ããä¿èšŒãšãªããŸãããã¹ãã¯åŒãç¶ãäžå¯æ¬ ã§ãããAWS ã¯ãã¹ãã«ãããŠãé«ãåºæºãç¶æããŠããŸããããã¹ãã§ç¢ºèªã§ããã®ã¯ç¹å®ã®ã·ããªãªã«éãããŸãã圢åŒçæ€èšŒã¯ãããè£å®ãããã®ã§ããããã¹ãã§ã«ããŒãããã·ããªãªã ãã§ãªããããåŸããã¹ãŠã®ã·ããªãªã«ããã£ãŠåé¢ç¹æ§ãæ°åŠçã«ä¿èšŒãããããšãæå³ããŸãã 圢åŒçã«æ€èšŒãããç¹æ§ Nitro Isolation Engine ã®åœ¢åŒçæ€èšŒã«ããã4 ã€ã®äž»èŠãªç¹æ§ã確ç«ãããŸãã 1. æ©å¯æ§ãšå®å
šæ§ â Nitro Isolation Engine ã¯ãã²ã¹ãä»®æ³ãã·ã³ (VM) ã®æ©å¯æ§ãšå®å
šæ§ãç¶æããŸããæ©å¯æ§ãšã¯ãã²ã¹ã VM ã®ãã©ã€ããŒãããŒã¿ãæš©éã®ãªããšã³ãã£ãã£ã«ãã£ãŠèªã¿åãããªãããšãæå³ããå®å
šæ§ãšã¯ãã²ã¹ã VM ã®ãã©ã€ããŒãããŒã¿ãæš©éã®ãªããšã³ãã£ãã£ã«ãã£ãŠå€æŽãããªãããšãæå³ããŸãã 2. æ©èœçæ£ç¢ºæ§ â æ€èšŒããããã¹ãŠã®ãã€ããŒã³ãŒã«ã¯ã仿§ã§å®çŸ©ãããæåŸ
ãããåäœãšäžèŽããŸãã仿§ã«ã¯åãã€ããŒã³ãŒã«ã®äºåæ¡ä»¶ãšäºåŸæ¡ä»¶ãèšè¿°ãããŠããã蚌æã«ãã£ãŠãå®è£
ããããããæ±ºããŠéžè±ããªãããšãç«èšŒãããŸãã 3. ã©ã³ã¿ã€ã ãšã©ãŒãçºçããªãããš â ã³ãŒããã©ã³ã¿ã€ã ãšã©ãŒã«ééããããšã¯ãªããå®è£
ã¯ä»æ§ã©ããã«åäœããŸãããããã®ç¹æ§ã®åœ¢åŒçæ€èšŒãçµã¿åãããããšã§ãæ€èšŒã®å¯Ÿè±¡ãšãªãããããäžé£ã®ã€ãã³ãã«å¯Ÿã㊠Nitro System ãåé¢ãç¶æããããšããæ°åŠçã«å³å¯ã«ä¿èšŒãããŸããçŸæç¹ã§ã¯ããã®æ€èšŒã¯ãVM ã®èµ·åãå®è¡ãããã³çµäºãæ
ã VM ã®ã³ã¢ã©ã€ããµã€ã¯ã«ã®ãã€ããŒã³ãŒã«ã察象ãšããŠããŸãã 4. ã¡ã¢ãªå®å
šæ§ â ãããã¡ãªãŒããŒãããŒãNULL ãã€ã³ã¿éåç
§ãç¯å²å€ã¢ã¯ã»ã¹ãªã©ã®ã¡ã¢ãªå®å
šæ§éåãååšããªãããšãç«èšŒããŸãããã¹ãŠã®æ€èšŒæžã¿ãœãããŠã§ã¢ãšåæ§ã«ãNitro Isolation Engine ã®èšŒæã¯ãRust ã³ã³ãã€ã©ãããŒããŠã§ã¢ã®æ£ç¢ºæ§ãªã©ã®åæã«åºã¥ããŠããŸãããããã®åæãããã³ãšã³ãžãã¢ãªã³ã°ãšæ€èšŒã«å¯Ÿãã AWS ã®ã¢ãããŒãã«ã€ããŠã¯ãNitro Isolation Engine ã®ãã¯ã€ãããŒããŒã§è©³ãã説æãããŠããŸãã Rust ã«ããå®è£
Nitro Isolation Engine 㯠Rust ã§å®è£
ãããŠããŸããRust ã¯ãæ©å¯æ§ã®é«ããœãããŠã§ã¢ã«ãããã»ãã¥ãªãã£è匱æ§ã®æ ¹æ¬åå ãšãªã£ãŠãããããããããã°ã©ãã³ã°äžã®èœãšã穎ãé²ãããã«èšèšãããã·ã¹ãã ããã°ã©ãã³ã°èšèªã§ããNitro Isolation Engine ã« Rust ãæ¡çšããããšã§ãè€æ°ã®çš®é¡ã®ãã°ãèšèšäžãŸãšããŠæé€ããŠããŸããRust ãé©ããŠããçç±ã¯ãã®åã·ã¹ãã ã«ãããŸããåã·ã¹ãã ã峿 Œãªæææš©èŠåãé©çšããããã圢åŒçæ€èšŒã®äžéšã容æã«ãªããã³ã³ãã€ã«æã«ç¬¬äžæ®µéã®ä¿èšŒãåŸãããŸãã ãŸãšã Nitro Isolation Engine ã¯ãã客æ§ã®ããŒã¿ã®æ©å¯æ§ãå®ããšãã AWS ã®ç¶ç¶çãªã³ãããã¡ã³ããäœçŸãããã®ã§ãããããŠãããã¯ãŸã åºçºç¹ã«ãããŸãããAWS ã¯ãã»ãã¥ãªãã£ã«åœ±é¿ãäžãã Nitro Isolation Engine ã®ãã¹ãŠã®äž»èŠã³ã³ããŒãã³ãã«åœ¢åŒçæ€èšŒãæ¡åŒµããæ°æ©èœãå°å
¥ãããŠããããã®èšŒæãç¶æãç¶ããŸããããã«ãNitro Isolation Engine ã®ãœãŒã¹ã³ãŒããšåœ¢åŒç蚌æã第äžè
ã«æäŸããç¬ç«ããæ€æ»ããã³ã¬ãã¥ãŒãåããããããã«ããäºå®ã§ãããã®ã¬ãã«ã®éææ§ã¯ãã¯ã©ãŠããããã€ããŒãéãããå§¿å¢ãã³ãŒãå質ã圢åŒçæ€èšŒãã©ã®ããã«ç€ºãããã«ã€ããŠãæ°ããæšæºã確ç«ãããã®ãšèããŠããŸãã AWS Nitro System ãšã³ã³ãã£ãã³ã·ã£ã«ã³ã³ãã¥ãŒãã£ã³ã°ã®è©³çްã«ã€ããŠã¯ã以äžã®ãªãœãŒã¹ãã芧ãã ããã AWS Nitro Isolation Engine Whitepaper ã³ã³ãã£ãã³ã·ã£ã«ã³ã³ãã¥ãŒãã£ã³ã°ïŒ AWS ã®èŠç¹ (2021) AWS Nitro System ã®ã³ã³ãã£ãã³ã·ã£ã«ã³ã³ãã¥ãŒãã£ã³ã°ã«å¯Ÿãã第äžè
è©äŸ¡ã®ç²åŸ (2023) AWS Nitro Whitepaper AWS re:Invent 2025 presentation â Introducing Nitro Isolation Engine: Transparency through Mathematics èè
ã«ã€ã㊠Ali Saidi Ali 㯠Amazon Web Services (AWS) ã®ãã€ã¹ãã¬ãžãã³ãå
Œ Distinguished Engineer ã§ãããã·ã¬ã³å€§åŠã§ã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ããã³å·¥åŠã®å士å·ãååŸããŠããŸãã2017 幎㫠AWS ã«å
¥ç€ŸããŠä»¥æ¥ãAWS Nitro SystemãAWS Gravitonãããã³å¹
åºã EC2 ã€ã³ã¹ã¿ã³ã¹ãã¡ããªãŒã®ããŒããã©ãªãªã®èšèšãšéçºã«æ³šåããŠããŸãã æ¬ããã°ã¯ Security Solutions Architect ã® äžå³¶ ç« å ã翻蚳ããŸããã






















