NTTドコモビゞネスのブログ - TECH PLAY

TECH PLAY

NTTドコモビゞネス

NTTドコモビゞネス の技術ブログ

å…š632ä»¶

はじめに こんにちは、むノベヌションセンタヌの竹䞭です。 本蚘事では、SR-TE を䞀元的に管理するための゜フトりェア実装である Pola PCE の抂芁や利甚方法に぀いお玹介したす。 Pola PCE は私ず 䞉島 で実装し、珟圚 NTT Com より OSS 公開䞭です。 [Multi-AS Segment Routing 怜蚌連茉 #11] PCE 実装の怜蚌 蚘事でも䞀郚機胜を玹介したしたが、本蚘事では Example を甚いた詊甚環境の準備、ベンダヌルヌタヌを甚いおの環境準備、たた各機胜に぀いお玹介したす。 たた、Go で開発したツヌルを OSS ずしお公開する䞭で埗た知芋を NTT Communications Advent Calendar 2022 8日目 で玹介しおいるので、こちらも是非ご芧ください。 目次 Pola PCE 抂芁 Pola PCE ずはどのような特城を持぀ PCE であるか、たたその掻甚方法に぀いお蚘茉 Docker 環境を甚いた Explicit Path 機胜の怜蚌 手元の Docker 環境のみで Pola PCE を怜蚌する手順を玹介 Multi-vendor で構成されるネットワヌクを甚いた Dynamic Path 機胜の怜蚌 Multi-vendor 機噚を甚いお構築された SR-MPLS 環境においお Pola PCE を利甚する手順を玹介 SR-TE や PCE に興味を持ち、簡朔な構成で Pola PCE の機胜を詊しおみたい方は、たずは Docker 環境を甚いた怜蚌をお勧めしたす。 なお PCE ずは䜕か、に぀いおは䞋蚘蚘事にお玹介しおいるためこちらも䜵せお参考にしおください。 engineers.ntt.com 開発ぞのモチベヌション Pola PCE の玹介の前段ずしお、開発に至ったモチベヌションに぀いお話したす。 開発のモチベヌションは倧きく分けお 3 ぀ありたす。 1 ぀目は、最新 RFC や Internet-Draft で議論䞭の PCE に関する機胜を先行しお実装し、怜蚌したいずいう芁求です。 自䜜の PCE を準備するこずで、RFC や Internet-Draft の曎新に合わせおリアルタむムに実装状況を曎新し、自䜜 PCE - 各瀟ベンダヌ補 PCC の盞互接続怜蚌を行いたいです。 2 ぀目は、Multi-vendor 察応な PCE を利甚したいずいう芁求です。 Multi-AS Segment Routing 怜蚌連茉 で公開しおいたすが、私たちは Multi-vendor 機噚環境で Segment Routing の怜蚌を行なっおいたす。そのため、PCE に぀いおも Multi-vendor 察応な補品を利甚したいです。 PCE の技術仕様に関しおは RFC や Internet-Draft で未提案な郚分もあり、PCC 機胜にはベンダヌごずに独自実装の郚分も存圚したす。そのため、珟状 Multi-vendor 環境においお Color や Preference の情報などを含む PCEP の盞互接続はただできたせん。自䜜 PCE によっおそのような問題の解決したいです。 3 ぀目は、倖郚連携甚の API を提䟛する軜量なツヌルが欲しいずいう芁求です。 必芁に応じお機胜の分割や拡匵などが行えるようにマむクロサヌビスアヌキテクチャを目指し、機胜ごずに分かれたコンポヌネントを API で連携する仕組みを利甚したいです。䟋えば SR Policy 投入機胜は独立しお動䜜させたり、トポロゞヌを描写するツヌルず連携させお利甚したいです。 以䞊のモチベヌションから Pola PCE を実装したした。 Pola PCE 抂芁 できるこず Pola PCE では珟圚v1.1.2 SR-MPLS で構成されるネットワヌクにおいお 以䞋の機胜が利甚可胜です。 PCC ぞ SR Policy の远加・曎新 PCC で利甚䞭の SR Policy の確認 GoBGP ずの連携による TED の取埗 TED を保持するこずで経路蚈算が可胜になり、Dynamic Path が利甚可胜 Multi-vendor 環境での利甚 IOS XR、Junos、FRRouting を PCC ずしお利甚可胜 マむクロサヌビスアヌキテクチャに基づいた実装 Pola PCE はマむクロサヌビスアヌキテクチャに基づいた実装ずなっおおり、それぞれのプロセス間の連携を gRPC が担っおいたす。 そのため、各利甚者の甚途に応じお必芁な機胜のみを組み合わせお利甚できたす。 最小構成であれば Pola PCE 単䜓で SR Policy の管理や Explicit Path の远加や曎新ができる簡玠な SR Policy 管理ツヌルずしお利甚できたす。 たた Pola PCE のデヌモンが gRPC むンタヌフェヌスを提䟛しおいるため、デヌモンを䞭栞ずしお、䟋えば以䞋のような高機胜なネットワヌクコントロヌラを構築するこずも可胜です。 構成 Pola PCE の構成は以䞋の通りです。 ツヌル単䜓は polad / pola CLI tool からなりたす。 polad は PCE デヌモンであり、PCEP Session の管理や必芁に応じたトポロゞヌ情報の取埗・管理、たた、保持しおいる情報を出力するための gRPC むンタヌフェヌスを提䟛したす。 pola CLI tool は polad の gRPC クラむアントずなっおおり、入力したコマンドに応じお適切な gRPC リク゚ストを送信し polad の保持する情報を取埗・曎新したす。 トポロゞヌ情報の取埗の必芁があれば GoBGP ず連携させたり、gRPC むンタヌフェヌスを提䟛しおいるためナヌザヌが polad の gRPC クラむアント機胜をも぀ツヌルを甚意するこずで Pola PCE を制埡するこずも可胜です。 実装予定の新機胜 私たちはチヌムの取り組みずしお SR-MPLS だけでなく SRv6 環境での怜蚌も行っおおりたす。 SRv6 環境での利甚も想定しおいるため、今埌の盎近のアップデヌト予定ずしお PCEP の SRv6 察応 を開発䞭です。プロトコル拡匵自䜓がただ Internet-Draft で議論䞭のため、各ベンダヌの SRv6 PCC 機胜の実装状況や独自実装の内容を把握し぀぀、Multi-vendor で動䜜する SRv6 PCE ぞず拡匵する予定です。 Docker 環境を甚いた Explicit Path 機胜の怜蚌 公開䞭の example を甚いお動䜜怜蚌をしたす。怜蚌環境の構築には OSS の Docker ベヌスなネットワヌク゚ミュレヌタである tinet を利甚しおいるため、Docker が利甚できる x86_64 CPU 機噚が1台あれば手元で詊せたす。 怜蚌環境 公開䞭の spec.yaml を甚いお、tinet により以䞋のトポロゞヌを䜜成したす。 SR-MPLS ドメむンは FRRouting version:latest (2022幎12月5日珟圚では v8.4.1) を甚いお構築されたす。 手順 Docker、tinet のむンストヌルに぀いおは手順を省略したす。 pola リポゞトリの取埗 GitHub から pola リポゞトリを clone したす。 user@server:~$ git clone https://github.com/nttcom/pola トポロゞヌの構築・機噚ぞの config 投入 ディレクトリを sr-mpls_l3vpn ぞ倉曎したのちに tinet コマンドを 1 ぀実行するず党環境構築が完了したす。 user@server:~$ cd pola/examples/sr-mpls_l3vpn/ user@server:~/pola/examples/sr-mpls_l3vpn$ tinet upconf | sudo sh -x docker ps でトポロゞヌ図に蚘茉しおある、各機噚名称に埓ったコンテナが䜜成・起動しおいるこずが確認できたす。 user@server:~/pola/examples/sr-mpls_l3vpn$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fe439ecd0a78 host_ubuntu:latest "bash" 25 minutes ago Up 25 minutes host02 0b17cd9386aa host_ubuntu:latest "bash" 25 minutes ago Up 25 minutes host01 f92da0d39aea frr:latest "/sbin/tini -- /usr/
" 25 minutes ago Up 25 minutes p02 d5093e6fa5c1 frr:latest "/sbin/tini -- /usr/
" 25 minutes ago Up 25 minutes p01 8341a6836618 frr:latest "/sbin/tini -- /usr/
" 25 minutes ago Up 25 minutes pe02 a24a70528e1a frr:latest "/sbin/tini -- /usr/
" 26 minutes ago Up 25 minutes pe01 25c3666b6f17 pola:latest "bash" 26 minutes ago Up 26 minutes pola なお、Pola PCE や FRRouting の初期蚭定は example の spec.yaml に蚘茉しおいるため、気になる方はご確認ください。 PCEP Session の確認 pola session コマンドによっお PCEP Session を確認したす。 docker exec で pola コンテナに入り、コマンドを実行したす。 user@server:~/pola/examples/sr-mpls_l3vpn$ docker exec -it pola /bin/bash root@pola:/# pola session sessionAddr(0): 10.0.255.1 SR Policy の発行 SR Policy のパラメヌタ指定する yaml ファむルを䜜成し、 pola sr-policy add コマンドで SR Policy を PCC に発行したす。 本怜蚌では、pe01 から pe02 ぞの VPN 経路color 1に察しお、pe01 -> p01 -> p02 -> pe02 を通るようにするための SR Policy を発行したす。 䜜成する yaml ファむル # policy1.yaml srPolicy : name : "policy1" pcepSessionAddr : "10.0.255.1" srcAddr : "10.255.0.1" dstAddr : "10.255.0.3" color : 1 segmentList : - sid : 16002 nai : "10.255.0.2" - sid : 16004 nai : "10.255.0.4" - sid : 16003 nai : "10.255.0.3" コマンド実行 root@pola:/# pola sr-policy add -f policy1.yaml --no-link-state success! 䜜成した SR Policy は pola sr-policy list コマンドで確認ができたす。 ※ 珟圚 FRRouting で利甚されおいる SR Policy の Color、Preference 項目は pola sr-policy list から確認できない状態です。FRRouting の PCEP RFC 察応が進むず確認できるようになりたす。 root@pola:/# pola sr-policy list LSP(0): PcepSessionAddr: 10.0.255.1 PolicyName: policy1 SrcAddr: 10.0.255.1 DstAddr: 10.255.0.3 Color: 0 Preference: 0 DstAddr: 10.255.0.3 SegmentList: 16002 -> 16004 -> 16003 経路ず SR Policy の玐付け FRRouting の route-map を甚いお、SR Policy ず BGP で広告される経路ずを玐付けたす。 pe01 コンテナに入り、route-map を適甚する config を投入したす。 user@server:~/pola/examples/sr-mpls_l3vpn$ docker exec -it pe01 /bin/bash bash-5.1# vtysh -c 'conf t' -c 'router bgp 65000' -c 'address-family ipv4 vpn' -c 'neighbor 10.255.0.3 route-map color1 in' 疎通確認 疎通確認を行いたす。 たずは host01 から host02 ぞ ping が通るこずを確認したす。 user@server:~$ docker exec -it host01 ping -c 5 192.168.1.2 PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data. 64 bytes from 192.168.1.2: icmp_seq=1 ttl=62 time=0.198 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=62 time=0.126 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=62 time=0.122 ms 64 bytes from 192.168.1.2: icmp_seq=4 ttl=62 time=0.110 ms 64 bytes from 192.168.1.2: icmp_seq=5 ttl=62 time=0.112 ms --- 192.168.1.2 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4098ms rtt min/avg/max/mdev = 0.110/0.133/0.198/0.032 ms たた、host01 から host02 ぞ ping を打っおいる状態で pe01 の net0 interface を通るパケットをキャプチャしたす。 net0 interface から ping のパケットが出おいるこずず、SR Policy で指定した MPLS ラベルが積たれおいるこずを確認できたす。 host01 user@server:~$ docker exec -it host01 ping 192.168.1.2 pe01 user@server:~/pola/examples/sr-mpls_l3vpn$ docker exec -it pe01 tcpdump -i net0 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on net0, link-type EN10MB (Ethernet), snapshot length 262144 bytes 11:24:48.358826 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 12, length 64 11:24:49.382800 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 13, length 64 11:24:49.957688 IP 10.0.0.2 > 224.0.0.5: OSPFv2, Hello, length 48 11:24:50.406778 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 14, length 64 11:24:51.430769 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 15, length 64 11:24:52.454779 MPLS (label 16004, exp 0, ttl 63) (label 16003, exp 0, ttl 63) (label 80, exp 0, [S], ttl 63) IP 192.168.0.2 > 192.168.1.2: ICMP echo request, id 1067, seq 16, length 64 Multi-vendor で構成されるネットワヌクを甚いた Dynamic Path 機胜の怜蚌 GitHub から Pola PCE のバむナリファむルをダりンロヌドし、SR-MPLS を甚いた Multi-vendor L3VPN 環境で怜蚌したす。 怜蚌環境 以䞋のトポロゞヌを甚いお怜蚌したす。 各ルヌタヌの補品ずバヌゞョンは以䞋の通りです。 rt01: ASR9901IOS XR 7.6.1 rt02: MX204Junos 22.1R1.10 rt03: ASR9901IOS XR 7.5.1 rt04: MX204Junos 21.4R1.12 rt05: Cisco 8201IOS XR 7.5.1 rt06: PTX10001-36MRJunos 21.2R1.15-EVO rt07: ASR9902IOS XR 7.6.1 rt08: MX204Junos 21.4R1.12 手順 本怜蚌では Dynamic Path 機胜を怜蚌したす。 Dynamic Path 怜蚌にあたっお、Pola PCE が経路蚈算に利甚するトポロゞヌ情報を取埗する手段ずしお GoBGP を利甚したす。SR-MPLS ドメむンの任意のルヌタヌず GoBGP で BGP-LS Session を確立し、か぀ Pola PCE ず連携するこずで Pola PCE が Traffic Engineering Database (TED) ずしおトポロゞヌ情報を保持したす。 そのため、本章では GoBGP を Pola PCE で扱うための方法に぀いおも説明したす。 Pola PCE / GoBGP のバむナリダりンロヌド Pola PCE ず GoBGP のバむナリファむルをダりンロヌドしたす。 Pola PCE ダりンロヌド user@pce:~$ wget https://github.com/nttcom/pola/releases/download/v1.1.2/pola_1.1.2_linux_amd64.tar.gz user@pce:~$ tar -zxvf pola_1.1.2_linux_amd64.tar.gz user@pce:~$ sudo install -t <path が通っおいるディレクトリ> polad user@pce:~$ sudo install -t <path が通っおいるディレクトリ> pola GoBGP ダりンロヌド GoBGP は daemon (gobgpd) ず CLI ツヌル (gobgp) の 2 ぀の実行ファむルから構成されたすが、今回利甚する実行ファむルは gobgpd のみになりたす。 user@pce:~$ wget https://github.com/osrg/gobgp/releases/download/v3.9.0/gobgp_3.9.0_linux_amd64.tar.gz user@pce:~$ tar -zxvf gobgp_3.9.0_linux_amd64.tar.gz user@pce:~$ sudo install -t <path が通っおいるディレクトリ> gobgpd gobgpd の起動 gobgpd は toml (たたは yaml、json) 圢匏のファむルに config を蚘茉し、実行したす。 トポロゞヌ情報を取埗するため、gobgpd を起動しお RR である rt03 / rt04 ず BGP-LS の Session を確立したす。 䜜成する toml ファむル # gobgpd_cfg.toml [global.config] as = 65001 router-id = "10.99.0.254" [[neighbors]] [neighbors.config] neighbor-address = "10.255.1.3" peer-as = 65001 [[neighbors.afi-safis]] [neighbors.afi-safis.config] afi-safi-name = "ls" [[neighbors]] [neighbors.config] neighbor-address = "10.255.1.4" peer-as = 65001 [[neighbors.afi-safis]] [neighbors.afi-safis.config] afi-safi-name = "ls" gobgpd 起動 user@pce:~$ sudo gobgpd -f gobgpd_cfg.toml -l debug {"level":"info","msg":"gobgpd started","time":"2022-12-08T10:53:05Z"} {"Topic":"Config","level":"info","msg":"Finished reading the config file","time":"2022-12-08T10:53:05Z"} {"Key":"10.255.1.3","Topic":"config","level":"info","msg":"Add Peer","time":"2022-12-08T10:53:05Z"} {"Key":"10.255.1.3","Topic":"Peer","level":"info","msg":"Add a peer configuration","time":"2022-12-08T10:53:05Z"} {"Key":"10.255.1.4","Topic":"config","level":"info","msg":"Add Peer","time":"2022-12-08T10:53:05Z"} {"Key":"10.255.1.4","Topic":"Peer","level":"info","msg":"Add a peer configuration","time":"2022-12-08T10:53:05Z"} {"Duration":0,"Key":"10.255.1.3","Topic":"Peer","level":"debug","msg":"IdleHoldTimer expired","time":"2022-12-08T10:53:05Z"} {"Duration":0,"Key":"10.255.1.4","Topic":"Peer","level":"debug","msg":"IdleHoldTimer expired","time":"2022-12-08T10:53:05Z"} {"Key":"10.255.1.3","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ACTIVE","old":"BGP_FSM_IDLE","reason":{"Type":7,"BGPNotification":null,"Data":null},"time":"2022-12-08T10:53:05Z"} {"Key":"10.255.1.4","Topic":"Peer","level":"debug","msg":"state changed","new":"BGP_FSM_ACTIVE","old":"BGP_FSM_IDLE","reason":{"Type":7,"BGPNotification":null,"Data":null},"time":"2022-12-08T10:53:05Z"} 珟時点では察向の rt03 / rt04 に BGP-LS Session を確立するための config が投入されおいないため、BGP Session はただ確立したせん。 BGP-LS Session の確立 rt03 / rt04 に BGP-LS Session を確立するための config を投入したす。 IOS XR / Junos 共に、BGP-LS Session を確立するための config を蚘茉したす。 IOS XR router isis 1 distribute link-state instance-id 32 ! ! router bgp 65001 address-family link-state link-state ! neighbor-group pola remote-as 65001 timers 10 30 update-source Loopback0 address-family link-state link-state ! ! neighbor 10.99.0.254 use neighbor-group pola BGP-LS Session の UP を確認したす。 RP/0/RSP0/CPU0:rt03#show bgp link-state link-state summary Thu Dec 8 20:25:17.394 JST BGP router identifier 10.255.1.3, local AS number 65001 BGP generic scan interval 60 secs Non-stop routing is enabled BGP table state: Active Table ID: 0x0 RD version: 221 BGP main routing table version 221 BGP NSR Initial initsync version 65 (Reached) BGP NSR/ISSU Sync-Group versions 0/0 BGP scan interval 60 secs BGP is operating in STANDALONE mode. Process RcvTblVer bRIB/RIB LabelVer ImportVer SendTblVer StandbyVer Speaker 221 221 221 221 221 0 Neighbor Spk AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down St/PfxRcd 10.99.0.254 0 65001 7 51 221 0 0 00:00:59 0 Junos set policy-options policy-statement TE term 1 from family traffic-engineering set policy-options policy-statement TE term 1 then accept set protocols bgp group pola type internal set protocols bgp group pola local-address 10.255.1.4 set protocols bgp group pola family traffic-engineering unicast set protocols bgp group pola export TE set protocols bgp group pola neighbor 10.99.0.254 set protocols mpls traffic-engineering database import policy TE BGP-LS Session の UP を確認したす。 user@rt04> show bgp group pola Group Type: Internal AS: 65001 Local AS: 65001 Name: pola Index: 2 Flags: <Export Eval> Export: [ TE ] Options: <GracefulShutdownRcv> Holdtime: 90 Preference: 0 Graceful Shutdown Receiver local-preference: 0 Total peers: 1 Established: 1 10.99.0.254+42121 lsdist.0: 0/0/0/0 polad の起動 polad は yaml 圢匏のファむルに config を蚘茉し、実行したす。 トポロゞヌ情報の利甚を有効化しお GoBGP からトポロゞヌ情報を取埗するための config を蚘茉したす。 PCEP に関しおは、PCC ず疎通性のあるアドレス、PCEP のデフォルトポヌトである 4189 を蚭定しおいたす。 たた、GoBGP は gRPC のデフォルトポヌトである 50051 で gRPC リク゚ストを埅ち受けおいたす。そのため以䞋の config では GoBGP の gRPC クラむアントの接続先ポヌトを 50051 ずし、Pola PCE が提䟛する gRPC サヌバは 50052 で埅ち受けるように蚭定しおいたす。 䜜成する yaml ファむル # polad_cfg.yaml global : pcep : address : "10.99.0.254" port : 4189 grpc-server : address : "127.0.0.1" port : 50052 log : path : "./pola_log/" name : "polad.log" ted : enable : true source : "gobgp" gobgp : grpc-client : address : "127.0.0.1" port : 50051 polad 起動 user@pce:~$ mkdir pola_log user@pce:~$ polad -f polad_cfg.yaml 2022-12-11T08:06:23.233Z info gRPC listen {"listenInfo": "127.0.0.1:50052", "server": "grpc"} 2022-12-11T08:06:23.233Z info PCEP listen {"listenInfo": "10.99.0.254:4189"} 2022-12-11T08:06:23.249Z info Request TED update {"source": "GoBGP", "session": "127.0.0.1:50051"} 2022-12-11T08:06:23.249Z info Update TED Update TED のログが出力されおいれば、gobgpd ずの接続が完了し TED の曎新が完了しおいたす。 PCEP Session の確立 PCC ずする rt01 / rt02 ぞ PCEP Session を確立するための config を投入したす。 IOS XR / Junos 共に、PCEP Session を確立するための config を蚘茉したす。 IOS XR segment-routing traffic-eng pcc source-address ipv4 10.255.1.1 pce address ipv4 10.99.0.254 ! ! ! ! PCEP Session が確立しおいるこずを rt01 で確認したす。 RP/0/RSP0/CPU0:rt01#show segment-routing traffic-eng pcc ipv4 peer Sun Dec 11 17:41:06.157 JST PCC's peer database: -------------------- Peer address: 10.99.0.254, Precedence: 255, (best PCE) State up Capabilities: Stateful, Update, Segment-Routing, Instantiation Junos set protocols mpls lsp-external-controller pccd set protocols source-packet-routing lsp-external-controller pccd set protocols pcep pce pola local-address 10.255.1.2 set protocols pcep pce pola destination-ipv4-address 10.99.0.254 set protocols pcep pce pola pce-type active set protocols pcep pce pola pce-type stateful set protocols pcep pce pola lsp-provisioning set protocols pcep pce pola spring-capability PCEP Session が 確立しおいるこずを rt02 で確認したす。 user@rt02> show path-computation-client status Session Type Provisioning Status Uptime pola Stateful Active On Up 102 LSP Summary Total number of LSPs : 0 Static LSPs : 0 Externally controlled LSPs : 0 Externally provisioned LSPs : 0/16000 (current/limit) Orphaned LSPs : 0 pola (main) Delegated : 0 Externally provisioned : 0 Pola PCE 各皮情報の確認 PCC ず PCEP Sessoin が確立できたため、Pola PCE の持぀各皮情報を確認したす。 Pola PCE の操䜜は pola CLI コマンドを甚いお行いたす。 PCEP Session の確認 PCEP Session を確認したす。 user@pce:~$ pola session -p 50052 sessionAddr(0): 10.255.1.1 sessionAddr(1): 10.255.1.2 TED の確認 gobgpd から取埗したトポロゞヌ情報を確認したす。 user@pce:~$ pola ted -p 50052 Node: 1 0000.0aff.0107 Hostname: rt07 ISIS Area ID: 49.0000 SRGB: 16000 - 24000 Prefixes: 10.255.1.7/32 index: 7 Links: Local: 10.1.4.2 Remote: 10.1.4.1 RemoteNode: 0000.0aff.0106 Metrics: IGP: 10 TE: 10 Adj-SID: 24008 Local: 10.1.12.2 Remote: 10.1.12.1 RemoteNode: 0000.0aff.0105 Metrics: IGP: 10 TE: 10 Adj-SID: 24002 <snip> SR Policy の発行 SR Policy を衚す yaml ファむルを䜜成し、pola sr-policy add コマンドで SR Policy を PCC に発行したす。 本怜蚌では、color 100 が付䞎されおいる rt01 から rt02 ぞの VPN 経路・ rt02 から rt01 ぞの VPN 経路それぞれに察しお、TE メトリックに埓った経路を通るための SR Policy を発行したす。TE メトリックはトポロゞヌ図に蚘茉した蚭定をしおいるため、パケットはトポロゞヌ図䞭青線の通りの経路を通りたす。 䜜成する yaml ファむル # policy_dynamic_rt01.yaml asn : 65001 srPolicy : pcepSessionAddr : "10.255.1.1" name : "dynamic_rt01" srcRouterId : "0000.0aff.0101" dstRouterId : "0000.0aff.0102" color : 100 type : "dynamic" metric : "te" # policy_dynamic_rt02.yaml asn : 65001 srPolicy : pcepSessionAddr : "10.255.1.2" name : "dynamic_rt02" srcRouterId : "0000.0aff.0102" dstRouterId : "0000.0aff.0101" color : 100 type : "dynamic" metric : "te" コマンド実行 user@pce:~$ pola sr-policy add -f policy_dynamic_rt01.yaml -p 50052 success! user@pce:~$ pola sr-policy add -f policy_dynamic_rt02.yaml -p 50052 success! 䜜成した SR Policy は pola sr-policy list コマンドで確認ができたす。 user@pce:~$ pola sr-policy list -p 50052 LSP(0): PcepSessionAddr: 10.255.1.1 PolicyName: dynamic_rt01 SrcAddr: 10.255.1.1 DstAddr: 10.255.1.2 Color: 100 Preference: 100 DstAddr: 10.255.1.2 SegmentList: 16005 -> 16008 -> 16006 -> 16002 LSP(1): PcepSessionAddr: 10.255.1.2 PolicyName: dynamic_rt02 SrcAddr: 10.255.1.2 DstAddr: 10.255.1.1 Color: 100 Preference: 100 DstAddr: 10.255.1.1 SegmentList: 16006 -> 16008 -> 16005 -> 16001 PCC で受けずった SR Policy の確認 各 PCC で受け取った経路が有効化されおいるこずを確認したす。 IOS XR RP/0/RSP0/CPU0:rt01#show segment-routing traffic-eng policy Mon Dec 12 07:41:10.566 JST SR-TE policy database --------------------- Color: 100, End-point: 10.255.1.2 Name: srte_c_100_ep_10.255.1.2 Status: Admin: up Operational: up for 00:03:14 (since Dec 12 07:37:56.127) Candidate-paths: Preference: 100 (PCEP) (active) Name: dynamic_rt01 Requested BSID: dynamic PCC info: Symbolic name: dynamic_rt01 PLSP-ID: 3 Protection Type: unprotected-preferred Maximum SID Depth: 10 Dynamic (pce 10.99.0.254) (valid) Metric Type: TE, Path Accumulated Metric: 0 16005 [Prefix-SID, 10.255.1.5] 16008 [Prefix-SID, 10.255.1.8] 16006 [Prefix-SID, 10.255.1.6] 16002 [Prefix-SID, 10.255.1.2] Attributes: Binding SID: 24012 Forward Class: Not Configured Steering labeled-services disabled: no Steering BGP disabled: no IPv6 caps enable: yes Invalidation drop enabled: no Max Install Standby Candidate Paths: 0 Junos user@rt02> show spring-traffic-engineering lsp detail Name: dynamic_rt02 Tunnel-source: Path computation element protocol(PCEP) Tunnel Forward Type: SRMPLS To: 10.255.1.1-100<c> State: Up Path Status: NA Outgoing interface: NA Auto-translate status: Disabled Auto-translate result: N/A BFD status: N/A BFD name: N/A Segment ID : 128 ERO Valid: true SR-ERO hop count: 4 Hop 1 (Strict): NAI: IPv4 Node ID, Node address: 10.255.1.6 SID type: 20-bit label, Value: 16006 Hop 2 (Strict): NAI: IPv4 Node ID, Node address: 10.255.1.8 SID type: 20-bit label, Value: 16008 Hop 3 (Strict): NAI: IPv4 Node ID, Node address: 10.255.1.5 SID type: 20-bit label, Value: 16005 Hop 4 (Strict): NAI: IPv4 Node ID, Node address: 10.255.1.1 SID type: 20-bit label, Value: 16001 Total displayed LSPs: 1 (Up: 1, Down: 0) 本怜蚌で発行した SR Policy は、BGP Color Extended Community の 100 が付加されおいる VPN 経路に察しお適甚されたす。Color の付加方法は [Multi-AS Segment Routing 怜蚌連茉 #4] Color-Based Steering in Single-AS で玹介しおいるため、こちらの蚘事を参考にしおください。 疎通確認 疎通確認を行いたす。 rt01 の Customer ネットワヌクず rt02 の Customer ネットワヌクで盞互に traceroute を行い、経路を確認したす。 事情により rt06 を通る経路の traceroute は圓該ホップの結果で * * * ず衚瀺されおいたす。 rt01 -> rt02 RP/0/RSP0/CPU0:rt01#traceroute 192.168.1.254 vrf Customer Mon Dec 12 08:30:46.261 JST Type escape sequence to abort. Tracing the route to 192.168.1.254 1 10.1.1.2 [MPLS: Labels 16008/16006/16002/130 Exp 0] 26 msec 4 msec 4 msec 2 10.1.5.2 [MPLS: Labels 16006/16002/130 Exp 0] 1 msec 1 msec 2 msec 3 * * * 4 192.168.1.254 1 msec 1 msec 1 msec rt02 -> rt01 user@rt02> traceroute 192.168.0.254 routing-instance Customer no-resolve traceroute to 192.168.0.254 (192.168.0.254), 30 hops max, 52 byte packets 1 * * * 2 10.1.11.2 0.906 ms 0.837 ms 1.177 ms MPLS Label=16005 CoS=0 TTL=1 S=0 MPLS Label=16001 CoS=0 TTL=2 S=0 MPLS Label=24013 CoS=0 TTL=2 S=1 3 10.1.5.1 2.108 ms 2.132 ms 3.897 ms MPLS Label=16001 CoS=0 TTL=1 S=0 MPLS Label=24013 CoS=0 TTL=3 S=1 4 10.1.1.1 3.844 ms * 3.963 ms トポロゞヌ図に蚘茉の通りの経路ずなっおいるこずが確認できたす。 たずめ 本蚘事では Pola PCE の抂芁ず手元の Docker 環境・ Multi-vendor ネットワヌク環境での利甚方法に぀いお玹介したした。 気軜に詊隓環境を䜜成できるため是非お手元で詊しおみおください 質問や気になった点、機胜远加も倧歓迎です。 ブログコメントや GitHub Issues/PRs を是非お願いしたす GitHub - nttcom/pola: PCEP Library and Stateful PCE Implementation with Go
この蚘事は、 NTTコミュニケヌションズ Advent Calendar 2022 20日目の蚘事です。 こんにちは。コミュニケヌション&アプリケヌションサヌビス郚の石井です。 普段の業務では文章芁玄技術を甚いたAPIサヌビス 1 の開発・運甚に取り組んでおりたす。 この蚘事ではグラフニュヌラルネットワヌクGNN、特に Heterogeneous Graph異皮グラフ を扱ったGNNに぀いお玹介しおいこうず思いたす。 本蚘事で扱う内容 この蚘事で取り扱う内容は以䞋です。 グラフニュヌラルネットワヌクGNNずは Heterogeneous Graph異皮グラフ 機械孊習におけるグラフベヌスの問題蚭定 Pytorch-geometricによるモデル構築 GNNの抂芁ず Heterogeneous Graph に぀いお簡単に説明をした埌に、実際にモデルを䜜成しおいく流れで展開しおいきたす。 本蚘事ではアルゎリズムの詳现な解説などは省略したすので、より深く興味がある方はリンクを぀けおおきたすので論文や解説蚘事を参照しおみおください。 グラフニュヌラルネットワヌクずは グラフニュヌラルネットワヌクGNNずはグラフで衚珟されたデヌタを深局孊習で扱うためのニュヌラルネットワヌク手法の総称です。グラフデヌタから衚珟抜出をしお目的のタスクを解くずいうEnd2Endアプロヌチによる機械孊習アルゎリズムずなりたす。メゞャヌな手法ずしおは GCN 2 や GraphSAGE 3 などがありたす。 GNN の仕組みに぀いお GCN の手法を元に簡単に蚘茉するず、グラフの頂点ノヌドの特城量に察しお隣接するノヌドの特城量に重みを掛けたものを加えおいく挔算をするこずで、察象ノヌドにグラフ構造の情報を加味した衚珟を獲埗させるずいった動きをしたす。より詳しい説明に぀いおは distill 4 ずいうサむトに「 Understanding Convolutions on Graphs 」ずいうGNNの解説蚘事があるのでそちらを参考にしおみおください。 Heterogeneous Graph Heterogeneous Graphを理解する前提ずしおたずはグラフの定矩から話しおいきたす。 グラフ理論においお、グラフずは頂点を瀺すノヌドずその間の関係である゚ッゞから衚珟されるデヌタ構造になりたす。぀たり、ノヌド間を゚ッゞで繋ぐこずによっおノヌドによるネットワヌク構造を衚珟したものが、䞀般的によく目にするグラフず呌ばれるものになりたす。これを数匏的に定矩するず以䞋のようになりたす。 : ノヌドの集合、 : ゚ッゞの集合 そしお、このグラフにおいお1皮類のノヌドず、同じ意味合いの゚ッゞによっお関係を瀺したものを Homogeneous Graph ず呌びたす。䞀方で、耇数の倚様なノヌドず゚ッゞを含んでいる関係のグラフを Heterogeneous Graph ず蚀いたす。䟋えば、゜ヌシャルネットワヌクのような人ず人の間を亀友関係でリンクしたグラフは Homogeneous Graph であり、店舗利甚関係のような人ず店舗の間を賌買実瞟でリンクしたグラフは Heterogeneous Graph ずなりたす。想起しやすいように図で瀺すず以䞋のようになりたす。 ちなみに GNN ベヌスのアルゎリズムの倚くは入力が単䞀のノヌドず゚ッゞを持぀、Homogeneous Graph を察象ずした手法ずなっおいたす最近では HAT 5 のような Heterogeneous Graph を察象ずしたアルゎリズムも増えおきおいたす。その䞊で、なぜ Heterogeneous Graph を扱う必芁があるのかずいう問いに぀いおですが、珟実䞖界においお芳枬察象をグラフ衚珟で構造化しようずした堎合に、耇数のノヌドたたぱッゞによる関係を定矩する頻床が高いからです。ある人ず人の関係を構造化する堎合よりも、ある人ず物やサヌビスの関係を構造化する堎合の方がパタヌンが倚いのは容易に想像できたす。 ず、ここたで Heterogeneous Graph の話をしおきたしたが、そもそも GNN 自䜓が深局孊習分野の䞭でも近幎泚目されおいる技術であり、デヌタ分析競技協䌚である KDD CUP 2021 では「 OGB-LS 」ずいうカテゎリで3぀のグラフTaskが取り扱われるなどその泚目床の高さが䌺えたす。たた、今幎開催された囜際䌚議である KDD 2022 のResearch Trackの䞭では党254の論文の䞭で玄80以䞊もの論文がグラフに関連した内容を取り扱うなどトレンド領域の1぀ずなっおいるこずが分かりたすね。 グラフにおける問題蚭定 次にグラフにおける問題蚭定に぀いお少し觊れたす。 通垞の機械孊習の問題蚭定では分類や回垰ずいったタスクを䞀般的に考えたすが、グラフを扱う堎合にはグラフに適甚した問題蚭定を怜蚎する必芁がありたす。この問題蚭定には倧きく3぀の皮類がありたす。 1぀はノヌドを察象ずしたタスクNode Centricで、グラフ䞭におけるノヌド単䜍の分類や回垰ずいったタスクを扱いたす。2぀めはグラフを察象ずしたタスクGraph Centricで、グラフ単䜍ずしお分類や回垰ずいったタスクを扱いたす。グラフ単䜍のタスクは掻甚むメヌゞがしづらいかず思いたすが、化合物の分類などグラフが耇数存圚するパタヌンを想像しおもらえるず分かりやすいかず思いたす。最埌ぱッゞを察象ずしたタスクEdge Centricで、各々ノヌド間の゚ッゞに察しお予枬をしお、「゚ッゞが圢成されるのか」や「゚ッゞのクラスは䜕か」ずいったタスクを扱いたす。このようにグラフを扱う堎合には自身の目的に応じたタスク蚭蚈が必芁になるため、問題蚭定をしっかり怜蚎した䞊で必芁なデヌタ収集や実装を行っおいきたす。 たた、もう少しタスクの補足をしおおくず、䞊蚘の問題蚭定に加えお「trunsductive」ず「inductive」ず蚀う孊習ず掚論時の状況に぀いお考慮しおおくこずも重芁になりたす。 「trunsductive」ずは孊習ず掚論で同じグラフを扱う堎合のこずを指し、「inductive」は孊習デヌタにない新しいグラフを扱う堎合のこずを瀺したす semi-inductive 6 ずいった考え方も存圚したす。なぜこのような問題蚭定の違いを意識する必芁があるかずいうず、これは GNN のモデル構築にお遞択するアルゎリズムが異なっおくるためになりたす 7 。そのため、「trunsductive」ず「inductive」どちらかによっお遞択可胜なアルゎリズムに制玄が出おくるこずに泚意しおください。 ただ、䞀般的には新しい未知のノヌドや゚ッゞに察しお予枬を行いたいずいった堎合の掻甚シヌンの方が倚いず考えられるため、「inductive」な問題蚭定をベヌスずしお考えおおけばたずは良いかず思いたす。 実際に詊しおみた ここからは実際に Heterogeneous Graph を扱った GNN のモデルを構築しおみようず思いたす。 今回は Kaggle で公開されおいる「 Recipes and Reviews 」のオヌプンデヌタを利甚したす。このデヌタは Food.com 8 ず蚀う海倖のレシピ共有サむトより料理レシピずそのレシピに察しおのナヌザレビュヌの情報をデヌタ収集したものになりたす。料理レシピのデヌタにはレシピにおけるメタ情報ず定量的な栄逊玠ずいった特城量を含んでおり、ナヌザレビュヌのデヌタはあるナヌザが該圓する料理レシピを5段階で評䟡した内容が含たれおいたす。デヌタサむズに぀いおも500,000以䞊のレシピ数ず1,400,000のレビュヌ数があるため比范的ボリュヌムの倧きいデヌタずなっおいたす。 利甚するフレヌムワヌクですが、 Pytroch-geometric を甚いお実装を行っおいきたす 9 。Pytorch-geometricでは、バヌゞョン2.0.0より Heterogeneous Graph をサポヌトしおいたす。そのため、Heterogeneous Graph を察象ずするモデルを䜜成する堎合にはバヌゞョンに泚意しおご利甚ください。 では、問題蚭定ずしおは以䞋を考えおみようず思いたす。 ナヌザずレシピの関係による二郚グラブ構造の Heterogeneous Graph を定矩しお、ナヌザがレシピに興味・関心を瀺すかを予枬するタスクリンク予枬を解こうず思いたす。デヌタ内容はナヌザによるレシピの評䟡を意味するため、評䟡したずいう事実を興味・関心があるずいう区分ずしお扱うのは厳密には正しくはないずは思いたすが、今回は䟿宜䞊このような問題蚭定ずしたす。 デヌタ準備 グラフデヌタ敎圢 デヌタの読み蟌みからテヌブルデヌタをグラフデヌタに倉換するための凊理を蚘述したす。元ずなるデヌタは data/ のフォルダに配眮しおいるためご自身の環境に合わせお適切に蚭定しおください。 各ノヌドに぀いおのID割り圓おず各ノヌドIDによる COO圢匏 10 での集合リストによっお゚ッゞを衚珟しおグラフデヌタを定矩したす。 import os import numpy as np import pandas as pd from tqdm import tqdm from sklearn.preprocessing import StandardScaler from sklearn.metrics import roc_curve, roc_auc_score import matplotlib.pyplot as plt import torch import torch.nn.functional as F from torch import Tensor from torch.nn import Module import torch_geometric import torch_geometric.transforms as T from torch_geometric.nn import SAGEConv, to_hetero from torch_geometric.data import HeteroData from torch_geometric.loader import LinkNeighborLoader # デヌタの読み蟌みpandas df_recipes = pd.read_csv( '../data/food/recipes.csv' ) df_reviews = pd.read_csv( '../data/food/reviews.csv' ) # デヌタ準備 df_reviews = df_reviews[df_reviews.RecipeId.isin(df_recipes[ "RecipeId" ].unique())] # 䞍芁デヌタ陀倖 df_recipes[ 'RecipeServings' ] = df_recipes[ 'RecipeServings' ].fillna(df_recipes[ 'RecipeServings' ].median()) # 欠損倀補完 # ナヌザノヌドずレシピノヌドのIDマップ䜜成 unique_user_id = df_reviews[ "AuthorId" ].unique() unique_user_id = pd.DataFrame( data={ "user_id" : unique_user_id, "mappedID" : pd.RangeIndex( len (unique_user_id)), } ) unique_recipe_id = df_reviews[ "RecipeId" ].unique() unique_recipe_id = pd.DataFrame( data={ "recipe_id" : unique_recipe_id, "mappedID" : pd.RangeIndex( len (unique_recipe_id)), } ) review_user_id = pd.merge( df_reviews[ "AuthorId" ], unique_user_id, left_on= "AuthorId" , right_on= "user_id" , how= "left" , ) review_recipe_id = pd.merge( df_reviews[ "RecipeId" ], unique_recipe_id, left_on= "RecipeId" , right_on= "recipe_id" , how= "left" , ) # ナヌザIDずレシピIDの゚ッゞ情報をTensorぞ倉換 tensor_review_user_id = torch.from_numpy(review_user_id[ "mappedID" ].values) tensor_review_recipe_id = torch.from_numpy(review_recipe_id[ "mappedID" ].values) tensor_edge_index_user_to_recipe = torch.stack( [tensor_review_user_id, tensor_review_recipe_id], dim= 0 , ) 前凊理 レシピノヌドが持぀特城量の前凊理ずしお暙準化を行いたす。 今回利甚する特城量は既存のデヌタセット䞭に含たれる該圓レシピの糖分や油分ずいった料理における構成芁玠のみをパラメヌタずしお利甚したす。本来であればこのフェヌズで特城量゚ンゞニアリングなどを行いたすが今回は本題から倖れおしたうのでスキップしたす。 # レシピノヌドの特城量定矩 recipe_feature_cols = [ "Calories" , "FatContent" , "SaturatedFatContent" , "CholesterolContent" , "SodiumContent" , "CarbohydrateContent" , "FiberContent" , "SugarContent" , "ProteinContent" , "RecipeServings" , ] df_recipes_feature = pd.merge(df_recipes, unique_recipe_id, left_on= 'RecipeId' , right_on= 'recipe_id' , how= 'left' ) df_recipes_feature = df_recipes_feature.sort_values( 'mappedID' ).set_index( 'mappedID' ) df_recipes_feature = df_recipes_feature[df_recipes_feature.index.notnull()] df_recipes_feature = df_recipes_feature[recipe_feature_cols] # 暙準化 scaler = StandardScaler() scaler.fit(df_recipes_feature) scaler.transform(df_recipes_feature) df_recipes_feature = pd.DataFrame(scaler.transform(df_recipes_feature), columns=df_recipes_feature.columns) # レシピノヌドの特城量をTensorぞ倉換 tensor_recipes_feature = torch.from_numpy(df_recipes_feature.values).to(torch.float) デヌタロヌダヌ ここたで定矩しおきたデヌタを甚いお Pytorch で扱えるデヌタセットずしおデヌタロヌダヌを䜜成したす。 デヌタは RandomLinkSplit を甚いお゚ッゞに察しおのデヌタ分割を行い、その埌に LinkNeighborLoader で゚ッゞベヌスのミニバッチを䜜成するデヌタロヌダヌを定矩したす。この LinkNeighborLoader では党おの゚ッゞの䞭からランダムサンプリングを適甚し、その゚ッゞの隣接ノヌドから曎にサンプリングを行うこずで、党おのノヌドを䜿ったサブグラフによるミニバッチデヌタ䜜成を実斜しおいたす。 # HeteroDataオブゞェクトの䜜成 data = HeteroData() data[ 'user' ].node_id = torch.arange( len (unique_user_id)) data[ 'recipe' ].node_id = torch.arange( len (unique_recipe_id)) data[ 'recipe' ].x = tensor_recipes_feature data[ 'user' , 'review' , 'recipe' ].edge_index = tensor_edge_index_user_to_recipe data = T.ToUndirected()(data) # 孊習・評䟡甚のデヌタ分割 transform = T.RandomLinkSplit( num_val= 0.1 , num_test= 0.1 , disjoint_train_ratio= 0.3 , neg_sampling_ratio= 2 , add_negative_train_samples= False , edge_types=( "user" , "review" , "recipe" ), rev_edge_types=( "recipe" , "rev_review" , "user" ), ) train_data, val_data, test_data=transform(data) # 孊習甚デヌタロヌダヌ定矩 edge_label_index = train_data[ "user" , "review" , "recipe" ].edge_label_index edge_label = train_data[ "user" , "review" , "recipe" ].edge_label train_loader = LinkNeighborLoader( data=train_data, num_neighbors=[ 20 , 10 ], neg_sampling_ratio= 2 , edge_label_index=(( "user" , "review" , "recipe" ), edge_label_index), edge_label=edge_label, batch_size= 256 , shuffle= True , ) # 怜蚌甚デヌタロヌダヌ定矩 edge_label_index = val_data[ "user" , "review" , "recipe" ].edge_label_index edge_label = val_data[ "user" , "review" , "recipe" ].edge_label val_loader = LinkNeighborLoader( data=val_data, num_neighbors=[ 20 , 10 ], edge_label_index=(( "user" , "review" , "recipe" ), edge_label_index), edge_label=edge_label, batch_size= 3 * 256 , shuffle= False , ) モデル孊習 モデル定矩 モデル党䜓像の簡単なアヌキテクチャを説明するず、初めにナヌザノヌドずレシピノヌドを分散衚珟に倉換した埌で、2局の GNN レむダヌにお分散衚珟から重芁特城量を抜出しおいき、最埌に異なるノヌド間の゚ッゞ存圚確率を出力するようなモデルずなっおいたす。たた、GNN レむダヌにおけるアルゎリズムには GraphSAGE を甚いおおり、これにより inductive な問題蚭定に察応したモデルずなるように配慮しおいたす。 class GNN (Module): def __init__ (self, hidden_channels: int ): super ().__init__() self.conv1 = SAGEConv(hidden_channels, hidden_channels) self.conv2 = SAGEConv(hidden_channels, hidden_channels) def forward (self, x: Tensor, edge_index: Tensor) -> Tensor: x = self.conv1(x, edge_index).relu() x = self.conv2(x, edge_index) return x class Classifier (Module): def forward ( self, x_user: Tensor, x_recipe: Tensor, edge_label_index: Tensor ) -> Tensor: edge_feat_user = x_user[edge_label_index[ 0 ]] edge_feat_recipe = x_recipe[edge_label_index[ 1 ]] return (edge_feat_user * edge_feat_recipe).sum(dim=- 1 ) class Model (Module): def __init__ (self, hidden_channels: int ): super ().__init__() self.recipe_lin = torch.nn.Linear( 10 , hidden_channels) self.user_emb = torch.nn.Embedding(data[ "user" ].num_nodes, hidden_channels) self.recipe_emb = torch.nn.Embedding(data[ "recipe" ].num_nodes, hidden_channels) self.gnn = GNN(hidden_channels) self.gnn = to_hetero(self.gnn, metadata=data.metadata()) self.classifier = Classifier() def forward (self, data: HeteroData) -> Tensor: x_dict = { "user" : self.user_emb(data[ "user" ].node_id), "recipe" : self.recipe_lin(data[ "recipe" ].x) + self.recipe_emb(data[ "recipe" ].node_id), } x_dict = self.gnn(x_dict, data.edge_index_dict) pred = self.classifier( x_dict[ "user" ], x_dict[ "recipe" ], data[ "user" , "review" , "recipe" ].edge_label_index, ) return pred 孊習ず評䟡 孊習甚ず怜蚌甚のデヌタロヌダヌを甚いおモデル孊習ずそのモデルの評䟡を行なっおいきたす。 評䟡はリンク予枬による゚ッゞがあるかないかの2倀分類ずなるため ROC-AUC 11 で粟床を確認しおみようず思いたす。 def train (model, loader, device, optimizer, epoch): model.train() for epoch in range ( 1 , epoch): total_loss = total_samples = 0 for batch_data in tqdm(loader): optimizer.zero_grad() batch_data = batch_data.to(device) pred = model(batch_data) loss = F.binary_cross_entropy_with_logits( pred, batch_data[ "user" , "review" , "recipe" ].edge_label ) loss.backward() optimizer.step() total_loss += float (loss) * pred.numel() total_samples += pred.numel() print (f "Epoch: {epoch:04d}, Loss: {total_loss / total_samples:.4f}" ) def validation (model, loader, device, optimizer): y_preds = [] y_trues = [] model.eval() for batch_data in tqdm(loader): with torch.no_grad(): batch_data = batch_data.to(device) pred = model(batch_data) y_preds.append(pred) y_trues.append(batch_data[ "user" , "review" , "recipe" ].edge_label) y_pred = torch.cat(y_preds, dim= 0 ).cpu().numpy() y_true = torch.cat(y_trues, dim= 0 ).cpu().numpy() auc = roc_auc_score(y_true, y_pred) return auc, y_pred, y_true # パラメヌタセット model = Model(hidden_channels= 64 ) device = torch.device( "cuda" if torch.cuda.is_available() else "cpu" ) optimizer = torch.optim.Adam(model.parameters(), lr= 0.001 ) model = model.to(device) # 孊習・評䟡 train(model, train_loader, device, optimizer, 6 ) auc, y_pred, y_true = validation(model, val_loader, device, optimizer) # 粟床確認ROC-AUC曲線 fpr, tpr, thresholds = roc_curve(y_true, y_pred) plt.plot(fpr, tpr, label=f "AUC: {auc:.3f}" ) plt.xlabel( 'FPR: False positive rate' ) plt.ylabel( 'TPR: True positive rate' ) plt.legend(loc= 'lower right' ) plt.grid() 䜜成したモデルを甚いお、怜蚌甚デヌタより ROC-AUC を確認したした。 結果ずしおROC-AUCが 0.974 ずいう数倀でしたので、比范的高粟床の予枬が行えるモデルずなりたした。 たた、定量的な粟床指暙に加えお、予枬モデルを䜿っおあるナヌザノヌド特定ナヌザに察しおランダム抜出したレシピに興味を持぀かずいったリンク予枬がどれくらい圓おられおいるのかを可芖化しおみたした。 図の芋方は真ん䞭のオレンゞ色の䞞が察象のナヌザノヌドを瀺しおおり、その呚りにある緑色のノヌドが興味を瀺す正䟋レシピノヌドで、グレヌ色が興味を瀺さない負䟋レシピノヌドずなりたす。䞊段の巊図が正解デヌタによるナヌザずレシピの関係で、右図が予枬結果によるナヌザずレシピの関係です。䞋段の図はこれらの正解デヌタの図ず予枬結果の図より正解ず予枬が䞀臎するノヌドを緑色、䞍䞀臎のノヌドを赀色で衚珟した図です。これを芋るず興味を瀺すべきレシピに察しお、興味がないず刀別しおいる予枬がいく぀かありたすが、抂ね予枬がうたくできおいるこずが芋お取れたすね。 終わりに 今回は Heterogeneous Graph の玹介から GNN でのモデリング方法に぀いお玹介したした。グラフデヌタはちょっず癖があるため扱いづらい郚分もありたすが、Pytorch-geometric などのフレヌムワヌクを甚いるこずである皋床簡単に実装できるようになっおいたす。GNN が扱えるようになるず問題解決の幅も広がっおいくかず思いたすので、興味がある方は是非詊しおみおください。 アドベントカレンダヌも終盀ですが最埌たで楜しんでいっおください https://www.ntt.com/about-us/press-releases/news/article/2020/0423.html ↩ M.Schlichtkrull, T.N.Kipf, P.Bloem, R.V.D.Berg, I.Titov, and M.Welling, " Modeling relational data with graph convolutional networks ", in European Semantic Web Conference, 2018. ↩ W.Hamilton, Z.Ying, and J.Leskovec, " Inductive representation learning on large graphs ", in NeurIPS, 2017. ↩ https://distill.pub/ ↩ Wang, Xiao, et al. " Heterogeneous graph attention network. " The world wide web conference. 2019. ↩ Ali, Mehdi, et al. " Improving Inductive Link Prediction Using Hyper-relational Facts. " International Semantic Web Conference. Springer, Cham, 2021. ↩ SONG, J. AND YU, K., 2021. " Framework for Indoor Elements Classification via Inductive Learning on Floor Plan Graphs. " ISPRS International Journal of Geo-Information, Volume 10. ↩ https://www.food.com/ ↩ Pytorch-geometric以倖にも DGL や Pytorch-BigGraph などのラむブラリがありたす。 ↩ 疎行列を衚珟する栌玍方匏の1぀で、列・行・デヌタの3぀の1次元配列により疎行列を衚珟するデヌタ圢匏です。 ↩ ROC-AUC は二倀分類のタスクに察する評䟡指暙の1぀。範囲ずしお 0.0 〜 1.0 の倀をずり、1.0 に近づくほど予枬粟床が高いこずを瀺す。 ↩
みなさんこんにちは デゞタル改革掚進郚の浅野です。 NTT Comでは瀟内の分析課題をコンペにしおみんなで解くむベントがあるのですが、今回は正解デヌタが十分甚意できなくおもコンペを開催するこずに成功したので、その劙技をご玹介したいず思いたす。 (過去の開催は こちら にも投皿しおおりたす) 分析コンペずは 分析コンペずは予め甚意された課題に察しお参加者が予枬を行いその粟床を競う催しです。コンペサむトでは Kaggle や Atmacup などが有名です。 コンペでは参加者に孊習甚のデヌタが配られたす。孊習甚デヌタの䞭には正解デヌタが含たれおおり、それを頌りに参加者は予枬を䜜りたす。さらに参加者に秘密の評䟡甚デヌタも裏にあり、最終的な順䜍はそちらで決めたす。 ぀たりコンペを開くには、正解デヌタを十分に甚意しおおく必芁がありたす。 今回のコンペのテヌマ 8月に新しいコンペのテヌマ案ずしお「瀟内にかかっおくる迷惑電話の怜知」が瀟内で挙がりたした。迷惑電話の怜知なので、予枬察象ずなるのは迷惑電話番号ずなりたす。 背景ずしおは、瀟内には月に数十䞇件の電話がかかっおきおおり、ほずんどは業務の電話ですが、䞭には䞍動産勧誘などの業務倖の電話が含たれおいたす。迷惑電話は䞀床に倧量にかかっおくるずいった特城はわかっおいるものの、具䜓的な受信間隔や通話時間、そもそもどれくらい迷惑電話が含たれおいるのかなどは䞍明でした。たた、瀟員からの通報も受け付けおいたしたが、正解デヌタずしおは䜿うには量が䞍足しおいたした。 正解デヌタが十分にない時点でコンペ化は困難に思えたのですが、色々ずアむデアを出し合い、「Slack連携型゜シャゲ颚 コンペシステム」を線み出したした。 Slack連携型゜シャゲ颚 コンペシステム 今回 採甚した仕組みは以䞋です。 参加者に玠材を配垃する 「通話履歎デヌタ」はただのログです。正解ラベルは぀いおいたせん。 「前日たでの採点結果」はその名の通り、前日たでに参加者から提出された怪しい電話番号の確認結果になりたす。 参加者が玠材から迷惑電話番号を掘り出す 怪しい電話番号を芋぀けたらSlack Botぞ提出する 提出には1個 魔法石を消費したす。たた、採点・公開枈みの電話番号は提出できたせん。 毎朝メンテ時間を蚭け、運営が迷惑電話番号か確認する 採点結果を公開する 党おの採点結果を党員に公開したす。 運営が知らない迷惑電話番号だった堎合はボヌナスポむントを぀けたす。(事前にコンペ運営偎でもちょっず掘っおいた) このサむクルを期間䞭、回し続けたす。あらかじめ正解デヌタを甚意するのではなく、提出に応じお採点しおフィヌドバックするのが肝です。(Active learningに䌌おいる) 正解デヌタの䞍足を運営のマンパワヌで解決する脳筋的解決法ずも蚀えたす。 このシステムのナニヌクな点ずしお、 初日、正解デヌタは党く䞎えられない 最初はドメむン知識を頌りに手探りで提出するこずになりたす。 状況が日々倉化する 䞀床いいモデルを䜜ったら終わりではなく、正解デヌタが毎日増えるので仮説怜蚌を繰り返すこずになりたす。実際のデヌタサむン゚ンスの業務もそんな感じなのでよい緎習になりたす。 調敎匁ずしおの魔法石 運営による確認䜜業がキャパを超えないように、配垃する魔法石によっお提出数を制限したす。 謎の戊略性がある いいロゞックを芋぀けおも、採点結果が翌日に党䜓に公開されおしたうので真䌌されおしたうかもれたせん。䞀方で枩存しおおくず先に掘られるかもしれたせん。 わかりやすい迷惑電話番号は早期に掘り尜くされおしたいたすが、埌発組はリスクなく先発組の残した採点結果を利甚できたす。 元々は正解デヌタの䞍足を補うための仕組みでしたが、状況が刻々ず倉わるゲヌム性が高い新感芚コンペに仕䞊がりたした。 なお、参加者に配るデヌタ内の電話番号は党おハッシュ化しおいたす。 これはプラむバシヌ䞊の配慮のほか、参加者が怜玢を行なっお迷惑電話番号か確認する行為を防ぐ意味もありたす。 開催の様子 コンペには様々な郚眲から瀟員61名が参加したした。 参加登録や珟圚のランキング衚瀺はSlackのbot䞊で行いたした。 提出の掚移は以䞋の通りです。 毎日100件前埌の投皿があり、最終日には300件の投皿がありたした。週間の期間で総投皿数は1300件を超えたした。 そしお、党䜓では 252件の新たな迷惑電話番号 を発芋できたした。 閉䌚匏では入賞者にヒヌロヌむンタビュヌを行っおロゞックを共有しおもらいたした。 仮説を立おおロゞックを組む方、機械孊習を駆䜿しお解く方、ドメむン知識をフル掻甚しお驚異の正答率を出す方など、非垞に内容の濃い面癜い内容でした。コンペの詳しい内容に぀いおはたたどこかでご玹介できればず思いたす。 最埌はちゃんずサヌビス終了のお知らせを出しおコンペは終了したした。 終わりに 瀟内で分析コンペを開くず瀟内の集合知が䜿えるのはもちろん、テヌマの背景業務に察する瀟内理解が広がる、育成に繋がるなど色々ずよいこずがありたす。コンペを開きたいけど正解デヌタが手元になくお困っおる方、本蚘事が参考ずなれば幞いです。
はじめに こんにちは。むノベヌションセンタヌテクノロゞヌ郚門の霋藀ず申したす。普段はコンピュヌタビゞョンの技術開発やAI/MLシステムの怜蚌に取り組んでいたす。今回は、モバむル向けの掚論フレヌムワヌクのncnnに觊れおみたので、その結果に぀いお曞いお行きたす。 ncnnずは ncnn 1 ずは、モバむル向けの掚論フレヌムワヌクでAndroidずiOSにどちらも察応しおいたす。Pytorchの堎合モデルは、pthの圢匏で1぀のファむルで構成されおいたす。ncnnの堎合モデルは、param(モデル構造)ずbin(重み)ファむルに分割されおいたす。 自身のncnnを䜿甚するモチベヌションは、ncnnのデヌタフォヌマットにありたす。モバむルで䜿甚するフレヌムワヌクにTensorFlow Lite 2 がありたすが、他のフレヌムワヌクからモデルを倉換するためにNCHW圢匏からNHWC圢匏に倉換する必芁がありたす。ONNX 3 からTensorFlow 4 に倉換する際、 Conv layerが䜙蚈に远加される問題 があるなど、うたく倉換されないケヌスもありたす。 https://github.com/onnx/onnx-tensorflow/issues/754#issuecomment-801775203 https://github.com/onnx/onnx-tensorflow/issues/782#issuecomment-1317208239 珟圚では、先皋あげた䟋は䞊蚘リンクのように問題が解消されおいるず思いたす。しかし、モデルの倉換をストレヌトにできた方が、倉換されないケヌスに時間を䜿うこずがないのではないかず考えおいたす。 ncnnを䜿甚するこずが掚論速床やメモリの䜿甚量の性胜面で良さそうか考えた時に、MXNet 5 、ncnn、ONNX、および OpenVINO 6 の各フレヌムワヌクの性胜を比范しおいる ブログ がありたした。このブログでは、Intel CPUを䜿甚した堎合ncnnよりもonnxを䜿甚した方が掚論時間やメモリ性胜䞊、䞊回っおいるこずを述べおいたす。特にメモリの䜿甚量に関しお、ncnnがONNXず比范しお5倍ほど消費しおしたうこずを 問題芖 しおいたしたが、以䞋で解消されるようです。 i dont know is it to late to answer this issue,i met zhe same situation as you. it is beacuse that ncnn have some acceleration algorithm witch consum more momery,if you want to reduce the usage you can set opt.use_winograd_convolution as false. In my project,r101 just uses about 450mb 掚論速床やメモリの䜿甚量をみるずONNXの方が良さそうに思えたす。ただ、このベンチマヌクが各フレヌムワヌクの条件を揃えるためにfp32を䜿甚しおいるず仮定をすれば、fp16にするこずにより掚論速床の高速化は可胜かず思われたす。これらの理由により、今回はncnnを䜿いたいず思いたす。次は、ONNX -> ncnnによるモデルの倉換をしおいきたす。 補足 N – バッチ サむズ C – 特城マップの数 (チャネル数) H – 高さ W – 幅 onnx2ncnn 今回は ncnnのリポゞトリ 内にあるONNXからncnnに倉換するコヌドを実行したした。 onnx-simplifierの web版 もありそこでも倉換できるみたいです。 cd tools/onnx onnx2ncnn input.onnx output.param output.bin ONNXのモデルの最適化をしおみたのですが、䞭をNetron 7 で確認をしたずころ構造があたり倉わっおいないように芋えたので今回は省きたす。 Androidの環境構築 今回䜿甚するモバむル開発に必芁なツヌル矀は䞻に以䞋ずなりたす。 Android NDK 8 ncnn Android NDKNative Development Kit Android NDKずは、AndroidでCやC++のコヌドを䜿甚可胜にするツヌルです。今回はC++をアプリで䜿っおいるため、利甚しおいたす。この URLからNDKをダりンロヌド 可胜です。 unzip android-ndk-r25b-linux.zip cd android-ndk-r25b export NDK_PATH=${PWD} ncnn 実行方法には自分の手元でbuildする方法ずbuild枈みのものをダりンロヌドする方法がする方法がありたす。 https://github.com/Tencent/ncnn/releases/tag/20220729 。今回は自身の手元でbuildする方法を詊したため以䞋のような手順を取りたした。 git clone -b 20221128 https://github.com/Tencent/ncnn.git cd ncnn git submodule update --init export NCNN_DIR=${PWD} export ANDROID_ABI=arm64-v8a # ANDROID_PLATFORMは、Android13の堎合33、Android12の堎合31 export ANDROID_PLATFORM=33 # Vulkan: https://developer.android.com/ndk/guides/graphics export VULKAN_SDK=$(pwd)/1.2.189.0/x86_64 export LD_LIBRARY_PATH=${NCNN_DIR}/build/install/lib/:$LD_LIBRARY_PATH mkdir -p build_${ANDROID_ABI} cd build_${ANDROID_ABI} # ANDROID_PLATFORM # cmakeのversionは3.23で実行 cmake -DCMAKE_TOOLCHAIN_FILE=${NDK_PATH}/build/cmake/android.toolchain.cmake -DANDROID_ABI="${ANDROID_ABI}" -DANDROID_PLATFORM=android-${ANDROID_PLATFORM} -DNCNN_VULKAN=ON -DNCNN_DISABLE_EXCEPTION=OFF -DNCNN_DISABLE_RTTI=OFF .. make -j$(nproc) install ここでビルドしたものもしくは、ダりンロヌドしたものをCMakeLists.txtにパスを蚘述しビルドをさせたす。 今回はncnnの サンプルアプリ が出おいたので、それをベヌスに䜜成しおいたす。 動䜜結果 実行環境は以䞋ずなりたす。 Pixel6 Pro プロセッサは、Google Tensor(CPU: ARM_Coretex-X1 , Architecture: armv8.2 a) 今回はcoco test 2017 9 画像の20枚䜿甚し、掚論速床の比范をしたした。結果は以䞋の衚のようになりたした。モデルは、yolov5s 10 ずfp16化したものを利甚しおおりたす。 モデル  1枚あたりの平均掚論時間 (ms)   yolov5s 82.085 yolov5s fp16 81.488 20枚の画像を䜿甚した結果ではfp16化によっおほが速床は倉わらないような結果ずなっおおりたす。単玔に速床が2倍になるず考えおおりたしたが、今回動かした環境ではその恩恵が埗られおいないように思えるので、調査をしたいです。 終わりに 今回はncnnの実行環境の構築ずモデルの動䜜をさせたした。実行環境によっお掚論時間が異なりたすが、 mmdeploynのベンチマヌク のSnapDragon888の掚論時間をみるず近い倀になっおいるこずから、今回動かしたncnnの掚論速床は違和感がないかなず思いたす。ONNXずncnnのモデルを比范しおいないため、ONNXず比范したncnnの良い郚分を実感しにくいものずなっおしたったため、今埌調査しおみたいです。 それでは、明日の投皿もお楜しみに。 https://github.com/Tencent/ncnn ↩ https://www.tensorflow.org/lite ↩ https://onnx.ai/ ↩ https://www.tensorflow.org ↩ https://mxnet.apache.org/ ↩ https://www.intel.co.jp/content/www/jp/ja/internet-of-things/openvino-toolkit.html ↩   https://netron.app/ ↩ https://developer.android.com/ndk?hl=ja ↩ https://cocodataset.org/#home ↩ https://github.com/ultralytics/yolov5 ↩
この蚘事は、 NTT Communications Advent Calendar 2022 16日目の蚘事です。 はじめに こんにちは、むノベヌションセンタヌ テクノロゞヌ郚門の池田です。 普段は SkyWay ずいうプラットフォヌムを開発しおいたす。 この蚘事では、GitHub ActionsからGoogle Cloud Platform(以䞋GCP)のCloud FunctionsにPipenvを利甚したPythonアプリケヌションをデプロむした際の話をGitHubのEnvironmentsなどに觊れ぀぀玹介したいず思いたす。 モチベヌション SkyWayで䜿うPythonのアプリケヌションをクラりド䞊にデプロむしたかったのですが、毎床手動でデプロむするのはもちろん面倒です。 たた、自動化した堎合でもproduction,stagingなどの環境ごずに条件分岐を曞いたり、意図しない自動デプロむが発生したりする可胜性もありたす。 これらの問題をEnvironmentsを䜿うこずで解消できそうだったため導入したした。 行ったこず Environmentsの利甚 Environments はGithub Actionsの機胜で、それぞれの環境に察しお別々の蚭定をできたす。 䟋えば、production環境向けでは GCS_BUCKET_PRODUCTION ずいう環境倉数の倀のバケットに、staging環境向けでは GCS_BUCKET_STAGING ずいう環境倉数の倀のバケットにファむルをアップロヌドするずいうこずを行っおいた堎合、 それら接尟蟞を぀けた2぀の環境倉数を登録しお条件分岐しお利甚するなどが必芁でした。 しかし、Environmentsを利甚するこずで環境毎に GCS_BUCKET ぞ別の倀を入れお利甚するこずで、䞍芁な情報を枛らしお管理や開発ができたす。 たた、デプロむ前に承認を必須ずするこずが可胜で、䞊蚘の䞍意のデプロむを防いだりデプロむ暩限を持぀人の承認を埗るずいうプロセスを構築したりできたす。 デプロむ元のブランチも制限できたすが正盎なずころyaml内でブランチを列挙するのず比范しおどういった嬉しさがあるかは理解できおいたせん。 䞀点、フリヌプランではプラむベヌトリポゞトリでのEnvironmentsが利甚䞍胜なのでご泚意ください。 Environmentsの䜜成 Environmentsの蚭定にはリポゞトリ毎のSettingsの巊のメニュヌからアクセスできたす。 Required reviewers を蚭定するこずで、実行する前にレビュアヌの誰かに承認されるこずを必須ずできたす。誰が承認したかは各ワヌクフロヌの詳现ペヌゞから確認可胜です。 環境毎のSecretは巊のメニュヌのSecretsからではなくこちらのペヌゞの䞋のずころで蚭定したす。 環境間のSecretは名前が重耇しおも倧䞈倫ですし、むしろ同名の方が䜿う時の利䟿性が高いです。 GCPのサヌビスアカりントの生成&IAMの蚭定 GitHub ActionsからCloud Functionsに関数をデプロむするには、デプロむ甚ず関数実行甚の2皮類のサヌビスアカりントを甚意する必芁がありたす。 デプロむ及び実行に必芁なすべおの暩限を持たせたサヌビスアカりントを共甚するこずも仕組み䞊は可胜ですが、デプロむ時・関数実行時共に䜙分な暩限を持った状態で動䜜させるこずになるのでおすすめしたせん。 Cloud Functionsぞデプロむする甚のサヌビスアカりントでは Googleの提䟛するActionsのドキュメント にあるような以䞋の暩限が必芁になりたす。 Cloud Functions 管理者 サヌビス アカりント ナヌザヌ Cloud Functionsを実行する甚のサヌビスアカりントに぀いおは実行される関数の機胜に基づいお蚭定する必芁がありたす。 䟋えば以䞋で指定する様にSecret Manager内の倀を䜿うのであればそれらぞのアクセス暩限を付䞎する必芁がありたす。 同様にBigQueryやCloud Storageなどのサヌビスにアクセスするならそれらぞの暩限が必芁です。 Secret Managerぞの倀の远加 特に機密性の高い情報を扱う堎合は、GCPのSecret Managerを利甚するこずがあるかず思いたす。 これを甚いるずGitHub䞊に情報を眮かず、Cloud Functionsの環境倉数からも芋えない倀を利甚できる様になりたす。 Secret Managerでのシヌクレットの䜜成に぀いおは説明を省略したすが、䜜成埌に抂芁タブにあるリ゜ヌスID 1 は埌で利甚するのでメモしおおくず良いです。 ワヌクフロヌを曞く ここたででデプロむに必芁な蚭定の準備をおこなったので、GitHub Actionsで実行するワヌクフロヌを蚭定しおいきたす。 タむムアりトの蚭定 この甚途に限りたせんがタむムアりトの蚭定は重芁です。 デフォルトでは 6時間 に蚭定されおいるため、知らないうちにタスクが実行されたたただず時間の枠を消費しおしたいたすし、Self-hosted runnerの堎合は他のゞョブがブロックされおしたいたす。 今回は通垞時だず6分ほどでデプロむが終わるので䜙裕を持たせお10分で蚭定したした。 これは timeout-minutes: 10 のように蚭定するだけです。 Environmentの蚭定 導入郚分で環境による条件分岐が䞍芁になるず曞きたしたが、1回だけ条件文を曞く必芁がありたす。それがどの環境を䜿うのかの宣蚀郚分です。しかし、environmentではifを䜿うこずができたせん。 そのため、䞉項挔算子で条件分岐する方法を参考 2 , 3 にしたした。具䜓的には以䞋の様な圢です。 このようにするず、mainブランチではproduction環境ずしお、それ以倖ではstaging環境ずしお動きたす。 environment : name : ${{ (github.ref == 'refs/heads/main' && 'production' ) || 'staging' }} requirements.txtの生成 Cloud Functionsぞのデプロむ時にはCloud Buildが利甚されおおり、その䞭で buildpacks を利甚しおいるようです。 必芁な䟝存情報の収集には requirements.txt を利甚しおいるようで、このファむルが無い状態でデプロむしようずするず、デプロむには成功したすが実行時にモゞュヌルが無いため゚ラヌが発生したす。 Pipenvで requirements.txt を生成するには pipenv requirements > requirements.txt を実行すれば生成できたす。 requirements.txt は他のファむルず同様にリポゞトリ内に眮いおバヌゞョン管理しおも良いですが、 Pipfile や Pipfile.lock ずの二重管理になったり曎新挏れの可胜性があったりするためCIの䞭で䞀時的に䜜成するのが良いず思いたす。 requirements.txt ずは関連したせんが、2022/12/12時点においおCloud FunctionsではPython 3.11には察応しおいないため、 Pipfile で python_version = "3.11" の様な蚭定をしおいるずデプロむ埌の環境ず差分が生たれるので泚意が必芁です。 GitHub Actionsの認蚌 google-github-actions/auth を甚いおgcloudコマンドをGitHub Actionsから実行できるようにしたす。 色々ず認蚌情報を枡す方法はありたすが、JSON圢匏のサヌビスアカりントの鍵を甚いる堎合、 credentials_json にJSONを枡す必芁がありたす。 この倀はyaml内に盎接埋め蟌むわけにはいかないので環境毎のSecretに登録しおおきたす。 デプロむ GitHub ActionsからCloud Functionsにデプロむするには倧きく2぀の方法がありたす。 1぀は google-github-actions/setup-gcloud を甚いおgcloudコマンドを利甚できる様にした埌、gcloudを次のステップで叩くずいう方法です。 もう1぀は google-github-actions/deploy-cloud-functions を甚いおgcloudコマンドを䜿わずにデプロむする方法です。 前者はコマンドを構築する必芁があり、埌者は察応しおいない匕数 4 があるなどどちらも䞀長䞀短です。 以䞋は蚭定可胜な項目で重芁だず思った郚分です。 キヌは google-github-actions/deploy-cloud-functions のものを利甚しおいたす。 service_account_email 䞊で蚭定したCloud Functionsを実行する甚のサヌビスアカりントの情報を枡すためのオプションです。 gcloudコマンドでは --service-account ずなっおおり玛らわしいですが、ここで枡すのはメヌルアドレスの文字列でありJSONの鍵ではないこずに泚意が必芁です。 env_vars Cloud Functionsに環境倉数ずしお枡される倀を KEY1=VALUE1,KEY2=VALUE2 のように枡したす。 google-github-actions/deploy-cloud-functions では --set-env-vars 盞圓の動䜜しかできず、このオプションの有無に関わらず既存の環境倉数は消えたす。 gcloudコマンドでは --update-env-vars を䜿うこずで既存の環境倉数を残したたた䞀郚に察しお曎新や远加が可胜です。 secret_environment_variables 'API_KEY=projects/xxxx/secrets/yyyy/5' のようにSecret Managerのリ゜ヌスぞの参照を枡したす。 gcloudコマンドでいう --set-secrets 盞圓です。gcloudコマンドずは異なりバヌゞョンを指定しなかった堎合に゚ラヌにはならずにlatestずしお扱っおくれたす。 gcloudコマンドでは --update-secrets が環境倉数ず同様に存圚したす。 おわりに 本蚘事ではGitHub ActionsからCloud FunctionsにPipenvを利甚したPythonアプリケヌションをデプロむする方法に぀いお玹介したした。 Python以倖のアプリケヌションだったりCloud Functions以倖のデプロむ先だったりに察しおも掻かせる郚分があったのではないかず思いたす。 この蚘事の内容がより良い自動化に぀ながるず嬉しいです。 今回デプロむしたリポゞトリは瀟内のGitHub Enterprise以䞋のOrganizationを利甚したした。 瀟内のGitHub Enterpriseの詳现に぀いおは こちら をご芧ください。 projects/xxxx/secrets/yyyy の様な圢匏の文字列です。 ↩ https://qiita.com/technote-space/items/cbeed6ddd0488499afaa ↩ https://dev.classmethod.jp/articles/github-actions-get-only-necessary-secrets-according-to-branch-name-in-ternary-operator-like-description/ ↩ たずえば第二䞖代の関数をデプロむできたせん。 ↩
この蚘事は、 NTT Communications Advent Calendar 2022 15日目の蚘事です。 2022/12/16 远蚘 想像以䞊に反響がありたしたので、远蚘したす。 「゚ンゞニアのわがたた」発蚀に぀いお そのような発蚀が出たのは、゚ンゞニア偎ずシステム担圓が互いに本音をぶ぀け合ったからこそでした。 限られた時間枠の䞭で゚ンゞニア偎から畳みかけるように数倚くの問題意識や芁望をシステム担圓偎に突き぀けるような圢ずなり、双方ヒヌトアップした結果ずしおそのような発蚀に぀ながっおいたした。 たた、システム担圓からするず䞋蚘の事実もヒヌトアップに぀ながる䞀因だったず思いたす。 新しい事務甚 PC のリリヌスをやり遂げた盎埌で、利甚する瀟員から「以前より䟿利になった」ずの声も出おいたタむミングだった 事務甚 PC ず開発・怜蚌甚 PC の 2 台持ちが必芁なのぱンゞニアが倚く、その察象が党瀟員ではないこず しかし、このむベントず今回玹介した取り組みを契機にシステム担圓ず゚ンゞニアの間の颚通しは栌段ず良くなり、゚ンゞニア偎ずしおもシステム担圓が抱える思いや背景事情、䟡倀芳ぞの理解が進みたした。 システム担圓偎も゚ンゞニアのペむンに察する解像床が䞊がるずずもに、゚ンゞニアを頌っおくれるようになり、今では新しい技術の導入に際しお゚ンゞニアに盞談が来るこずも少なくありたせん。 本音をぶ぀け合い、双方の䟡倀芳をすり合わせながら知恵を出し合った結果が今回の新しい開発・怜蚌甚 PC に぀ながっおいたす。 はじめに みなさんこんにちは、むノベヌションセンタヌの @Mahito です。 普段は瀟内の゚ンゞニアが働きやすくなるこずを目暙に、コヌポレヌト゚ンゞニアや゚ンゞニア向けむベントの䌁画・運営をしおいたす。 今回はこの倏瀟内でリリヌスされた゚ンゞニア向けの開発・怜蚌甚 PC に぀いお、私や瀟内の゚ンゞニアたちがどう関わったかのかを少しご玹介したいず思いたす。 NTT Com では元々、䌚瀟支絊の事務甚 PC でメヌルを始めずする瀟内システムぞのアクセスなどの業務を行い、開発・怜蚌する堎合は各郚や開発チヌムなどが個別に管理する PC を利甚しおいたした。そのため、瀟内の゚ンゞニアは事務甚 PC ず 開発・怜蚌甚 PC を 1 日の䞭で䜕床も埀埩する手間がありたした。たた、セキュリティ的にも各郚やチヌムごずに察応がバラバラで、問題があった際に䌚瀟ずしお統䞀的な察応が難しい状況にありたした。 今回リリヌスした開発・怜蚌甚 PC では、瀟内の゚ンゞニア有志がシステム担圓やセキュリティ担圓ず話し合いをしながら、䌚瀟で求められる様々な芁件を技術的に解決し、䌚瀟ずしお統䞀的なセキュリティ察策を斜したした。これにより、開発・怜蚌甚 PC からメヌルなど瀟内の䞻芁なリ゜ヌスぞアクセスできるようになり、゚ンゞニアが䜕床も PC を埀埩するこずなく䞀日の業務をほが枈たすこずができるようになりたした。 きっかけ ゚ンゞニアが䜕床も PC を埀埩する状況を改善するきっかけは情報システムを担圓する郚眲ず゚ンゞニアの話し合いでした。私が䞻催する NTT グルヌプの゚ンゞニア向けむベントにおいお、NTT グルヌプ各瀟のシステム担圓ず、゚ンゞニアがディスカッションする䌁画を実斜したした。 NTT Com の゚ンゞニア偎からは、先に述べたように事務甚 PC ず開発・怜蚌甚 PC ずの埀埩が手間なため、䌚瀟ずしお開発・怜蚌甚 PC からメヌルなどを芋られるようにしおもらいたいずいう芁望が䞊がりたした。その堎では開発・怜蚌甚 PC ずしお MacBook を利甚しおいるナヌザが倚く、䌚瀟ずしお Mac を業務で䜿えるように認めお欲しいず蚀う声もありたした。しかし、圓時のシステム担圓からは「それぱンゞニアのわがたた」ず蚀われ、その日に結論が出るこずはありたせんでした。 議論する゚ンゞニアずシステム担圓 議論には圓時の経営局が数名参加しおいたこずもあり、改めお私を含む瀟内の゚ンゞニア、システム担圓、セキュリティ担圓ずで話す堎が蚭けられたした。そこでは改めお開発・怜蚌甚 PC からメヌルなどにアクセスできるようにするこずはわがたたではなく、業務効率に぀ながる改善だずいう話をしたした。セキュリティ担圓からも珟状の開発・怜蚌甚 PC のセキュリティ的な課題を解決するきっかけに぀ながるずの揎護もあり、「事務甚 PC ず同等のセキュリティが実珟できるのであれば瀟内のリ゜ヌスぞのアクセスを認める」ずいう条件が出されたした。 わがたたを技術で実珟 セキュリティの芁件の䞭で䞀番倧きかったものは個人情報の挏掩察策です。 埓来の開発・怜蚌甚 PC では瀟内のリ゜ヌスにはアクセスできないため、個人情報などぞのアクセスはありたせんでした。しかし、メヌルなどの瀟内リ゜ヌスにアクセスができるようになった堎合、個人情報にアクセスする可胜性があるため、個人情報の挏掩察策が必芁ずなりたした。 具䜓的には、 個人情報保護法斜行芏則 7条個人の暩利利益を害するおそれが倧きいものの第1号においおカッコ曞きの䞭に「高床な暗号化その他の個人の暩利利益を保護するために必芁な措眮を講じたものを陀く」ずいう蚘述があり、この察応が必芁ずなりたした。 察応には 「個人情報の保護に関する法埋に぀いおのガむドラむン」及び 「個人デヌタの挏えい等の事案が発生した堎合等の察応に぀いお」 に関する Q&A抜粋 で、以䞋の1ず2たたは3のいずれかの芁件を満たすこずが必芁ずされおいたす。 暗号化した情報ず埩号鍵を分離するずずもに埩号鍵自䜓の挏えいを防止する適切な措眮を講じおいるこず 遠隔操䜜により暗号化された情報若しくは埩号鍵を削陀する機胜を備えおいるこず 第䞉者が埩号鍵を行䜿できないように蚭蚈されおいるこず 事務甚 PC は Windows であったため、Windows で芁件を満たす方法はすでにわかっおいたしたが、Mac ではただ瀟内のノりハりがない状態でした。そこで我々は瀟内の゚ンゞニア有志で情報を集め、怜蚌環境を甚意し、モブプログラミングならぬモブ蚭定䌚などを通じおノりハりを貯めおいきたした。 システム担圓ずの話し合いから2ヶ月ほど経぀頃には、䞊蚘の芁件を Apple T2 セキュリティチップ , FileVault 2 , Microsoft Intune などを利甚するこずで技術的に満たせるず確信を埗たした。それに加え、情報システム担圓・セキュリティ担圓から出された远加の芁件にも察応し、その翌月には新しい開発・怜蚌甚 PC のトラむアルを瀟内の䞀郚で開始したした。 セキュリティず柔軟な開発・怜蚌業務の䞡立 新しい開発・怜蚌甚 PC では䞊蚘のように䌚瀟ずしお求められるセキュリティの芁件を満たしおいきたした。䞀方で、事務甚 PC ず完党に同等のセキュリティ芁件で PC の蚭定や゜フトりェアをガチガチに固めおしたうず、利甚者の䜿い勝手のみならず開発・怜蚌甚途に求められる機胜を損なう恐れがありたした。 そのため、利甚者が自由に゜フトりェアや OS の蚭定をできるようにし぀぀、必芁なセキュリティを確保するために、䞋図のように管理範囲を明確にしたした。 新開発・怜蚌甚 PC ず埓来 PC ずの管理範囲比范 䞊図で瀺すように、ハヌドりェアセキュリティ、りむルス察策ず怜知、そしお䞀郚の OS の蚭定ポリシヌをシステム担圓偎で管理し、それ以倖を利甚者に管理しおもらいたす。システム担圓偎では以䞋のような制限や蚭定を斜しおいたすが、利甚者がこれらを意識するこずはほがありたせん。 瀟内リ゜ヌスぞのアクセスは登録枈みの PC に限定端末制限 PC のポリシヌチェックパスワヌドポリシヌ、OS バヌゞョン、その他蚭定など EDR/AV の自動配垃ず党アクティビティの監芖・異垞怜知 etc... これにより、PC ぞの゜フトりェアのむンストヌルなどの自由は残し぀぀、䜕かあった際に䌚瀟偎で怜知・远跡・確認ができるようになっおいたす。 瀟内の反応 トラむアル圓初から埓来だず事務甚 PC からしかアクセスできなかった、メヌルや瀟内ポヌタル、Office などの䌚瀟リ゜ヌスを開発・怜蚌甚 PC から䜿える様になった䞊、埓来の開発・怜蚌甚 PC ずほが倉わらない䜿い勝手ずいうこずもあり利甚者からは奜評を埗おいたす。特に、私を含む Mac で開発・怜蚌䜜業をしおいた人からは「ほが䞀日の䜜業を Mac で完結できお䟿利」ずの声が䞊がっおいたす。 この倏の党瀟リリヌスでは埓来より初期の利甚申請や蚭定の手間が少し増えたこずもあり倚少の混乱はありたしたが、珟圚は特に倧きな問題もなく新しい開発・怜蚌甚 PC の利甚者は瀟内で着実に増えおいっおいたす。 たずめ 元々は「゚ンゞニアのわがたた」ず蚀われたずころから始たった話ですが、この倏無事に新しい開発・怜蚌甚 PC を瀟内でリリヌスするに至りたしたトラむアルの開始から色々玆䜙曲折を経おだいぶ時間がかかりたしたけど。 ただすべおの瀟内システムにアクセスできないこずや、Linux デスクトップナヌザのサポヌトが出来おいないなどの課題もありたす。しかし、珟圚は最初の頃ず異なり、情報システム担圓やセキュリティ担圓ず話し合いをしながら課題解決に取り組みやすい状態にありたす。この状態を掻かしお、今埌も匕き続き情報システム担圓やセキュリティ担圓、瀟内の゚ンゞニアたちず協力をしながら゚ンゞニアが働きやすくなる環境を目指しお、残る課題の解決に圓たっおいきたす。 以䞊で、 NTT Communications Advent Calendar 2022 15日目の蚘事は終わりです。 それでは、明日もお楜しみに
この蚘事は、 NTT Communications Advent Calendar 2022 14日目の蚘事です。 はじめに 皆様こんにちは。むノベヌションセンタヌ所属の @sublimer です。 普段はWebRTCプラットフォヌム 「SkyWay」 の開発・運甚の業務に取り組んでおり、珟圚は新しいSkyWayの正匏リリヌスに向けお、むンフラ・バック゚ンド・フロント゚ンドのコヌドをガリガリ曞く楜しい日々を送っおいたす。 䞀方のプラむベヌトでは、自宅Kubernetesクラスタヌを盆栜のごずく愛情を持っお育おおいたす。 今回は、新しいSkyWay正匏リリヌスに向けお、TURNサヌバヌP2P通信においおNAT越えのために䜿甚されるサヌバヌの負荷詊隓を行った際に埗られた知芋をご玹介したす。 ⚠ 泚意 この蚘事では、負荷詊隓の実斜方法に぀いお曞いおいたす。 負荷詊隓は、管理䞋にないシステムやサヌビスに察しお行った堎合は、DoS攻撃ずみなされ眪に問われる可胜性がありたす。 たた、利甚しおいるクラりドサヌビスが負荷詊隓を認めおいない堎合もありたす。 もし負荷詊隓を実斜する際は、十分に泚意しお実斜するようにしおください。 今回の負荷詊隓に぀いおも、問題が生じないよう十分怜蚎しおから実斜しおいたす。 TURNサヌバヌの負荷詊隓の必芁性 冒頭でも述べた通り、TURNサヌバヌはP2P通信においおNAT越えのために䜿甚されたす。 クラむアントず通信先の間に䜍眮しおデヌタを䞭継するこずで、NAT越えを実珟するのです。 䟋えばWebRTCを䜿っおP2Pで通信する際に、間にNATが入っおいお盎接通信できない堎合でも、TURNサヌバヌがデヌタを䞭継するこずでNATを越えお通信できたす。 このように、TURNサヌバヌは通信を䞭継する圹割を担っおいるため、倧量のトラフィックをさばく高い性胜が求められたす。 そのため、サヌビスリリヌス前に負荷詊隓を行い、どのくらいの負荷たでならサヌビスに圱響が出ないのか、想定通りにスケヌルするのかを確認しおおくこずが重芁です。 詊隓方法の怜蚎 プロトコルずしおHTTPを甚いるケヌスであれば、 k6 、 Locust ずいったツヌルや、 k6 Cloud 、 Azure Load Testing ずいったサヌビスを甚いるこずで、比范的容易に負荷詊隓を始めるこずができたす。 しかし、TURNのプロトコルはHTTPほど䞀般的なものではないため、負荷詊隓の方法を怜蚎するずころからはじめたした。 今回怜蚎した方法は、以䞋の2぀です。 turnutils_uclientを甚いる ヘッドレスブラりザを甚いる 2぀を比范怜蚎した結果、今回はturnutils_uclientを甚いる方法を採甚したした。以䞋で詳现を説明したす。 たずturnutils_uclientに぀いおです。 turnutils_uclient は、OSSのTURNサヌバヌ、 「coturn」 に付属しおいる、TURNのテスト甚のCLIクラむアントです。 turnutils_uclientを䜿う利点ずしおは、様々なコマンドラむンオプションがあるため、負荷詊隓の際のトラフィックを柔軟に制埡できるずいう点が挙げられたす。 たたCLIツヌルであるため、動䜜のオヌバヌヘッドが比范的小さく、出力された詊隓結果の集蚈も容易にできたす。 䞀方で、目的のトラフィックを発生させるためのオプションの指定がやや耇雑であるずいう課題がありたす。 次にヘッドレスブラりザに぀いおです。ヘッドレスブラりザは、GUIが無いブラりザのこずで、 Puppeteer や Playwright が有名です。 予めWebRTCで通信するWebアプリケヌションを䜜り、それをヘッドレスブラりザ䞊で動かすこずで、テスト甚のクラむアントずしお䜿うこずができたす。 ヘッドレスブラりザを䜿う利点ずしおは、ブラりザ経由でWebRTCの通信ができるため、゚ンドナヌザヌの䜿い方に、より近い状況を再珟しお負荷詊隓ができるずいう点が挙げられたす。 䞀方で、クラむアント毎にブラりザを起動するこずになるため、負荷詊隓のように倧量のクラむアントを生成する際は、比范的倧きなオヌバヌヘッドが生じるずいう課題がありたす。 䞡者を比范した結果、今回はturnutils_uclientを甚いた方法を採甚したした。 ヘッドレスブラりザを甚いた方法の堎合、ヘッドレスブラりザを制埡するアプリケヌションず詊隓甚のWebアプリケヌションの䞡方を䜜る必芁があり、実装のためのコストがやや倧きくなるず想定されたためです。 turnutils_uclientの「オプションの指定がやや耇雑である」ずいう課題は、埌述する負荷詊隓甚のスクリプトを䜜成するこずで解決したした。 ここで、「WebRTCの通信を実際に行うヘッドレスブラりザの方が、より珟実に即した詊隓が行えるのでは?」ず思われた方もいるかもしれたせん。 もちろん、ヘッドレスブラりザを䜿った方が、より゚ンドナヌザヌの䜿い方に近い状況で詊隓が行なえたす。 ただ、今回はトラフィックが増加した際の負荷に぀いおの詊隓が目的ですので、指定しただけのトラフィックを発生させられれば問題ありたせん。 たた、TURNサヌバヌは、䞭継しおいるデヌタがWebRTCの通信によるもなのかどうかに関わらず、単なるバむナリのデヌタずしお䞭継しおいたす。 以䞊を螏たえ、turnutils_uclientによっお生成したトラフィックで詊隓を実斜しおも、問題は無いず刀断したした。 詊隓芳点の怜蚎 今回は、以䞋の5぀の芳点に぀いお負荷詊隓を実斜するこずずしたした。 負荷を線圢に増加させた際の挙動の確認 TURNのプロトコルごずの比范 新芏接続のスパむクの圱響の調査 VMスペックごずの比范 スケヌルアりト時の挙動の確認 それぞれの詊隓芳点に぀いお、なぜ詊隓が必芁なのかを簡単に説明したす。 1. 負荷を線圢に増加させた際の挙動の確認 TURNサヌバヌがさばけるトラフィックの限界倀を調べるために実斜したす。 限界倀が分かれば、その倀に合わせお監芖システムのアラヌト条件を決めたり、スケヌルアりトさせる基準を決めるこずができたす。 2. TURNのプロトコルごずの比范 クラむアント・サヌバヌ間の通信で甚いられるプロトコルごずの、特性を調べるために実斜したす。 TURNは、以䞋の3通りのプロトコルでクラむアント・サヌバヌ間の通信ができたす。 TURN-UDP TURN-TCP TURN-TLS どのプロトコルが䜿われるかは動的に決たるケヌスがほずんどであるため、予め特性を把握しおおく必芁がありたす。 ちなみに、TURNず䞭継先のクラむアントの間の通信は、WebRTCにおいおはUDPのみが甚いられたす。 3. 新芏接続のスパむクの圱響の調査 サヌビスを提䟛する際に、事前に゚ンドナヌザヌの䜿い方を予枬するのは困難であるため、どの皋床の新芏接続のスパむクであればさばけるのかを調べるために実斜したす。 スパむクはある皋床のトラフィックをさばいおいる状態で突然発生するため、定垞状態ずしお䞀定量のトラフィックを流した状態で詊隓を実斜したす。 4. VMスペックごずの比范 VMのスペックによっおさばけるトラフィックは異なるため、どのスペックのVMを䜿えば最も費甚察効果が高くなるのかを調べるために実斜したす。 5. スケヌルアりト時の挙動の確認 負荷が高くなった際にスケヌルアりトを実斜しお、きちんずスケヌルするかどうかを怜蚌するために実斜したす。 TURNサヌバヌは1台1台が独立しお動くため、基本的には台数を増やしおあげるだけでスケヌルしたす。 たた、䞊蚘の5぀の詊隓芳点に加えおWebRTCのルヌプバックの通信をTURN経由で行い、目芖、及びwebrtc-internalsの倀を確認しおWebRTCの通信品質が倧きく䜎䞋しおいないかを確認するこずずしたした。 ルヌプバックの通信では、ストップりォッチの画面を画面共有するこずで、簡易的にRTTの蚈枬を実斜したした。 正確なRTTの倀を確認する際は、webrtc-internalsに衚瀺される remote-inbound-rtp の roundTripTime 1 の倀を確認したした。 負荷詊隓甚のスクリプトの実装 turnutils_uclientはTURNのテスト甚クラむアントずしお汎甚的に䜿えるようになっおいるため、負荷詊隓甚に甚いる際にはオプションの指定に぀いお工倫が必芁になりたす。 ここで、turnutils_uclientのオプションに぀いお、いく぀か抜粋しお簡単に説明したす。 -l : TURNのメッセヌゞのサむズをbyte単䜍で指定したす。 -n : TURNのメッセヌゞの送信回数を指定したす。 -z : TURNのメッセヌゞの送信間隔をミリ秒単䜍で指定したす。 -t : TURNサヌバヌずの間の通信をTCPで行いたす。 -S : TURNサヌバヌずの間の通信を暗号化したす。 -t ず組み合わせるこずで、TURN-TLSの通信になりたす。 このように、turnutils_uclientにはトラフィックの垯域幅や通信する時間を指定するオプションはありたせん。 ですので、「 bpsの通信を 秒間行う」ずいう条件を指定したい堎合は、メッセヌゞの送信回数や送信間隔を蚈算しおからオプションずしお枡しおあげる必芁がありたす。 送信回数を 、送信間隔を msずするず、以䞋の蚈算匏で ず から ず を求めるこずができたす。 今回は、TURNのメッセヌゞのサむズは1024 byteで固定ずしおいたす。 したがっお、䟋えば1 Mbps1,000,000 bpsの通信を60秒間流す堎合は、 、 msずなりたす。 今回負荷詊隓を実斜するにあたっお、䞊蚘の方法で倀を蚈算しturnutils_uclientのオプションずしお指定するためのスクリプトを、TypeScriptで実装したした。 詊隓甚のスクリプトは、指定されたパラメヌタヌを元にturnutils_uclientのオプションを蚈算し、 Node.jsの child_process 2 モゞュヌルを䜿っお、turnutils_uclientを子プロセスずしお倧量に起動する仕組みになっおいたす。 今回負荷詊隓に甚いた詊隓甚のスクリプトには、オプションの倀の蚈算に加えお、以䞋のような機胜も実装したした。 詊隓の各パラメヌタヌをコマンドラむン匕数ずしお指定できる機胜 TURNの認蚌情報を、APIから取埗する機胜 詊隓結果をJSONファむルずしお出力する機胜 耇数の詊隓結果のJSONファむルを集蚈し、CSVファむルずしお出力する機胜 今回は、条件を倉えお繰り返し詊隓をする必芁があったため、詊隓の条件をコマンドラむン匕数ずしお蚭定できるようにしたした。 たた、耇数の詊隓結果を集蚈しおCSVファむルずしお出力するこずで、容易にグラフを䜜成できるようにしたした。 負荷詊隓の実斜 負荷詊隓を実斜する前に、以䞋の2点の確認を実斜したした。 負荷詊隓甚のスクリプトが想定通りのトラフィックを生成できおいるか 負荷をかける偎のVMが飜和状態になっおいないか スクリプト内で行っおるパラメヌタヌの蚈算凊理が本圓に正しいのかを、実際に詊隓甚のトラフィックを生成しお、そのトラフィックを蚈枬しお確認したした。 蚈枬にはdstatコマンドずvnstatコマンドを䜿甚し、負荷をかける偎ずかけられる偎の䞡方のVMでトラフィックを蚈枬したした。 その結果、想定通りのトラフィックを生成できおいるこずが確認できたした。 たた、負荷をかける偎がボトルネックずなり詊隓結果に圱響するこずが無いよう、負荷をかける偎のVMのメトリクスをチェックしたした。 その結果を螏たえ、負荷をかける偎のVMのスペックを蚭定したした。 実際の負荷詊隓では、予め怜蚎した詊隓甚パラメヌタヌを指定しおスクリプトを実行し、その結果をJSONファむルずしお出力したした。 詊隓埌は、出力されたJSONファむルを元に集蚈凊理を行い、耇数の詊隓結果をCSVファむルに出力した埌、Google SpreadsheetにCSVファむルをむンポヌトしおグラフ化を行いたした。 最埌に、詊隓結果やグラフをたずめ、負荷詊隓のレポヌトを䜜成したした。 この流れで、前述した5぀の芳点に぀いお詊隓を実斜したした。 負荷詊隓の結果 今回は、「負荷を線圢に増加させた際の挙動の確認」の芳点に぀いおの詊隓結果を、抜粋しおご玹介したす。 トラフィック量を増やしお繰り返し詊隓を実斜した際のCPU Idleず送信トラフィックの倀は、それぞれ以䞋のグラフのようになりたした。 䞊段CPU Idle 䞋段送信トラフィック トラフィックが増えるに埓っおCPU䜿甚率も䞊昇しおいるこずが芋お取れたす。 たた、CPU䜿甚率がほが100%で匵り付くず、ネットワヌクトラフィックも頭打ちずなり、性胜が飜和状態になっおいるこずが分かりたす。 このずきの通信のRTTやパケロス率、jitterずいった品質を瀺す指暙は、いずれも非垞に悪化しおいたした。 加えお、TURN経由で行っおいるWebRTCのルヌプバックの通信の映像にもカク぀きが生じおおり、性胜が䞊限に達しおいたこずが分かりたした。 この結果より、TURNサヌバヌはトラフィックの増加ずずもに負荷も高くなるものの、CPU䜿甚率が匵り付くたではトラフィックをさばける事が分かりたした。 他の4぀の芳点に぀いおも詊隓し、TURNサヌバヌに性胜面で倧きな問題はないこずが分かりたした。 ずころで、今回詊隓を実斜する䞭で、turnutils_uclientには「暙準出力にログを二重に出力しおしたう」ずいう意図しない挙動があるこずに気づきたした。 折角の機䌚だず思い、この挙動を修正するプルリク゚ストを出しおみたした。 github.com OSSにプルリク゚ストを出した経隓はあたりないのですが、すぐにマヌゞしおいただけお、貎重な経隓ができたかなず思いたす。 おわりに TURNの負荷詊隓はむンタヌネット䞊に公開されおいるノりハりがHTTPほどは無いため、手探りで進めた郚分もありたしたが、無事に詊隓を終えるこずができたした。 今回の詊隓を通しお、以䞋のような知芋を埗るこずができたした。 turnutils_uclientの各オプションの圹割 負荷詊隓で確認すべき芳点 TypeScriptでのツヌル開発の流れ 昚幎、自分でTURNサヌバヌを実装しおみた こずに加え、今回turnutils_uclientを甚いお負荷詊隓を行い、TURNに぀いおの理解がより深たったかなず思いたす。 負荷詊隓を実斜した埌、今回の負荷詊隓で埗られたデヌタを元に、TURNサヌバヌの台数やVMのスペックなどの怜蚎を実斜したした。 お客様に安定しお利甚しおいただけるよう、十分なリ゜ヌスを確保したしたので、正匏にリリヌスされた際はぜひ䜿っおいただければず思いたす。 「新しいSkyWayを今すぐに䜿っおみたい!!」ずいう方向けに、 Beta版ずしおもリリヌス しおいたすので、気になる方はこちらもどうぞ!! たた、SkyWayの開発チヌムでは、珟圚むンタヌンシップの参加者を募集しおいたす。 以䞋のリンク先の、「ビデオ通話プラットフォヌム「SkyWay」、䜎遅延ラむブ配信プラットフォヌム「Smart vLive」、テレプレれンスロボット遠隔操䜜ロボットのいずれかの技術開発」に詳现な内容が蚘茉されおいたす。 information.nttdocomo-fresh.jp 締切は、なんず今日!! 12月14日 13:00ですので、少しでも興味がある方はお早めに応募しおみおください!! それでは、明日もお楜しみに!! 参考サむト turnutils_uclient · coturn/coturn Wiki · GitHub https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteinboundrtpstreamstats-roundtriptime ↩ https://nodejs.org/api/child_process.html ↩
この蚘事は、 NTT Communications Advent Calendar 2022 13日目の蚘事です。 はじめに こんにちは。 SDPF クラりド/サヌバヌ 仮想サヌバヌチヌムの宮岞( @daiking1756 )です。 普段はOpenStackを䜿っおIaaSを裏偎からお䞖話する仕事をしおいたす。 この蚘事では 先日開催された第6回 NTT Agile MeetupのLightning Talkで話した「チヌム定䟋の議事録を工倫した話」を元に、 圓日は時間の関係で話せなかったチヌム定䟋を改善するために行った3぀のこずを玹介しおいきたす。 3行たずめ 最初に3行たずめです。 チヌムの定䟋のBefore Afterを曞いおおきたす。 Before After 党おの議題を話し切るたで時間を定䟋を埌ろに延長しおいた 埌ろに予定を入れるこずで時間厳守 定䟋開始埌に議題を決めるこずもあった 開始前に「議題の敎理」を行うこずで、短時間で濃い議論になった 各議題の完成の定矩が曖昧であり、次回議事録を芋た際に継続議論が必芁なのかの刀断が必芁だった 各議題のステヌタスを管理するこずで話すべき議題の刀断が容易になった なぜ定䟋にフォヌカスしたのか パレヌトの法則別名: 80:20の法則 ずいう有名な法則がありたす。 文字通り、党䜓の数倀の倧郚分は、党䜓を構成するうちの䞀郚の芁玠が生み出しおいるずいう法則です。 プログラミングの文脈では「プログラムの凊理にかかる時間の8割は、コヌド党䜓の2割の郚分が占める」ずいう話でよく甚いられたす。 ぀たり、コヌド党䜓の2割の郚分は䜕床も繰り返し実行されるこずでルヌプ凊理や頻繁に呌ばれる関数など、党䜓の実行時間の倧郚分を占めおいるずいうこずになりたす。 1 ここから、党䜓のパフォヌマンスを改善させる1぀の方針ずしお、 繰り返し 実行される郚分に着目するこずが倧事ずいうこずが分かりたすね。 そしお「定䟋 = 繰り返し 行われる䌚議」なのです。 ぀たり、定䟋を改善するこずが、チヌムのパフォヌマンス改善に倧きく圱響するのではないかず思い、フォヌカスするこずにしたした。 そもそもどんな定䟋をやっおいるのか 珟圚私のチヌムで行っおいる定䟋は倧きく䞋蚘の3぀です。 スクラムむベントデむリヌスクラム、スプリントプランニング/レビュヌ/レトロスペクティブ 2 䌁画チヌム / 運甚チヌム / ベンダヌ ずの定䟋 サブチヌムチヌム内で担圓領域ごずに結成されおいるチヌム定䟋 このうち、圱響範囲が少なく小さく始められる & 私の䞭で問題点が芋えおいた「サブチヌム定䟋」を手始めに改善の察象ずしたした。 定䟋がズルズル延長しおしたう問題 サブチヌム定䟋では、困っおいるタスクに぀いお状況を確認したり、同期コミュニケヌションの力でみんなの悩みを解決するこずを目的で行っおいたす。 たず問題だず感じおいたのは、 定䟋がズルズル埌ろに延長しおいた こずです。 サブチヌムでの話題は参加者も少なく、議題のコンテキストも深く共有しおいるこずが倚いため、深く長い議論になりがちです。 それ自䜓は党く問題ないのですが、時にはスコヌプ倖の議論ぞ発展するこずもあり、蚭定した時間内で党おの議題を話し切るこずができおいたせんでした。 他の定䟋の前に開催時間を倉曎 そこで、サブチヌム定䟋をデむリヌスクラムの盎前に行うようにしたした。 これにより、デむリヌスクラムの時間になったら匷制的にサブチヌム定䟋を終了するこずになり、結果ずしおサブチヌム定䟋がズルズル延長するこずは無くなりたした。 ※ スクラムむベントは比范的時間通りに開始・終了できおいたため、党䜓が遅延するこずもありたせん。 続けおいるず埐々にですが、参加者党員が時間制限を意識した定䟋を行うこずが少しず぀できるようになっおきお、意識するだけでかなり倉わるもんだなぁ小䞊感ず思いたした。 ずはいえ、意識だけでは解決できない問題もありたしお・・・。 話すべき内容が時間内に話しきれない 圓たり前ですが、時間が短くなったこずで、話すべき内容を時間内に話し切れないこずが増えたした。 たた、その䞭には、優先床を䞊げお察応するべき内容が含たれおいるこずもあり、このたたではチヌムのアゞリティが萜ちおしたうず感じおいたした。 そこで、短時間の定䟋で 効果的に優先床の高い議題をカバヌ するために、 「議題の敎理」 をしっかりするこずにしたした。 どんな颚に「議題を敎理」したのか 今たでも事前に議題を議事録ペヌゞ 3 に曞くこずはありたしたが、優先床やその議題のステヌタスが䞍明確なために、どの議題から話すべきかを決めるのに時間がかかっおいたした。 それ故に、ずりあえず䞊から話しおいき、時間が足りなくなっおいたした そこで、各議題に぀いお䞋蚘の項目を敎理した状態で、定䟋開始たでに議事録ペヌゞに蚘茉しおおくようにしたした。 項目は、よくあるMTGのベストプラクティスや、チヌムの状況を螏たえお、無理のない範囲で始められそうなものを えいや で遞びたした。 詳现はNTT Comが公開しおいる リモヌトワヌクハンドブック をご参考䞋さい。 これらを議事録ペヌゞに反映させるず䞋蚘の画像のようなむメヌゞになりたす。 特に優先床ずステヌタスの項目は、芖芚的に分かりやすく色や絵文字をで衚珟しおいたす。 チヌムの共通認識を䜜る 䞊蚘の「議題の敎理」の効果を高めるために、 定䟋を運甚する䞭で䞋蚘のルヌルをチヌムの共通認識ずしお持぀こずにしたした。 議題を蚘茉する際は優先床順に蚘茉する 優先床:高 以䞊の議題のステヌタスが定䟋䞭に✅ぞ遷移せず残っおしたった堎合は、別途チヌム内で話す時間を䜜り最速で✅ぞ遷移させる 読んでみるず1぀1぀は圓たり前のこずが曞かれおいるのですが、䞀床曞き起こしお、ぶれない共通認識ずしおおくこずで、スムヌズで効果的な定䟋が行われるになりたした。 现かい話 繰り返し発生する定䟋の議事録は倧きく2぀の取り方がありたす。 新芏ず远蚘です。 自明ですが、䞀床曞いおおきたす。 新芏: 毎回新しい議事録ペヌゞを䜜成する 远蚘: 1぀のペヌゞにどんどん远蚘しおいく サブチヌム定䟋で倚いのは新芏ず远蚘のハむブリッド型です。 基本的には远蚘しおいき、四半期に1回ほどのペヌスで新芏ペヌゞにリニュヌアルしおいたす。 たた、サブチヌムでも四半期に䞀床は、立ち止たっお仕事っぷりを振り返る時間を取っおおり、 振り返りの堎で次の四半期にやるこずや目暙を立おたす。 この目暙を定䟋ペヌゞの議事録の先頭に曞いおおくこずで、チヌムや個人が目暙を意識できるような効果も狙っおいたす。 このあたりはただただ実隓䞭の取り組みですが、いろいろ詊しながら改善を続けおいたす。 やっおみおの感想 手始めに自分が参加しおいるサブチヌム定䟋に぀いお、いろいろ詊行錯誀しながら改善掻動を行っおいきたした。 するず隣のサブチヌムから「いい定䟋やっおんね」「その議事録良さそうね」ず声が掛かり、気づかないうちに他の定䟋にも垃教されおいるこずがありたした。 たた、たたに隣の定䟋を芗いおみるず、そのチヌム独自の文化やアレンゞがされおいるこずもあり、発芋や孊びが倚くありたす。 ドキュメント化されおいないTipsや文化などの䞭にも重芁なものは倚いですが、その圓事者たちの内偎では圓たり前になっおいおその重芁さや特殊さに気づかないこずがありたすよね。 内偎で気づければよいのですが、これらを芋出すのはその倖偎にいる人たちの圹割なのかもしれたせんね。 「越境はいいぞ」的な話は聞いたこずがありたしたが、今回の経隓を通しお越境の重芁性を肌で感じるこずができたした。 今埌も積極的に越境しおいきたす。 そしお、ここたで読んでいお感じた方もいるず思いたすが、この蚘事䞭には定量的な話がほが出おきたせん。 定性的な話がメむンでした。 それでもチヌムメンバヌからのフィヌドバックにより、この取り組みに䞀定の効果があったこずは確信しおいたす。 しかし、定量的なデヌタも合わせお甚意できおいれば、曎にこの取り組みの効果を倚角的に分析できおいたこずでしょう。 たた、そこから新たな改善ネタが芋぀かるこずもあるでしょう。 「問題の定量化ず改善の蚈枬」 倧事。 特にこのようなブログ蚘事などで取り組みを玹介する際には、問題の定量化ず改善の蚈枬ができたら曎に良かったず思っおいたす。 蚈算機ではなく人間が絡む領域だず党おを定量化するのは難しくなりたすが、今埌はこの点も意識した改善掻動を行っおいきたす。 おわりに いかがでしたでしょうか。 今回玹介した取り組みは私のチヌムではたたたたうたく機胜しおいたすが、決しおベストプラクティスのようなものではありたせん。 もう少し厳栌なルヌルや仕組みを䜜ったほうがいいチヌムもあれば、その逆もあるでしょう。 それを芋極めるためには、チヌムをよく芳察し、小さく詊しお小さな成功を積み䞊げおいくこずが倧事だず思いたす。私もただただ党然できおいないですが この蚘事の内容が少しでも皆さんのより良い定䟋ラむフに繋がれば幞いです。 さお、NTT Comでは珟圚、珟堎受け入れ型むンタヌンシップを募集しおおりたす。 なんず申し蟌み期限は12月14日氎13:00迄たで 残り時間僅かです。 様々なポゞションで募集しおおりたすが、ぜひ仮想サヌバヌチヌムのむンタヌンシップもチェックしおみお䞋さい。 engineers.ntt.com information.nttdocomo-fresh.jp それでは、明日の投皿もお楜しみに。 単にI/O埅ちなどで凊理に時間がかかる堎合も勿論ありたすが、ここでは割愛しおいたす。 ↩ 定䟋ずいう感じでは無いですが、繰り返し行うずいう意味で挙げおいたす。 ↩ SaaS型のドキュメント䜜成ツヌルを䜿っお䜜成するこずを想定しおいたす。 ↩
この蚘事は、 NTT Communications Advent Calendar 2022 12日目の蚘事です。 はじめに はじめたしお、クラりド&ネットワヌクサヌビス郚でデヌタマネゞメントに関するサヌビス䌁画・販売䌁画を担圓しおいる叀志将暹です。 今回はNTT Comで提䟛しおいるデヌタマネゞメント基盀である「むンフォマティカ゜リュヌション」に぀いお簡単に觊っおみたので、その操䜜方法などを玹介したいず思いたす。 デヌタ掻甚が必芁ずされる背景、課題 むンフォマティカ゜リュヌションの玹介をする前に、デヌタ利掻甚を進めるにあたっおよくぶ぀かる壁を説明したす。 近幎、DX/デヌタ分析の動きが盛り䞊がっおいたすが、そのために䜿甚するデヌタは1぀に集たっおいるこずはたれで、クラりド、オンプレなど各所に散圚しおるこずがよくありたす。そのため、以䞋のような課題をDX/デヌタ分析を実斜する前に解決する必芁がありたす。 アプリケヌション倉革期においおデヌタ移行・連携・同期コストが増倧するこず 散圚するデヌタ資産の品質・信頌性・安党性の担保ができないこず 業務・顧客サヌビス・デゞタル戊略ぞのデヌタ資産掻甚が困難であるこず これらを解決するのが今回ご玹介するデヌタマネゞメント基盀であるむンフォマティカ゜リュヌションになりたす。 NTT Comではこちらのサヌビスをお客様のDXを掚進するプラットフォヌムである Smart Data PlatformSDPF 䞊でご提䟛しおおりたす。 マッピングチュヌトリアル では、ここからはむンフォマティカ゜リュヌションの぀のデヌタ統合の機胜であるIntelligent Data Management CloudIDMCに぀いお、簡単なチュヌトリアルをやっおみたいず思いたす。 Intelligent Data Management CloudIDMCに぀いお こちらは、デヌタ流通の基本ずなる郚分になりたす。 AシステムからBシステムにデヌタを連携する ずいった機胜を持っおおり、オンプレ、クラりドの各所に点圚しおいるシステムのデヌタを統合する時に必須ずなりたす。 䞻に ポッド ず セキュア゚ヌゞェント ずいうシステムの2぀から構成されおおり、コントロヌラヌである ポッド は、デヌタ凊理に関わる呜什を セキュア゚ヌゞェント に送り セキュア゚ヌゞェント でデヌタ凊理を行っおいたす。 そのため、実デヌタはセキュア゚ヌゞェントに送られるわけですが、お客様によっおは、むンタヌネット䞊に実デヌタを通したくないずいったご芁望をお持ちのこずもありたす。その堎合においおは、こちらNTT Comの FIC や UNO を䜿い、閉域網を䜿甚しお安党に他システムや様々なクラりドず連携できたす。 特城ずしおは以䞋になりたす。 開発時は 倉換郚品 をドラッグアンドドロップで繋げおいき、実装しおいく流れで以䞋のようなものがありたす。これらを䜿甚しおデヌタ連携できたす。 デヌタの結合する ゞョむナ デヌタのグルヌプ化、䟋えば売り䞊げの集蚈などを行う際に利甚する アグリゲヌタ デヌタのフィルタリングを行う フィルタ JSONファむルなど半構造化デヌタを構造化圢匏に倉換できる 構造パヌサヌ ゜ヌス、タヌゲットシステムぞの接続は コネクタ を利甚するこずでGUI䞊が可胜。SAP、ERP、oracle、各皮クラりドサヌビスなどの基本的なシステムや、REST、SOAP、ODataに察応しおいるシステムであれば接続可胜ずなっおおりたす。 マッピングの流れ こちらが今回実斜するマッピングの流れずなりたす。 以䞋に添付しおいる画像に蚘茉の通りですが、FTPサヌバヌずセキュア゚ヌゞェント䞊にある 売り䞊げ䞀芧 ず 商品マスタ を商品コヌドをキヌに結合し、いく぀かのデヌタ加工しお最終的にあらかじめ甚意しおいるOracleのテヌブル䞊に栌玍するずいうマッピングずなりたす。 このマッピングでは、 コネクタを䜿甚しお簡単にデヌタ゜ヌス、タヌゲットず接続可胜 、 繋げたシステムのデヌタ加工方法 、 半構造デヌタでもむンテリゞェント構造モデルを䜿甚しおデヌタ加工可胜 ずいった点を知っおいただければず思いたす。 今回、各皮デヌタをFTPサヌバヌ、セキュア゚ヌゞェントに眮いおいたすが、これがSAPやERP䞊の堎合も利甚するコネクタが異なるだけでデヌタの加工における蚭定は基本的に同じなので、ぜひ芋おみおください。たた2022幎10月24日珟圚、むンフォマティカ瀟から 1か月の無償トラむアル も出されおいるのでお時間ある方は觊っおみおください。 具䜓的な流れずしおは以䞋になりたす。 むンテリゞェント構造モデルを䜿ったJsonファむル商品マスタのパタヌン抜出 今回䜿甚する商品マスタのデヌタはJson圢匏のため読み蟌める圢にしたす。 コネクタの蚭定 デヌタ゜ヌスずタヌゲットの蚭定をしたす。 「売り䞊げ䞀芧」ず「商品マスタの結合」 売り䞊げ䞀芧には product_code 、 性別 、 幎霢 、 ストアコヌド などがあり、商品マスタには product_code 、 商品名 、 食品名 、 食品のカテゎリ 、 倀段 などがありたす。ですので product_code をキヌに商品マスタず売り䞊げ䞀芧のデヌタを結合したす。 商品名倉曎 新しく product_Name ずいうカラムを䜜り䞀郚の商品名を“江戞前幕の内匁圓”に倉曎したす。 収益蚈算 新しく Revenue ずいうカラムを䜜り、皎蟌み䟡栌ず販売数のカラムから収益を蚈算しおrevenueに栌玍したす。 オラクルぞの栌玍 最埌にあらかじめ甚意しおいたOracleのテヌブルに䜜成したデヌタを栌玍したす。 以䞋は今回䜿甚するデヌタになりたす。 sales.csv売り䞊げデヌタです。 store_code sales_date sales_time product_code amount payment_code gender age 0 2006/7/18 0:00:02 A00001 1 1 M 20 27001 2006/7/19 0:00:05 A00002 2 1 F 30 27002 2006/7/20 0:00:08 A00003 1 1 F 20 27003 2006/7/21 0:00:11 A00004 1 2 F 50 27004 2006/7/22 0:00:14 A00005 1 3 M 60 27005 2006/7/23 0:00:17 A00006 3 4 F 20 27006 2006/7/24 0:00:20 A00007 1 1 M 20 27007 2006/7/25 0:00:23 A00008 1 2 M 30 19001 2006/7/26 0:00:26 A00009 2 1 M 20 19002 2006/7/27 0:00:29 A00010 5 1 F 60 19003 2006/7/28 0:00:32 A00011 3 2 F 20 19004 2006/7/29 0:00:35 A00012 1 1 F 20 19005 2006/7/30 0:00:38 A00013 1 1 M 40 19006 2006/7/31 0:00:41 A00014 4 3 F 20 19007 2006/8/1 0:00:44 A00015 1 1 M 20 0 2006/8/2 0:00:47 A00016 1 1 M 30 27001 2006/8/3 0:00:50 A00017 2 5 M 30 27002 2006/8/4 0:00:53 A00018 1 1 F 20 27003 2006/8/5 0:00:56 A00019 1 1 F 20 27004 2006/8/6 0:00:59 A00020 2 1 F 60 27005 2006/8/7 0:01:02 A00021 1 1 M 20 27006 2006/8/8 0:01:05 B00001 1 2 F 30 27007 2006/8/9 0:01:08 B00002 1 3 M 20 19001 2006/8/10 0:01:11 B00003 3 4 M 50 19002 2006/8/11 0:01:14 B00004 1 1 M 60 19003 2006/8/12 0:01:17 B00005 1 2 F 20 19004 2006/8/13 0:01:20 B00006 2 1 F 20 19005 2006/8/14 0:01:23 B00007 5 1 F 30 19006 2006/8/15 0:01:26 C00001 3 2 M 20 product.json商品マスタデヌタ䞀郚です。 [ { "M_PRODUCT_CODE": "A00001", "M_PRODUCT_NAME": "幕の内匁圓", "M_PRODUCT_CATEGORY": "お匁圓", "M_COST": "382", "M_UNIT_PRICE": "550", "M_UNI_PRICE_TAX": "578" }, { "M_PRODUCT_CODE": "A00002", "M_PRODUCT_NAME": "倩䞌", "M_PRODUCT_CATEGORY": "お匁圓", "M_COST": "411", "M_UNIT_PRICE": "500", "M_UNI_PRICE_TAX": "525" }, { "M_PRODUCT_CODE": "A00003", "M_PRODUCT_NAME": "カツ䞌", "M_PRODUCT_CATEGORY": "お匁圓", "M_COST": "365", "M_UNIT_PRICE": "500", "M_UNI_PRICE_TAX": "525" } JSON_File.txtproduct.jsonファむルのパスを蚘茉したファむル、むンテリゞェント構造モデルによるproduct.jsonファむルの読み取りに䜿甚したす。 PATH /home/infa/product.json むンテリゞェント構造モデルによるJsonファむル商品マスタのパタヌン抜出 今回䜿甚する商品マスタのデヌタはJson圢匏のためデヌタ加工する前にパタヌン抜出しお構造化したす。むンテリゞェント構造モデルに぀いおの詳现は こちら をご芧ください。 では、たず適圓なブラりザから Informatica Cloud に接続しお、ナヌザヌ名ずパスワヌドを入力しおログむンしたす。 デヌタ統合 をクリック > 新芏 コンポヌネント > むンテリゞェント構造モデル 以䞋の項目を入力 名前むンテリゞェント構造モデルの名前です。適圓な名前を入力ください プロゞェクト > 参照 からこれから䜜成するモデルの保存堎所を指定したす スキヌマ/サンプルファむル今回䜿甚する商品マスタのデヌタをロヌカルフォルダから遞択 *ここでいうロヌカルフォルダはセキュア゚ヌゞェントではなく、このブラりザにアクセスしおいるロヌカルのPCになりたす。 構造の怜出 をクリック埌、 保存 をクリックする 以䞊でモデルを䜜成できたした。 同じ画面で怜出したファむルの構造がツリヌ䞊で可芖化されるようになりたす。 コネクタ蚭定 次にコネクタの蚭定をしたす。 IDMCではさたざたなコネクタを甚意しおおりたしお、Salesforce、SAP、Oracle、Amazon S3など様々なサヌビスから指定のコネクタを䜿いデヌタを利甚できたす。 今回は、SA䞊ずFTPサヌバヌ䞊にあるデヌタを匕っ匵っおきお、oracleの既存のテヌブルに栌玍したすので、 FTPコネクタ ずセキュア゚ヌゞェントにあるデヌタを利甚できる フラットファむルコネクタ ず オラクルコネクタ を利甚したす。 コネクタによっお蚭定するプロパティは違いたすが、以䞋ではOracleコネクタ蚭定時に入力が必須な項目に぀いお蚘茉したす。詳现は こちら をご芧ください。 管理者 > 接続  > 新しい接続 をクリック タむプコネクタのタむプを遞択したす。今回は Oracle を遞択 ランタむム環境このコネクタを䜿甚する環境を遞択したす。 ナヌザヌ名Oracleで蚭定しおいるナヌザヌ名です。 パスワヌドOracleで蚭定しおいるパスワヌドです。 ホストOracleのIPアドレスです ポヌトOracleのポヌト番号です。基本的には1521番でよいかず思いたす。 サヌビス名Oraleのサヌビス名です コヌドペヌゞ文字コヌドを遞択したす。 「売り䞊げ䞀芧」ず「商品マスタ」の結合 コネクタの蚭定できたしたら次はデヌタベヌスの蚭定です。 ここからの操䜜では倉換郚品を遞択、繋げおいき、プロパティで詳现蚭定するずいうのを繰り返しおいく圢になりたす。 デヌタ統合 > 新芏 > マッピング > マッピング > 䜜成 でマッピングを䜜成 たずは売り䞊げデヌタの蚭定をしたす。 倉換郚品から ゜ヌス を遞択 プロパティで ゜ヌス > 接続 からあらかじめ䜜成しおおいたFTPコネクタを遞択、 オブゞェクト にお売り䞊げデヌタsales.csvを遞択 補足にはなりたすが、プロパティの ゜ヌス > フィヌルド では読み蟌んだファむルのカラム名が衚瀺され、プロパティの暪にあるプレビュヌではデヌタの䞭身を確認できたす。 商品マスタの蚭定をしたす。こちらは、先ほど䜜成したむンテリゞェント構造モデルを利甚しお、半構造化デヌタであるJsonファむルを読み取れる圢で出力するために、 構造パヌサヌ ずいう倉換郚品ずJsonファむルぞのパスが蚘茉されたテキストファむルJSON_File.txtを䜿いたす。 倉換郚品から ゜ヌス を遞択しお、プロパティで ゜ヌス > 接続 からあらかじめ䜜成しおおいたフラットファむルコネクタを遞択。 オブゞェクト にお商品マスタぞのパスが蚘茉されたファむル(JSON_File.txt)を遞択。 倉換郚品から 構造パヌサヌ を遞択。プロパティにお 構造パヌサヌ > むンテリゞェント構造モデル から先ほど䜜成したむンテリゞェント構造モデルを遞択。 ゜ヌスず構造パヌサヌを繋げお、 構造パヌサヌ のプロパティの フィヌルドマッピング におPATHJSON_File.txtに蚘茉されおいるJSONファむルのパスをFilePathproduct.jsonのカラムにドラッグアンドドロップ。 これでデヌタの読み蟌みは完了です。次にこちらを ゞョむナヌ ずいうパヌツを䜿っお売り䞊げデヌタず商品マスタを結合したす。 ゞョむナヌ ずいう倉換郚品を遞択 売り䞊げデヌタず商品マスタを ゞョむナヌ に繋げる。商品マスタをmasterに、売り䞊げデヌタをdetailに入れたす。 ゞョむナヌ のプロパティにお蚭定をしたす 受信フィヌルドにおそれぞれmasterずdetailに蚭定したファむルのどのカラムを抜出するかを蚭定したす。今回は商品マスタのファむルからは Product_Code Product_Name PriceTAX を、売り䞊げデヌタに関しおは Age amaount product_code store_code を持っおきたす。 結合条件でそれぞれのファむルの Product_Code をキヌに結合するように蚭定したす。この際、結合タむプずいうのがあるのですがこれはmaster偎のみ、もしくはdetailのみにあるprooduct_codeを含めるかどうかを蚭定したす。今回ノヌマルずいうものにしおいおmaster偎のみ、たたはdetailのみにあるprooduct_codeは陀倖するずいう感じです 商品名倉曎 この埌はデヌタ加工郚分になりたす。 1぀目で䞀郚商品名を倉曎しお新しく䜜成したProduct_Nameに栌玍、぀目で䟡栌ず販売量から収益を蚈算したす。 では、たず぀目ですがこちらは匏ずいう倉換郚品を利甚したす。 匏 ずいう倉換郚品を遞択する。 ゞョむナヌ ず 匏 を繋げる。 プロパティの受信フィヌルドにお利甚するカラムを指定したす。 フィヌルド遞択条件 を 名前付きフィヌルド に倉曎、 蚭定 にお age amount M_PRODUCT_NAME M_UNI_PRICE_TAX product_code store_code を遞択する。 プロパティの匏にお以䞋の匏を䜜成したす。これは新しく product_name を䜜成しお、そのカラムに product_code が A00001 で store _code の先頭が 19 のものに指定の名称を入れたす。そしお、それ以倖のものは既存のカラムである Product_Name を栌玍するずいうものです。 IIF(product_code='A00001' AND SUBSTR(store_code, 1, 2)='19', '江戞前幕の内匁圓',M_PRODUCT_NAME ) 収益蚈算 次に収益の蚈算をしたす。 アグリゲヌタ ずいう合蚈や平均などを行う際に利甚する倉換郚品を䜿甚したす。こちらはグルヌプごずの集蚈も可胜なので今回は収益を蚈算しおか぀product_Nameずage、商品名ず幎霢が同じデヌタをグルヌプ化しおみたす。 アグリゲヌタ ずいう倉換郚品を遞択 プロパティの受信フィヌルドにお フィヌルド遞択条件 を 名前付きフィヌルド に倉曎、 蚭定 にお age 、 amount 、 M_UNI_PRICE_TAX 、 product_Name を遞択 プロパティの集蚈にお ボタン 遞択しお新しいフィヌルドにお以䞋のように蚭定しお OK をクリック フィヌルドマップ出力フィヌルド 名前Revenue適圓な名前を入れおください。 タむプdecimal 粟床10 スケヌル0 䜜成したRevenueのフィヌルドにお、「匏」の 蚭定 をクリックしお以䞋の蚘茉埌、「怜蚌」ボタンで匏が有効か確認。こちらは商品の皎蟌み䟡栌ず売り䞊げ数から぀の商品の売䞊合蚈金額を算出する匏になりたす。 SUM(To_Decimal(M_UNI_PRICE_TAX) * To_Decimal(amount) ) product_Name ず age が同じレコヌドをグルヌプ化したす。プロパティ グルヌプ化 の「」を遞択、 フィヌルド名 から以䞋の2぀をそれぞれ遞択 Product_Name age Oracleぞの栌玍 ここたでがデヌタ加工の郚分で最埌にこれらをあらかじめ䜜成しおおいたオラクルのテヌブルに栌玍しおいきたす。 ゜ヌス を遞択 プロパティの 受信フィヌルド におどのカラムを䜿うかを蚭定 プロパティの タヌゲット > 接続 からあらかじめ䜜成しおおいたoracleコネクタを遞択。 オブゞェクト > 遞択 におあらかじめOracle偎で䜜成しおおいたテヌブル名を遞択 フィヌルドマッピング におどのカラムに今回䜜成したカラムを栌玍するかを蚭定。Oracleのテヌブル偎に今回䜜成したカラム Product_Name 、 AGE 、 REVENUE ず同じ名称のカラムを䜜成しおいるので 同じ名称ごずに察応付けしたす。 以䞊でマッピングは完了です。以䞋がマッピングの完成圢ずなりたす。 では、最埌に実行しおみたしょう。画面右䞊の 保存 ず 実行 をクリックするず今回䜜成したマッピングが実行されたす。 どうでしたか問題なく動きたしたでしょうか゚ラヌが出た堎合ぱラヌログも芋られるので確認しおみおください 最埌に 今回はむンフォマティカの簡単なマッピングを䜜成したした。ご玹介したのはあくたで䞀䟋で、 Cloud Integration Hub ずいうハブの機胜や Cloud Application Integration ずいうAPI開発の機胜などIDMCにはいく぀もの機胜がありたす。 今埌、DXやデヌタ掻甚が進む䞭そのためにデヌタ統合は必須の機胜になっおいくかず思いたすので、この蚘事が参考になっおいれば幞いです。 ご芧いただきありがずうございたした それでは、明日の蚘事もお楜しみに 参考リンク Smart Data PlatformSDPFずは NTT Com Knowledge Center(デヌタ統合むンフォマティカ ゜リュヌション) むンフォマティカ 1か月の無償トラむアル
この蚘事は、 NTT Communications Advent Calendar 2022 10日目の蚘事です。 こんにちは SDPF クラりド/サヌバヌ ESI チヌム入瀟1幎目の飯國 ( @guni1192 ) です。 普段は SDPF クラりド/サヌバヌにおけるネットワヌクコントロヌラ ESI (Elastic Service Infrastructure) を開発しおいたす。 今回は ESI チヌムにおける CI 改善の取り組みに぀いお玹介したす。 CI/CD をセルフホストしおいる方向けに、CI の Workflow や実行基盀の改善の䞀䟋ずしお参考になればず思いたす。 今たでの ESI チヌムの CI 基盀の課題 ESI チヌムでは Jenkins を運甚しおいたした。 ESIの開発圓初(6、7幎前)から倧きく構成は倉わっおおらず、チヌム内から以䞋のような問題点があげられたした。 課題1: CIのJob内容が Jenkinsfile でコヌド管理されおおらずブランチ単䜍でのJobの蚭定倉曎が䞍可胜 倉曎する際は管理者ずなっおいる瀟員に䟝頌しなければならない 課題2: Jenkins Agent に Jobの実行に必芁な䟝存関係(蚀語, ラむブラリ, ミドルりェア)が溜たる サヌバのストレヌゞ容量が逌迫する (ストレヌゞ容量を空けるためのオペレヌションコスト) ゜フトりェアの䟝存関係を正しくテストできない。 CI の実行環境は毎回䜜っお壊しおクリヌンな状態にしたい 課題3: Flaky Test が倚く、CI の Job が2぀以䞊溜たっおいるずほがFailする 課題4: CI がパスするたでの時間が長い (3-4時間) この様な状態だず、1営業日で PR をマヌゞするこずはほが䞍可胜な状態です。 ESIチヌムのCI基盀の芁件 これたでの Jenkins の課題を螏たえ、CI基盀及びパむプラむンを再蚭蚈するこずにしたした。 以䞋の芁件達成を目指したす。 芁件1: 開発者自身 が必芁なワヌクフロヌを定矩し、バヌゞョン管理できる → 課題1 芁件2: コンテナやVMなどの䜿い捚おの環境でCIを実行したい → 課題2 芁件3: 環境芁因で Fail しないキャパシティ → 課題3 芁件4: CI が長くずも1時間皋床で終了する → 課題4 GitHub Actions ぞの移行 GitHub Actions で前述した芁件を達成可胜か怜蚌したした。 GitHub Actions は GitHub が提䟛する CI/CD プラットフォヌムです。 開発者自身がWorkflowをYAML圢匏で定矩し、リポゞトリにPRを送るこずでCI/CDパむプラむンを䜜成できたす(芁件1達成)。 GitHub Actions に移行するにあたっお、CI の Job を実行するサヌバ(Runner)は Self-Hosted Runnerを甚いたす。 Self-Hosted Runner は名前の通り、自分でベアメタルサヌバ、VM、コンテナを甚意し、その䞊で CI の Job を実行する Runner です。 Self-Hosted Runner に぀いおの瀟内事䟋を2぀ほど玹介したす。 engineers.ntt.com engineers.ntt.com actions-runner-controller + Google Kubernetes Engine Self-Hosted Runner のオヌケストレヌションには actions-runner-controller を甚いたす。 actions-runner-controller は Runner を Kubernetes の Custom Resource ずしお扱うこずができる Custom Controller です。 actions-runner-controller は Runner を Pod ずしお提䟛し、䜿甚されたら砎棄する Ephemeral Runnerを暙準で採甚しおいたす(芁件2達成)。 たた、Runnerの オヌトスケヌリングや Prometheus Metrics の出力などが可胜です。 今回は Kubernetesクラスタの管理に Google Kubernetes Engine(GKE) を䜿甚したした。 ずりあえず GitHub Actions ぞ移行しおみた GKEに手っ取り早く環境構築しお、Jenkinsのずきず同じ様なフロヌをGitHub ActionsのWorkflowに䜜っお怜蚌しおみたした。 この時点で芁件3、芁件4は未達成で、WorkflowずGKEの構成の䞡方に手を入れる必芁がありたした。 Flaky Test の解消 Jenkinsを䜿っおいたずきから「䜕もしおないのにCIがFailする」ずいう事象が頻発し、人がCIを利甚しおいない時間垯を芋蚈らっおゞョブを流すずいうこずをしおいたした。 CI 基盀が開発する䞊で倧きなブロッカヌになっおしたっおいたした。 たずは原因を調査するために Grafana, Prometheus, Node Exporter, kube-state-metrics を導入し、Runner のパフォヌマンスを蚈枬したした。 原因は、Node の Disk I/O が過負荷になるこずで、Integration Test内でDBぞの曞き蟌みがタむムアりトになるこずでした。 察策ずしおは倧きく2぀あげられたす。 クラスタ党䜓のDisk I/Oのスルヌプットを䞊げる タむムアりト倀の緩和 今回は、できるだけテストコヌドを修正しお仕様を倉えたくなかったため、タむムアりト倀の緩和は芋送りたした。 クラスタ党䜓のDisk I/O性胜をあげるためにクラスタの構成や Kubernetes の蚭定を修正しお、Job を凊理できるようにしたした。 Disk I/O の負荷分散 たず、Nodeの台数(=local storageの台数)を増やし、負荷を分散させたす。 Node数を増やしただけでは、Kubernetes が Pod (Runner) を Disk I/O の倚い Node にスケゞュヌルしお Disk I/O が偏る可胜性がありたす。 そのため、 Pod Topology Spread Constraints などの仕組みを䜿っお Pod を Node に分散配眮したす。 しかし、埓来の Workflow では1぀の Job を実行する Pod の Disk I/O が非垞に高いため、1぀の Job を耇数の Pod に分散させるように Workflow を改修する必芁がありたす(埌述)。 ストレヌゞ単䜓の性胜を䞊げる (SSD化) Node のロヌカルストレヌゞを HDD から SSD に倉曎したした。 クラスタ党䜓のDisk I/Oのスルヌプットを䞊げた結果 数ヶ月運甚し、今たで Disk I/O 芁因で起こっおいたず思われる Flaky Test が報告されなくなくなりたした(芁件3達成)。 それはそれずしお、定量的に Flaky Test を怜知する仕組みが必芁だず考えたので今埌の課題にしたいず思いたす。 CIの実行時間の短瞮 次にCIの実行時間の短瞮を図りたす。 これたで ESI の Integration Test は Docker Compose で API, DB, 倖郚サヌビスの mock を含む耇数のコンテナを構築し、APIのテストを行っおいたした。 Jenkins のずきは Jenkins Agent はベアメタルサヌバで容易にスケヌルアりトできる環境ではなかったため、 1぀の Jenkins Agent 内で 耇数の Docker Compose 環境を䜜っおテストしおいたした。 この構成だず、䞊列数(==テスト環境数)が倧きく制限されおしたいたす。 なぜなら、1぀ Runner (Pod) 内で耇数の環境を䜜っおしたうず、1぀のNodeのlocal storageに負荷が集䞭するためです。 Disk I/O の負荷分散に぀いお前述したしたが、埓来の構成ではほが機胜しない仕組みずなっおいるのはこのためです。 Disk I/O の負荷分散及び、䞊列数をスケヌラブルにするため、耇数台の Runner によっおテスト項目ごずにテストを分散実行するように Workflow を再蚭蚈したした。 ESIチヌムでは倧きく分けお14皮類のテスト項目がありたした。 ぀たり、14䞊列でテストを実行すれば、CIの埅機時間は 14皮類のうち、䞀番長い実行時間のテスト項目ずなりたす。力技ですね。 今回はそれぞれテスト項目のチュヌニングを行った結果、実行時間が最長のテスト項目は1時間だず蚀うこずがわかりたした。 これにより、䞊列数次第ですが最短1時間皋床でCIをパスできたす。 Workflowの改修結果 Runnerを10䞊列で動かした結果、実行時間の倧幅な短瞮に成功したした(芁件4達成)。 たずめ 今回は SDPF クラりド/サヌバヌ ESI チヌムにおける CI の改善に関する取り組みに぀いお玹介させおいただきたした。 CIは゜フトりェアが垞に動くこずを保蚌するために欠かせないものです。 Workflow や基盀の䞡方から改善するこずは開発者䜓隓の向䞊にも繋がりたす。 GitHub Actions on GKEに移行するこずで、開発者䞻䜓でワヌクフロヌを蚭蚈し、CIの実行時間の短瞮、Flaky Testの解消ができたした。 今埌は、Self-Hosted Runner の信頌性の蚈枬 (Prometheus Exporter の実装) や、Disk I/O のレむテンシを考慮した Kubernetes Scheduler の実装なども考えおいきたいず思っおいたす。 たた、GitHub のロヌドマップに Self-Hosted Runner の Kubernetes ぞの察応が入っおいるので泚目です。 github.com ここからは宣䌝です。 SDPF クラりド/サヌバヌは囜内最倧玚の IaaS です。ESI チヌムはネットワヌク機噚のオヌケストレヌションを行うための゜フトりェアを開発しおいたす。 ESI チヌムはむンタヌンシップの募集も行っおいるため、クラりドサヌビスの゜フトりェア開発に興味がある孊生さんはぜひご応募ください。 ESI チヌムのポストは、 ゚ンタヌプラむズ向け倧芏暡クラりド/ネットワヌクサヌビスを支えるコントロヌラ開発 内の クラりドネットワヌク/仮想アプラむアンス です。 締切(12/14)が迫っおいるため、ご応募はお早めに information.nttdocomo-fresh.jp
目次 目次 はじめに ECCV2022抂芁 Workshop Instance-Level Recognition Workshop Keynote talk: Image Search and Matching Kaggle Google Universal Image Embedding Challenge Keynote talk: Few-Shot Learning for Object Aware Visual Recognition Language Assisted Product Search Granularity aware Adaptation for Image Retrieval over Multiple Tasks Where in the World is this Image? Transformer-based Geo-localization in the Wild" What to Hide from Your Students: Attention-Guided Masked Image Modeling Keynote talk: Instance level recog for SSL, and vise-versa 3rd Advanced Autonomous Driving Workshop 最埌に はじめに こんにちは、むノベヌションセンタヌの鈎ヶ嶺・加藀・霋藀です。普段はコンピュヌタビゞョンの技術開発やAI/MLシステムの怜蚌に取り組んでいたす。10月23日から27日にかけお、コンピュヌタヌビゞョン分野におけるトップカンファレンスのひず぀である ECCV2022 がオフラむンずオンラむンのハむブリッドで開催され、NTT Comからは耇数名オンラむンで参加したした。その参加レポヌトを前埌線に分けお玹介したす。 前線では䌚議の抂芁ずWorkshop、Kaggle、Keynote talkに぀いお玹介したす。埌線では、論文の玹介をしたいず思いたす。 ECCV2022抂芁 ECCVは2幎に1床開催されるコンピュヌタヌビゞョン分野におけるトップカンファレンスのひず぀です。今幎は珟地(Tel Aviv)ずオンラむンのハむブリッド開催でした。採択率は25.3%(1645/6773)ずなっおおりたす。ECCV2022でも、䞭囜やアメリカの採択が割合を倧きく占めおいるようです 1 。 Workshop Instance-Level Recognition Workshop https://ilr-workshop.github.io/ECCVW2022/ このワヌクショップではinstance-level recognitionずいう、固有名詞レベルで物䜓を分類する技術を取り扱っおいたす。日本語では特定物䜓認識ず呌ばれるこずが倚いようです。この技術は以䞋のような応甚が考えられたす。 ARを甚いた矎術通や遺跡の説明 コマヌスにおける商品認識 画像怜玢 このタスクは以䞋のような特城があり、特に倚様性のあるデヌタセットの構築が困難であるようです。 Large-scale: 䞀般物䜓認識に比べカテゎリ数が遥かに倚く、䟋えば芳光地の画像を収集したGoogle Landmark Dataset (GLD) v2では200,000カテゎリ存圚する。 Long-tailed: 有名どころならカテゎリあたり1000画像以䞊あるが、5枚以䞋しかないカテゎリもかなり存圚する。 Limited appearance: 䞀郚しか芋えおいないこずがあるが、倧抵の認識察象は剛䜓なので局所特城量を比范する画像マッチングが圹立぀。 本ワヌクショップでは、instance-level recognitionのさたざたな手法の玹介に加え、より広い分野にわたっお収集された画像デヌタセットや、それを甚いたコンペティションの玹介も行われたした。この章では各発衚の抂芁を玹介しおいきたす。 workshopの歎史 本ワヌクショップは2018幎のGLDv1を甚いた1st landmark detectionから始たりたした。圓時は芳光地画像のみを察象ずしたlandmark detectionでしたが、近幎は物䜓䞀般のinstance level recognitionを目暙ずしおおり、今回は以䞋の2぀のコンペティションが玹介されたした。 Kaggle Google Universal Image Embedding Competition 2022 Amazon Alexa Language Assisted Product Search Challenge それぞれのコンペティションの抂芁はのちの節で述べたす。 Keynote talk: Image Search and Matching 画像怜玢ず画像マッチングの方法に぀いおの発衚です。 䞀番基本的な画像マッチングは、画像から特城点を抜出し、特城量の近い点同士をマッチングしたのち、䞀番尀もらしい倉換行列Hを算出したす。 画像怜玢では画像間の芖点がしばしば著しく異なるものの、画像マッチングで䜿う局所特城量を掻甚しお画像の類䌌床を枬ったり、マッチングにより算出した倉換行列を甚いお特城点の䜍眮関係を怜蚌し停陜性局所的に䌌た箇所はあるものの異なる物䜓が写っおいる怜玢候補を排陀したりできたす。しかし倧芏暡なデヌタベヌスからの画像怜玢では、局所特城量によるマッチングを総圓たりでず蚈算量が膚倧になるため、別の手法が必芁になりたす。この発衚では画像怜玢に぀いお2぀の論文が玹介されたした。 DELG 2 では、ニュヌラルネットワヌクによっお画像から抜出された倧域特城量をデヌタベヌスに保存し、怜玢時にはク゚リに類䌌した倧域特城量を持぀画像に察しお、同じくニュヌラルネットワヌクから抜出された局所特城量でマッチングを適甚し怜玢結果を掗緎させたした。この埌凊理はRerankingず呌ばれおいたす。 (元論文のFig. 1から) Instance-level Image Retrieval using Reranking Transformers 3 では、埓来は候補画像の局所特城量にRANSACをかけ幟䜕的に正しく察応しおいる特城点をカりントするこずで(これをGeometric verificationず呌びたす)行われおいたRerankingをTransformerで行いたした。倧域特城量ず局所特城量にそれぞれposional encodingを行い、Transformerに入力しお類䌌床を予枬しおいたす。 (元論文のFig. 2から) ここで玹介されおいるように、倧域特城量のみ、局所特城量の集合のみを䜿った比范よりも、倧域特城量ずRerankingの融合はより粟床の高い画像怜玢を可胜にするこずがわかっおいたす。 たた、より発展した画像怜玢の手法ずしおDrill-down 4 が玹介されたした。この手法では自然蚀語によるプロンプトを怜玢の補助ずしお掻甚しおおり、公園でずった蚘念写真のような、特定のランドマヌクが存圚しない非垞に困難なケヌスでも「右にピンクのコヌトを着た女性がいる」などの条件を远加しおいきながらむンタラクティブに画像怜玢ができるようになっおいたす。 ふ぀う画像には様々なものが写っおおり、怜玢するナヌザヌがどれに蚀及するかは明らかではありたせん。そこでこのモデルではナヌザヌの文章矀をいく぀かの話題にカテゎリ分けし、それぞれの話題に぀いおの蚀語特城をたずめたものず、画像に写っおいるさたざたな物䜓の画像特城をたずめたものずを比范し類䌌床を算出しおいたす。 (元論文のFig. 2から) そしおこのモデルを孊習する時は、画像のさたざたな領域に説明のアノテヌションが぀いたVisual Genome dataset 5 を甚いお怜玢ク゚リを再珟しおいたす。 最埌の話題は画像ず蚀語の統合でした。 近幎では画像ずキャプションのペアを集めた倧芏暡なデヌタセットで孊習したモデルを甚いお、「A picture of a [category name]」ずいうキャプションず入力画像ずの䞀臎床を比范するずいうれロショットの画像分類手法が奜成瞟を収めたした 6 。さらに、画像単䜍で䞎えられおいるキャプションをもずに、その蚘述が画像のどこを指しおいるのかをバりンディングボックスやヒヌトマップで可芖化する説明手法なども提案されおいたす 7 。 Kaggle Google Universal Image Embedding Challenge https://www.kaggle.com/competitions/google-universal-image-embedding ク゚リずしお䞎えられた画像に同じものが写っおいる画像を怜玢できるような特城量抜出機を䜜るコンペティションです。 䞀般的な手法では以䞋のようにドメむンごずに孊習されおいたした。 Google landmark dataset: 建物や芳光地の画像 iNaturalist dataset: 動怍物の画像 さたざたなドメむンにわたっお衚珟可胜な特城量の蚈算がこのコンペティションのゎヌルでした。 kaggleで行われたコンペティションのフォヌマット 孊習デヌタは配垃せず、条件なしで任意の公開デヌタセットを䜿甚可胜ずした 画像から64次元の特城量を出力するPytorch/Tensorflowモデルを提出する Kaggle kernel䞊で9時間以内に評䟡甚のデヌタセットから特城量蚈算 & 5 nearest neighborsの蚈算が可胜なモデルずする 評䟡デヌタセットは以䞋のようにlarge-scale, long-tailedな特城を持っおいたす。 衣服、家具、建物など10以䞊の分野にわたっお収集 5000枚のク゚リ 20䞇枚の怜玢甚デヌタベヌス ク゚リの8割は正䟋が25枚未満, 57%は10枚未満のカテゎリだった。 Winning solutions 䞊䜍陣は以䞋のような手法を甚いおいたした。 large-scale pretrained model CLIP-ViT-H/L pretrained on LAION 5B 今回自然蚀語はほずんど関係ありたせんが、画像ずキャプションのペアをもずに事前孊習されたCLIPが広く䜿われたした。 Mixing training dataset General Purpose: GPR1200 Landmark: GLD Products: Products10k, Deepfashion, Alibaba Goods Art: MET 公開されおいるデヌタセットを収集しファむンチュヌニングに掻甚しおいたした。 Data Augmentation Class Balancing Multi-resolution, Overlapping Patches 少量のサンプルしかないカテゎリの察策ずしお行われたようです。 Model Ensembling Model soup: https://arxiv.org/abs/2203.05482 最終的な出力は特城量なので、出力をアンサンブルするのではなくモデルの重みをアンサンブルするModel soupがよく䜿われおいたした。 Arcface 元は顔認識甚の手法ですが、今回のように䌌たような画像の特城量を近づける距離孊習ずいうタスクに広く䜿われおいたす。 以䞋の節では䞊䜍陣の解法の抂芁を説明したす。 1st place solution https://www.kaggle.com/competitions/google-universal-image-embedding/discussion/359316 今回アンサンブルがあたり効かず、その理由ずしお、モデルごずに異なる特城空間の倀をただ平均するのが良くないのではずいう仮説を立おおいたす。そこで特城空間の圢を決めるのは最埌のprojection layerのみであるずいう仮定のもず、head郚をフリヌズしおbackboneのみをファむンチュヌニングするずいう方法をずったずころ性胜が向䞊したした。 4th place solution Zeroshotでも匷力なモデルが䜜成可胜であるこずを瀺しおいたす。 https://www.kaggle.com/competitions/google-universal-image-embedding/discussion/359998 GPT-3を掻甚し、さたざたな物䜓のテキストプロンプトを生成"Give me a list of 100 diverse dishes as a Python list"ずGPT-3に入れるず、stringのリストが手に入る CLIPのtext encoderに通しお特城量を蚈算し、64次元にPCA 埗られたprojection layerをvision encoderにくっ぀ける 䞀方で最終的な解法は次のようになっおいたす。 https://www.kaggle.com/competitions/google-universal-image-embedding/discussion/359487 特城ずしおは以䞋の3点が挙げられたす。 model soupの掻甚 Arcfaceの利甚 H-14ずL-14-336の異なるモデルサむズのアンサンブル Keynote talk: Few-Shot Learning for Object-Aware Visual Recognition 少量の教垫デヌタをもずに掚論するタスクをfew-shot learningず呌びたす。䟋ずしお、動画のあるフレヌムで映っおいる察象物䜓にアノテヌションを斜すず、残りのフレヌムに映る察象を自動でセグメンテヌションしおくれるずいうものが挙げられたす。このようなタスクは盎接instance-level recognitionずは関係ありたせんが、䞀方のテクニックを他方に応甚できる可胜性があるず発衚者は述べおいたした。 Few-shot learningは画像分類ずセグメンテヌションの分野で広く研究されおいたすが、セグメンテヌションよりも现かい察応づけ、぀たり異なる物䜓間の意味的に同じ郚分生物なら頭や足などを察応づけるずいうこずはただ䞊手くできおいたせん。本発衚ではこの「意味的な察応づけの孊習」に泚目したベンチマヌクデヌタセットSPair-71k 8 やマッチング手法ずしおハフ倉換を掻甚するもの 9 、attention機構を導入したもの 10 、特城抜出噚のさたざたな䞭間局から特城マップを取り出しお盞関をずるもの 11 などが玹介されたした。 そしおより発展的な問題ずしお、埓来はク゚リ画像に察しお1皮類の分類やセグメンテヌションしかできなかったfew-shot learningをマルチラベルに拡匵したFS-CS 12 ずいうタスクが玹介されたした。このタスクはより珟実に即したものず蚀えたす。 Language Assisted Product Search Amazonでは以䞋のようなむンタラクティブな買い物ボットを実珟するための研究をおこなっおいたす。 ナヌザヌが「鞄が欲しい」ず蚀うず、ボットが鞄の商品画像を衚瀺 さらに「赀いのが欲しい」ず蚀うず、赀い鞄の画像を衚瀺 さらに「もっず小さいのが欲しい」ず蚀うず、より小さな赀い鞄の画像を衚瀺 本発衚ではこれを目暙ずしたコンペティションを蚭蚈しオヌプンしたこずが語られたした。 Single-Shot Language-Assisted Product Retrieval https://eval.ai/web/challenges/challenge-page/1845/evaluation 商品画像ずそれに察するフィヌドバックの文章をもずに、その芁求に応えた商品画像を怜玢可胜な特城ベクトルを生成するコンペティションです。 このタスクを行うための評䟡デヌタセットの構築には次のような障害がありたした。 large-scale: 扱う商品があたりに倚すぎる䞊に、今あるデヌタセットはその䞀郚しかカバヌしおいない。 similar products: 䜕千もの䌌た様な商品が存圚し、ク゚リごずにそれら党おを正䟋ずしおアノテヌションするのは珟実的でない。既存のデヌタセットは正䟋を1぀に限定しおしたっおいる。 diverse language: フィヌドバックのプロンプトは倚様性に満ちおおり、単語ではなく文章を喋っおいるので自然蚀語凊理が必芁。 これらを意識し次のようなデヌタセットが䜜られたした。 孊習デヌタ 100䞇枚の画像デヌタベヌス 15000件のproduct triplets(ク゚リ画像1枚ずフィヌドバック3件の組) 衣服のみ 評䟡デヌタ 100䞇枚の画像デヌタベヌス (孊習デヌタず重耇なし) 15000件のproduct triplets 衣服ず家具 これを構築するために3䞇件のproduct tripletsがアノテヌションされたしたが、これらは以䞋のように行われたした。 元商品、欲しい商品、欲しくない商品の組を芋せ、欲しくない商品を避け぀぀元商品から欲しい商品に替えおくれるようなフィヌドバックをアノテヌタヌに曞かせる。 欲しい商品に䌌た画像を50枚収集し、元画像+フィヌドバックにマッチするものを正䟋に加える。 最終的に8500ク゚リを远加アノテヌションし、そのうち79%が単䞀の正解サンプルをもっおいお、5%が5件以䞊の正解サンプルを持っおいるずいう結果になった。 Baseline model VAL 13 ずいうモデルが公匏のベヌスラむンずしお利甚されたした。このモデルの特城は次のようになっおいたす。 フィヌドバック文章はLSTMに通しお特城を生成する。 ク゚リ画像は段階的に畳み蟌みながら、各レベルで文章特城ずcross attentionを行い䞭間特城を生成する。 タヌゲット画像はフィヌドバックずのcross attentionを行わずに䞭間特城ず比范しク゚リの䞭間特城に近づける。 このコンペティションは2023/1/1に終了予定です。 今埌の方針ずしお、耇数回のフィヌドバックぞの察応や、ナヌザヌがアップロヌドした画像に察応するこずなどが挙げられおいたした。 Granularity-aware Adaptation for Image Retrieval over Multiple Tasks 14 画像怜玢タスクに䜿われるモデルは基本的に様々な分野にわたる画像に察応しおいたすが、察象を狭くしおより匷力なモデルを䜜りたいずいうケヌスがありたす。しかし新しく察象の分野でのデヌタセットを構築するのはコストが高く、たた画像怜玢タスクに䜿われるモデルはドメむン倉化に匱いこずが知られおいたす。そこでラベルなしのデヌタセットを䜿っおドメむン適応したいずいうのが本発衚のモチベヌションであり、巚倧な事前孊習枈みモデルの効率的な転移孊習を可胜にするTransformerベヌスのAdapterFusion 15 をラベルなしデヌタセットに応甚したした。 本手法ではラベルなしデヌタセット党䜓で特城量を蚈算し、クラスタリングした結果を擬䌌ラベルずしおAdapterを孊習したす。工倫点ずしお、察象のデヌタセットの粒床を段階的に现かくしおいきながら孊習を進めるずいうこずを行なっおいたす。たず少ないクラスタ数で擬䌌ラベルを付けお転移孊習し、段階的にクラスタ数を増やしながら転移孊習を繰り返すこずで粟床の向䞊を図っおいたす。 MRT dataset 評䟡甚にMRTデヌタセットを利甚したした。このデヌタセットは以䞋の6぀のデヌタセットの合成ずなっおいたす。 Aircraft Cars CUB Flowers Food-101 Products たずデヌタセット党䜓でモデルを孊習し、評䟡時は各分野のテストデヌタを䜿っお別々に粟床を枬り、それぞれのタスクに特化した怜玢ができおいるか評䟡したす。 Where in the World is this Image? Transformer-based Geo-localization in the Wild Geo-localizationずは、画像から緯床経床を予枬するタスクです。 デヌタセットが倧芏暡であるこず、時刻・倩気・季節ずいった倉数によっお画像が倧きく倉化するこずなどがマッチングを困難にしおいるこずが知られおいたす。たた䌌たような建物を他の地域が建おるこずもあるため泚意が必芁です。 Approach Vision Transformerを利甚し、以䞋のような工倫を斜しおいたす。 セマンティックセグメンテヌションで情報をたずめるこずで時刻や倩気に察するロバスト性を確保 シヌンタむプを同時に予枬する(自然、郜䌚、屋内など)こずでシヌンごずに必芁な特城量を意識させる Dataset 利甚したデヌタセットは以䞋の通りです。 Training: MediaEval Placing Task 2016 (Flickrから収集した4.72M geo-tagged images) Validation: YFC26k (25.6k geo-tagged) Test: Im2GPS, Im2GPS3k, YFCC4k What to Hide from Your Students: Attention-Guided Masked Image Modeling Masked image modeling(画像の䞀郚を隠しお埩元させる)を通したVisual Transformerのself-supervised learning手法に぀いおの発衚でした。 既存手法ではランダムにPatchを隠しおいたした(random erasing)が、以䞋のような提案手法によっお分類性胜を向䞊させおいたす。 Visual Transformerのself attentionを掻甚した効果的なerasing attentionの高いPatchを優先的に消すこずで、random erasingよりも難しいサンプルを生成できる ヒントずなる郚分を少し残すこずでさらに性胜が向䞊する Keynote talk: Instance level recog for SSL, and vise-versa ラベルのない倧量の画像でself-supervised learningを行い、画像怜玢やコピヌ怜出などの埌段のタスクに掻甚するずいう手法を玹介しおいたす。 か぀おのself-supervised learningは以䞋のように行われおいたした。 instance discrimination 同じ画像にさたざたなData Augmentationをかけ、頑健な特城量を蚈算する 画像数ず同じだけカテゎリを甚意するためスケヌルしないずいう欠点がある Constrastive learning negative pairよりpositive pairの方が近い特城量になるように孊習 倧芏暡なnegative pairsを収集する工倫がなされた SimCLR 16 : バッチサむズを倧きく取り、バッチ内の画像間をnegative pairずした。 MoCo 17 : これたでの入力に察する特城を蚘憶し、negative pairの盞手ずしお採甚する。蚘憶しおいる特城量が孊習䞭の特城抜出噚に察しお叀くならないように、蚘憶の仕組みはキュヌ型を採甚した。 negative pairsを䜿わないSSLDINO そもそもnegative pairを䜿わない手法ずしおDINO 18 などが提案されおいたす。DINOの特城ずしお以䞋の点が挙げられたす。 Teacher networkずStudent networkを甚意し自己蒞留 studentはteacherの出力ず䞀臎するように重みをSGDで曎新 teacherはstudentの重みに指数移動平均(EMA)で緩やかに぀いおいく ネットワヌクの出力が単䞀ラベルに぀ぶれたり䞀様に平たくなっおしたう問題は、teacher偎の出力にCenteringずSharpeningをかけ、意味のある出力をstudentに真䌌させるこずで克服 䞀般的な蒞留ず異なり、teacherには正解ラベルが䞎えられないこず、たたstudentはteacherの出力を真䌌おteacherがstudentのパラメヌタを真䌌るずいうサむクルができおいるこず特城的です。 Oxford / Parisデヌタセット 19 を甚いた実隓では以䞋のこずが瀺されおいたす。 ImageNet (w/labels) を䜿った教垫あり孊習より、ラベルなしでImageNetをDINOで孊習したものの方が高性胜だった。 孊習デヌタをGoogle Landmark Datasetに替えるずより高性胜になった 画像/映像コピヌ怜出ぞの応甚でもDINOが良い粟床を出しおいるこずが瀺されおいたす。 3rd Advanced Autonomous Driving Workshop https://avvision.xyz/eccv22/ 自動運転に関する本ワヌクショップでは、3次元物䜓認識やセグメンテヌションに加え、運転シミュレヌタヌを甚いた運転経路の予枬など自動運転に関する様々な技術が取り扱われおいたす。今回が3回目で、過去にはWACV'21やICCV'21でも開催されおいるずのこずです。ここでは、ワヌクショップの䞭でも印象的だった、Andreas Geiger教授の招埅講挔を玹介したいず思いたす。 Learning Robust Policies for Self-Driving この招埅講挔では Andreas Geiger 教授の研究宀から今幎2022幎に発衚された3぀の最新論文が玹介されおいたした。各論文の抂芁を以䞋で説明したす。 Transfuser 20 Transfuserは、耇数センサヌから埗られるマルチモヌダルデヌタを入力ずしお適切な運転経路予枬をするモデルです。カメラから取埗したRGB画像ず、LiDARセンサから取埗した点矀の鳥瞰図(Bird's Eye View, BEV)ずを各々の特城抜出噚に入力し、䞭間局で各モヌダルの特城マップにTransformerベヌスのCross Attentionを適甚するこずで、画像ず点矀それぞれの特城抜出噚の出力が他方のモヌダルの情報で補間されるず述べられおいたす。CARLAシミュレヌタヌで生成したデヌタセットで評䟡したずころ、同䞀入力のベヌスラむン手法に比べ芏則違反なくルヌトを完走する性胜が倧きく向䞊するこずが瀺されおいたした。 PlanT 21 Transfuserがセンサヌ矀から埗られるデヌタを入力ずするモデルであったのに察し、PlanTでは呚囲の運転゚ヌゞェント(近くを走行する車䞡)の情報が即時的に埗られるこずを仮定し、その情報から算出される特城量(object-level representation)を入力ずしお運転経路の予枬を行いたす。Object-level representationは、運転゚ヌゞェントの䜍眮、向き、倧きさ、゚ヌゞェントが搭茉するセンサヌのデヌタを前述のTransfuserに入力しお埗られる属性ずから算出され、各゚ヌゞェントのrepresentationが1぀のトヌクンずしおBERT 22 ベヌスのモデルに入力されたす。この論文でもCARLAシミュレヌタヌから生成されるデヌタセットで評䟡を行っおおり、Transfuserを䞊回る運転性胜が達成できるこずが瀺されおいたした。 KING 運転経路を適切に予枬する゚ヌゞェントを獲埗するには車䞡が衝突するようなシナリオを含め孊習するこずが奜たしい䞀方で、実䞖界でそのようなデヌタを取埗するこずは危険か぀困難です。代替手段ずしお運転シミュレヌタヌでそのようなシナリオを再珟する方法が考えられたすが、実際はシミュレヌタヌ䞊でも珟実的な衝突シヌンの再珟にはコストがかかるずいう問題がありたす。そこでこのKINGずいうアプロヌチでは、車䞡の衝突を助長するよう蚭蚈した目的関数を最適化するこずで環境内の゚ヌゞェントの行動を倉化させ、埗られた行動から衝突が発生するシヌンを生成するこずが提案されおいたす。車䞡モデルには埮分可胜なbicycle modelを採甚するこずで、目的関数はバックプロパゲヌションで゚ンドツヌ゚ンドに最適化するこずが可胜です。CARLAシミュレヌタヌ 23 を甚いお実隓をしたずころ、提案手法で生成された車䞡の衝突を含むシナリオは、募配情報を甚いないブラックボックス最適化で生成されたシナリオに比べ、衝突をより回避する運転゚ヌゞェントの獲埗に寄䞎するこずが瀺されおいたす。 最埌に 本ブログでは、ECCV2022の抂芁ず私たちが興味を持ったWorkshopをご玹介したした。埌線では、私たちが気になった論文を玹介するのでぜひご芧になっおください。 NTT Comでは、今回ご玹介した論文調査、画像や映像、曎には音声蚀語も含めた様々なメディアAI技術の研究開発に今埌も積極的に取り組んでいきたす。たた䞀緒に技術開発を進めおくれる仲間も絶賛募集䞭です。 アカデミックな研究に泚力したくさん論文を曞きたい 最新の技術をいち早く取り入れ実甚化に結び付けたい AIアルゎリズムに加え、AI/MLシステム党䜓の最適な蚭蚈を暡玢したい 2022幎12月06日珟圚、NTT Comでは 珟堎受け入れ型むンタヌンシップ の゚ントリヌを受付䞭です。私達のチヌムからも、AI゚ンゞニアカテゎリに メディアAI技術開発゚ンゞニア/リサヌチャヌ ずいうポストを出しおいたす。むンタヌンを通じお、䌚瀟やチヌムの雰囲気、そしお私たちの取り組みを知っおいただく機䌚にできればず考えおいたす。皆様のご応募、心からお埅ちしおいたす https://eccv2022.ecva.net/files/2022/10/ECCV22-Welcome-Slides-for-web.pdf ↩ Bingyi Cao, A. Araújo, and Jack Sim. "Unifying Deep local and global features for image Search." ECCV 2020. ↩ Fuwen Tan, Jiangbo Yuan, and Vicente Ordonez. "Instance-level Image Retrieval using Reranking Transformers." ICCV 2021. ↩ Fuwen Tan, Paola Cascante-Bonilla, Xiaoxiao Guo, Hui Wu, Song Feng and Vicente Ordonez. "Drill-down: Interactive Retrieval of Complex Scenes using Natural Language Queries." NeurIPS 2019 ↩ Ranjay Krishna, Yuke Zhu, Oliver Groth, Justin Johnson, Kenji Hata, Joshua Kravitz, Stephanie Chen, Yannis Kalantidis, Li Jia-Li, David Ayman Shamma, Michael Bernstein and Li Fei-Fei. "Visual Genome: Connecting Language and Vision Using Crowdsourced Dense Image Annotations." 2016. ↩ Alec Radford, Jong Wook Kim, Chris Hallacy, Aditya Ramesh, Gabriel Goh, Sandhini Agarwal, Girish Sastry, Amanda Askell, Pamela Mishkin, Jack Clark, Gretchen Krueger and Ilya Sutskever. "Learning Transferable Visual Models From Natural Language Supervision." 2021. ↩ Ziyan Yang, Kushal Kafle, Franck Dernoncourt and Vicente Ordonez. "Improving Visual Grounding by Encouraging Consistent Gradient-based Explanations." 2022. ↩ Juhong Min, Jongmin Lee, Jean Ponce and Minsu Cho. "SPair-71k: A Large-scale Benchmark for Semantic Correspondence." 2019. ↩ Juhong Min and Minsu Cho. "Convolutional Hough Matching Network." CVPR 2021. ↩ Seungwook Kim, Juhong Min and Minsu Cho. "TransforMatcher: Match-to-Match Attention for Semantic Correspondence." CVPR 2022. ↩ Juhong Min, Dahyun Kang and Minsu Cho. "Hypercorrelation Squeeze for Few-Shot Segmentation." ICCV 2021. ↩ Dahyun Kang and Minsu Cho. "Integrative Few-Shot Learning for Classification and Segmentation." CVPR 2022. ↩ Yanbei Chen, Shaogang Gong and Loris Bazzani. "Image Search With Text Feedback by Visiolinguistic Attention Learning." CVPR 2020. ↩ Jon Almazán, Byungsoo Ko, Geonmo Gu, Diane Larlus and Yannis Kalantidis. "Granularity-aware Adaptation for Image Retrieval over Multiple Tasks." ECCV 2022. ↩ Jonas Pfeiffer, Aishwarya Kamath, Andreas RÃŒcklé, Kyunghyun Cho and Iryna Gurevych. "AdapterFusion: Non-Destructive Task Composition for Transfer Learning." EACL 2021. ↩ Ting Chen, Simon Kornblith, Mohammad Norouzi and Geoffrey Hinton. "A Simple Framework for Contrastive Learning of Visual Representations." ICML 2020. ↩ Kaiming He, Haoqi Fan, Yuxin Wu, Saining Xie and Ross Girshick. "Momentum Contrast for Unsupervised Visual Representation Learning." CVPR 2020. ↩ Mathilde Caron, Hugo Touvron, Ishan Misra, Hervé Jégou, Julien Mairal, Piotr Bojanowski and Armand Joulin. "Emerging Properties in Self-Supervised Vision Transformers." ICCV 2021. ↩ Filip Radenović, Ahmet Iscen, Giorgos Tolias, Yannis Avrithis and Ondřej Chum. "Revisiting Oxford and Paris: Large-Scale Image Retrieval Benchmarking." CVPR 2018. ↩ Prakash, K. Chitta, and A. Geiger. Multi-modal fusion transformer for end-to-end autonomous driving. In Proc. IEEE Conf. on Computer Vision and Pattern Recognition (CVPR), 2021. ↩ Katrin Renz, Kashyap Chitta, Otniel-Bogdan Mercea, A. Sophia Koepke, Zeynep Akata and Andreas Geiger. PlanT: Explainable Planning Transformers via Object-Level Representations. CoRL 2022. ↩ I.Turc, M.-W. Chang, K. Lee, and K. Toutanova. Well-read students learn better: On the importance of pre-training compact models. arXiv.org, 1908.08962, 2019. ↩ Dosovitskiy, A., Ros, G., Codevilla, F., Lopez, A., Koltun, V.: CARLA: An open urban driving simulator. In: Proc. Conf. on Robot Learning (CoRL) (2017) ↩
この蚘事は、 NTT Communications Advent Calendar 2022 9日目の蚘事です。 察象読者 / わかるこず 察象読者 IoT デバむス接続の難しさに頭を抱えおいる 「クラりドにデヌタを送信する」たでの芁所をざっくり理解したい ずにかく IoT を道具ずしお䜿っおみたい、始めおみたい わかるこず 「クラりドにデヌタを送信する」たでの䞀連の流れ Things Cloud を掻甚した「お手軜IoT」の始め方 はじめに こんにちは、Things Cloud の゜リュヌションアヌキテクトチヌム 竹村です。私たちのチヌムは、5GIoTサヌビス郚で IoT プラットフォヌム「 Things Cloud 」を掻甚した゜リュヌションアヌキテクトを担圓しおいたす。 早速ですが、皆さんは「IoT」ず聞いお䜕を連想したすか。モノ同士が通信するこず、クラりド䞊でデヌタを可芖化するこず、それずも珟地の機噚を自埋制埡するこずでしょうか。もちろんこれらは IoT で実珟できるこずですが、共通しおいるこずがありたす。それは 「䜕か実珟したいこずに察する手段であり目的ではない」 いう点です。 皆さんが IoT を掻甚しお目指すゎヌルは、品質向䞊・コスト削枛・事業拡倧・業務DXなど様々だず思いたす。IoT によっお、「珟状把握→仮説立案→効果怜蚌」の PDCA サむクルを高速に回すこずも、自動化しおビゞネスをスケヌルさせるこずも可胜になりたす。 ぀たり、IoTは 「数ある手段の䞭でも匷力な手段の1぀」 ずも蚀えたす。 しかし、どうやったら IoT を導入できるのか、頭を抱えおいる方も倚いのではないでしょうか。 IoT の技術領域は「デバむス」「ネットワヌク」「クラりド」「デヌタ利掻甚」「セキュリティ」など倚岐にわたるため、いざ怜蚎を始めるずサヌビス遞定やシステム構築などの堎面で倚くの課題に盎面したす。 本蚘事では、「IoT を道具ずしお䜿いこなしたい」「仮説怜蚌や商甚導入に倚くの時間を䜿いたい」皆さんのご芁望にお応えするため、Things Cloud ずパヌトナヌデバむスを掻甚した「お手軜IoT」の始め方に぀いおご玹介したす。 クラりドにデヌタを送信するには それでは、IoT を道具ずしお䜿いこなす第䞀歩「デヌタをクラりドに送信する」たでの STEP をみおいく前に䞀床、私たちがハサミを䜿う堎面を想像しおみおください。 私たちはおこの原理を意識しなくおも「なんか刃の奥の方が切りやすいぞ」ず経隓䞊孊習しお知っおいたす。それず同じように、「なんずなく分かった」状態で IoT 䜿い始めるこずを目暙に、肩の力を抜いおこれからお話しする内容もご芧いただければず思いたす。 そうです、IoT はただの道具です。しかし、匷力な道具です たず、IoTを構成する芁玠ずしお、センサヌず IoT-GW ゲヌトりェむずいったデバむスがありたす。 センサヌは、物理情報を科孊原理に基いお信号に倉換する機噚のこずで、枩湿床センサヌなどが存圚したす。IoT-GW は、センサヌ等の機噚ずクラりド間を䞭継する機噚のこずです。 「デヌタをクラりドに送信する」には䞻に以䞋の3぀の STEP があり、倚くの堎合では、IoT-GW の゜フトりェアが3぀の STEP を実行したす。 センサヌプロトコル倉換 センサヌから送信される倚皮倚様な圢匏のデヌタを解釈 デヌタ圢匏倉換 デバむスのデヌタ情報をクラりドが理解するデヌタモデルに倉換 安党な通信 安党な通信HTTPS / MQTTS などによるクラりドぞのデヌタ送信 それでは、それぞれの STEP に぀いお詳现を芋おいきたしょう。 STEP1「センサヌプロトコル倉換」 たずは、「プロトコル」ずいう蚀葉に぀いお確認したす。 プロトコルっお プロトコルずは、「玄束された手順・ルヌル」のこずです。 通信の䞖界におけるデヌタの送受信は、プロトコルず呌ばれる共通のルヌルのもずで実珟されおいたす。人間のコミュニケヌションで䟋えるず、日本語や英語などの共通の蚀語を甚いるこずで情報の䌝達を実珟しおいるのず同じむメヌゞです。 しかし、勝手にプロトコルを定めおいくずその数は爆発的に増加し、ルヌルを知っおいる機噚のみが通信できる状態になっおしたいたす。これは、地域・囜ごずに異なる方蚀・母囜語が存圚しおいる状況䞋で、コミュニティヌ間で蚀語による情報䌝達に支障が生じる状況に䌌おいたす。 そのため、プロトコルは芏栌化共通ルヌル化されおいき、様々なセンサヌやデバむス間で共通のプロトコルを甚いた通信が可胜になりたす。グロヌバルなビゞネスの堎では、倚くの人がコミュニケヌションできるように英語を利甚するようなむメヌゞです。 センサヌプロトコル倉換 さお、センサヌの通信プロトコルも倚岐にわたるため、やり取りされるデヌタ圢匏も倚皮倚様です。そのため、センサヌが利甚するプロトコルやデヌタ圢匏に応じお、デヌタを解釈する必芁がありたす。 䟋えば、枩湿床センサヌからデヌタを受信する以䞋のようなケヌスを考えおみたす。この堎合、センサヌのデヌタ圢匏に基づいお「今は枩床27℃で湿床72%だな」ず解釈できたす。 # 䟋枩湿床センサヌ # 衚珟圢匏 電文の4Byte の先頭 2Byte が枩床℃、残り 2Byte を湿床%を衚す 1b48 → 0001101101001000 → 00011011 , 01001000 → 27 , 72 → 27 ℃, 72 % たた、プロトコルには手順・ルヌルだけでなく、このデヌタ圢匏たで芏定しおいるものもありたす。機噚/メヌカヌによらずデヌタ圢匏を芏定しおいるプロトコルEnOceanなどや、機噚/メヌカヌごずに独自のデヌタ圢匏を甚いるプロトコルModbus、BLE、LoRaWANなどなどがその䟋です。前者は機噚/メヌカヌによらず゜フトりェアを共通化でき、埌者は機噚/メヌカヌごずに開発が必芁になりたす。 ぀たり、 各機噚ごずにデヌタを解釈するためのプログラムが必芁 ずなる可胜性があるずいうこずです。 # 【参考】プロトコルの分類䟋 # 甚途・通信距離等の分類 ・産業系プロトコルModbus など ・近距離無線通信系プロトコルWi-Fi、BLE、Wi-SUN、ZigBee、EnOcean など ・LPWA系プロトコルLoRaWAN、Sigfox、LTE-M など # デヌタ圢匏での分類 ・デヌタ圢匏を芏定しおいるプロトコルEnOcean など ・独自のデヌタ圢匏を甚いるプロトコルModbus、BLE、LoRaWANなど STEP2「デヌタ圢匏倉換」 センサヌから埗られたデヌタをクラりド偎が芁求するデヌタ圢匏に倉換したす。具䜓的には、察象ずするクラりドが察応しおいる以䞋のようなデヌタ圢匏ぞ倉換したす。 構造化デヌタExcel、CSV、RDBデヌタなど # 䟋CSV key1,key2,key2 value1,value2,value3 半構造化デヌタJSON、XMLなど // 䟋JSON { " key1 ": " value1 ", " key2 ": " value2 " } 非構造化デヌタ芏則性のないテキスト、PDF、画像、音声、動画など # 䟋䞊蚘画像ファむルのビット列をHEX16進数衚蚘したもの 89504e470d0a1a0a0000000d49484452 ... f87fbd0a6e6b89b8ca800000000049454e44ae426082 STEP3「安党な通信」 クラりド偎が察応しおいる通信方匏によっおデヌタを送信したす。倚くのクラりドでは、HTTPS や MQTTS ずいった通信経路䞊を流れるデヌタを暗号化する通信プロトコルに察応しおおり、郜床適切なデヌタ圢匏及び方法を甚いお、倉換埌のデヌタを送信したす。 デヌタを送信するだけでも䞀苊劎 いかがでしょうか、「デヌタをクラりドに送信する」たでにこのような STEP を経るこずで、デヌタの可芖化やアラヌム刀定などのデヌタ利掻甚が開始できる状態になりたす。 ここたでで、「センサヌ/クラりドごずに開発がいるのか、倧倉そう」「デヌタ利掻甚するたで先が長い」など少し難しそうだなず思われた方もいらっしゃるのではないでしょうか。 この蚘事を最埌たで芋おいただければ、「お手軜IoT」を始められたすのでご安心ください。 「お手軜IoT」を実珟するための道具ずしお、「 Things Cloud 」ずいうクラりドず、「 OpenBlocks 」ずいうデバむスをご玹介したす。 Things Cloud に぀いお Things Cloud は、NTT Communications の Smart Data Platform (略称SDPF) の䞭で、デヌタ収集機胜を提䟛するプラットフォヌムです。 センサヌに぀ながる IoT デバむスからデヌタを収集し、蓄積できるクラりドサヌビスで、簡単な操䜜でデバむス情報を閲芧したりデヌタを可芖化したり、ナヌザヌ管理/通知/デバむス管理等、IoT に必芁な機胜䞀匏が揃っおいたす。 1 たた、LoRaWAN 2 や Sigfox 3 ネットワヌクずの接続機胜を有しおいるため、これらのプロトコルに察応したセンサヌの遞択が可胜です。 それでは、 Things Cloud における「デヌタ圢匏倉換」ず「安党な通信」に぀いお確認しおいきたしょう。 Things Cloud における「デヌタ圢匏倉換」 Things Cloud では JSON 4 たたは CSV 5 圢匏のデヌタを芁求するため、センサヌプロトコル倉換等で埗たデヌタを䞊蚘の圢匏に倉換するプログラムが必芁ずなりたす。 // 䟋枩床デヌタJSON { " c8y_TemperatureMeasurement ": { " T ": { " value ": 27 , " unit ": " ℃ " } } , " time ":" 2022-12-09T10:00:00.000+09:00 ", " source ": { " id ":" .... " } , " type ": " c8y_TemperatureMeasurement " } # 䟋枩床デヌタCSV 200 ,c8y_TemperatureMeasurement,T, 27 Things Cloud における「安党な通信」 Things Cloud では HTTPSJSON 圢匏たたは MQTTS基本的には CSV 圢匏に察応しおおり、郜床適切なデヌタ圢匏及び方法を甚いお、倉換埌のデヌタを送信したす。 OpenBlocks に぀いお 本蚘事で玹介する OpenBlocks は、IoT-GW 機噚ずしお䜿うこずができたす。IoT-GW は、「デヌタをクラりドに送信する」ための぀の STEP の凊理を行う䞻䜓でもありたす。 それでは、OpenBlocks が持぀「センサヌプロトコル倉換」に関する機胜に泚目しお、ご玹介しおいきたす。 OpenBlocks における「センサヌプロトコル倉換」 OpenBlocks は様々な通信芏栌やプロトコルBLE・EnOcean・Wi-SUN・スマヌトメヌタヌ・Modbus等を甚いた䞻芁メヌカヌの倚皮倚様なセンサヌに察応しおおり、Webブラりザ䞊での蚭定だけで接続できるずいう特長を持っおいたす。 そのため、OpenBlocks が利甚したいセンサヌに察応しおいれば、「センサヌプロトコル倉換」機胜を開発するこずなく該圓センサヌを利甚可胜です。 6 「お手軜IoT」の始め方 ここたでで3぀の STEP に぀いおたずめるず䞋蚘の通りです。 センサヌプロトコル OpenBlocks の持぀機胜を利甚するこずで倚皮倚様なセンサヌに察応可胜 デヌタ圢匏倉換 Things Cloud が察応する JSON たたは CSV に倉換する゜フトりェアが必芁 クラりドぞの安党な通信 倉換埌のデヌタを HTTPS たたは MQTTS によっお送信する゜フトりェアが必芁 䞊蚘の通り「デヌタ圢匏倉換」「安党な通信」の機胜を持぀゜フトりェアを開発する必芁がありたす。これらの機胜を補完する「お手軜IoT」を始めるための゜フトりェア以降、「デヌタ送信甚゜フトりェア」ず呌びたす を開発したしたのでご玹介したす。 デヌタ送信甚゜フトりェアは Node-RED 7 で実装されおいたす 珟圚は EnOcean のみの察応 8 ですが、開発を継続しお順次察応デバむス数を増やしおいきたす EnOcean の詳现に぀いおは こちら をご参照ください 「お手軜IoT」の始め方に぀いお、EnOcean センサヌ利甚を䟋にご玹介したす。 デヌタ送信甚゜フトりェアのご利甚に぀いおは 問い合わせ先 からご連絡ください。 OpenBlocks の蚭定 OpenBlocks に関する操䜜・蚭定に぀いおは、 OpenBlocks のマニュアル をご参照ください。 センサヌ接続 たずは、OpenBlocks にセンサヌを接続したす。 EnOcean の堎合、無線プロトコルであるため物理的な接続はありたせんが、機噚によっおは電源を ON にしたす。 センサヌ登録 利甚するセンサヌの情報を OpenBlocks に登録したす。 センサヌ情報を登録するために、以䞋の項目を入力・保存したす。 9 デバむスIDEnOcean におけるセンサヌを識別する番号 ナヌザヌメモナヌザヌが指定する任意の情報 EEPEnOcean で定矩されおいるデヌタ圢匏を瀺す番号 特に「デバむスID」「EEP」に入力する倀は、筐䜓や取扱説明曞などに蚘茉されおいるこずが倚いため、そちらを参照したす。 センサヌ情報を登録埌、該圓のセンサヌに察しお以䞋のように蚭定したす。 10 初回は IoTデヌタ蚭定 及び ナニックスドメむン゜ケット を参照しお、以䞋の蚭定をしおください。 デヌタ送信甚゜フトりェアのむンポヌト OpenBlocks 䞊で動䜜する Node-RED にデヌタ送信甚゜フトりェアをむンポヌトしたす。 Web ブラりザで Node-RED の実行環境にアクセスし、「読み蟌み」>「読み蟌むファむルを遞択」におデヌタ送信甚゜フトりェアを遞択したす。 11 初回は OpenBlocks ぞの Node-RED のむンストヌル 及び アクセス方法 を参照しお、必芁な蚭定をしおください。 Things Cloud の蚭定 以䞋は Things Cloud 䞊での操䜜になりたす。 IoT-GW の ID 登録 Things Cloud に察しお OpenBlocks の ID を登録したす。 OpenBlocks 筐䜓の裏面に蚘茉されおいる「SERIAL No.」の倀を参照し、「デバむスID」に入力したす。 接続の承認 Things Cloud で承認凊理をしたす。 䞀定時間経過するず「承認」ボタンが出珟するので、これをクリックしたす。 結果 䞊蚘の蚭定だけで Things Cloud にデヌタが送信・可芖化されるようになりたす。「デヌタをクラりドに送信する」たでの3぀の STEP がうたく隠蔜されおいるこずを感じられたでしょうか。 たずめ IoT はビゞネスにおける手段の1぀、だけど匷力な手段 デヌタ送信するたでには3぀の STEP がある センサヌプロトコル倉換 デヌタ圢匏倉換 安党な通信 Things Cloud ず OpenBlocks を掻甚しお今すぐ「お手軜IoT」をはじめよう 今埌も NTT Communications は皆さんの IoT 掻甚をサポヌトしおたいりたす 問い合わせ先 お手軜IoTを詊しおみたい方は、以䞋にお問い合わせください。 Things Cloud サヌビスに぀いおiot-infontt.com ※お手数ですがを半角文字に眮き換えおください それでは、明日の投皿もお楜しみに https://engineers.ntt.com/entry/2022/03/01/130720 ↩ https://www.nttbizsol.jp/service/lorawan/about/ ↩ https://www.kccs.co.jp/sigfox/service/ ↩ https://developer.ntt.com/iot/docs/reference/measurements/ ↩ https://developer.ntt.com/iot/docs/device-sdk/mqtt/#mqtt-static-templates ↩ https://www.plathome.co.jp/partner-program/sensor-device/ ↩ https://nodered.jp/about/ ↩ https://docs.plathome.co.jp/docs/openblocks/fw4/data_form/enocean ↩ https://docs.plathome.co.jp/docs/openblocks/fw4/service/basic ↩ https://docs.plathome.co.jp/docs/openblocks/fw4/data_handling/enocean ↩ https://nodered.jp/docs/user-guide/editor/workspace/import-export ↩
この蚘事は、 NTT Communications Advent Calendar 2022 8日目の蚘事です。 サマリ OSS 公開䞭の Go による SDN コントロヌラヌ Pola PCE の開発ノりハりを玹介 開発・公開・運甚に際しおやったこずず埗られた Tips を玹介 CI・ドキュメント・コンテナ・その他 Go 関連 はじめに むノベヌションセンタヌの䞉島です。 普段の業務では Multi-AS Segment RoutingSRv6/SR-MPLSや Telemetry などの技術怜蚌、BGP 技術の怜蚌ず AS 運甚などを行っおいたす。 この蚘事では、SDN コントロヌラヌを OSS ずしお公開しお埗た知芋を、Go による開発支揎や GitHub を通じた公開・運甚の Tips を亀え぀぀ご玹介したす。 公開した OSS: Pola PCE 経路制埡技術の Segment RoutingSRにおいお、発行した経路を管理するための SDN コントロヌラヌである Pola PCE を開発・公開しおいたす。 Pola PCE を SR 網に導入するこずで、倧芏暡なネットワヌク運甚やアプリケヌション単䜍での通信品質向䞊などを実珟できたす。 プロダクトの詳现は埌日たた本ブログで解説予定ですので、ご期埅ください。 Pola PCE は Go で開発し、2022幎6月に OSS ずしおリリヌスしたした。 2022幎12月8日時点では v1.1.2 が公開䞭で、Go のパッケヌゞ、クロスコンパむルしたバむナリ、Docker むメヌゞの3皮を配垃䞭です。 開発の経緯ず OSS 化に螏み切った理由 NTT Com では Multi-AS SR 技術を甚いた瀟内ネットワヌクを運甚しおいたす。 その䞭で耇雑な Traffic Engineering のナヌスケヌスずスケヌラビリティを実珟するため、継続的な機胜远加やニヌズに応じた拡匵性を持ち、Multi-vendor 環境でも動䜜可胜なコントロヌラヌが必芁ずなりたした。 これらの芁求を満たすため、Pola PCE を開発し自瀟ネットワヌクぞ導入したした。 開発の圓たっおのより詳しいモチベヌションは䞋蚘でご玹介しおいたす。 倧芏暡 SR 網の運甚を効率化するネットワヌクコントロヌラの開発NTT Tech Conference 2022 Segment Routing 甹 Stateful PCE をフルスクラッチで開発した話 ネットワヌクで掻甚する゜フトりェアは、開発するだけでなく、その埌の機胜拡匵や他補品ずの連携が重芁ずなりたす。 継続的な開発を進める䞊で、䞋蚘の3点を期埅し OSS ずしおの公開に螏み切りたした。 ナヌザや察応補品の増加・PCE 界隈の盛り䞊げ ネットワヌク運甚者に広く利甚されるこずによる、プロトコル察応補品の増加や倖郚ツヌルの充実 倚圩な環境での動䜜を通じた新芏ニヌズの開拓や知芋の蓄積 新芏ナヌスケヌスの獲埗や機胜芁望の期埅 コミュニティ運甚による機胜远加や知芋の獲埗 倖郚の Contributor の芖点を取り入れるこずによる新芏知芋の獲埗や機胜向䞊 以降の章では、これらを達成するこずを目指した OSS 開発・公開・運甚の Tips をご玹介したす。 OSS 開発・公開・運甚の Tips 前章の芁件を満たすため、䞋蚘のポリシヌで OSS 公開手法を怜蚎したした。 広く利甚者を増やすための工倫 Example の充実やドキュメント敎備、SEO 察策 倚圩な環境ぞの適甚 クロスコンパむル・Docker 等での配垃 運甚・メンテナンスの効率化 CI の 掻甚や暙準的なプロゞェクト構成ぞの準拠、関連ラむセンス衚瀺等の自動化 それぞれのポリシヌを満たすために実斜した Tips を、(1) GitHub での公開・運甚知芋、(2) Go の開発支揎、(3) その他 OSS 開発・運甚の工倫の3぀に分けお解説したす。 GitHub での公開・運甚知芋 リポゞトリ運営 Community Standards の敎備 GitHub の公匏機胜ずしお、リポゞトリを最滑に運甚するためのチェックリストが公開されおいる 特に Description は怜玢時に衚瀺されるペヌゞ名や埌述の Docker むメヌゞのラベルにもなるため重芁 GitHub Actions あらかじめ䜜成したワヌクフロヌを自動実行し、CI を実珟する機胜 フォヌマットに関するレビュヌやリリヌスなどの定型䜜業の負荷を䜎枛 Pola PCE のワヌクフロヌ では、Git で Tag を付䞎した際にクロスコンパむルされたバむナリず Docker image をリリヌスする仕組みを䜜成 ドキュメント公開 SEO 察策 GitHub Pages プロゞェクト党䜓に関する情報公開ず SEO 察策を目的ずした Web ペヌゞ gh-pages ブランチ を䜜成し、Setting → Pages より公開蚭定 SEO 察策の芖点でも、GitHub のリポゞトリペヌゞは Google 等のクロヌラヌに認識されるのが遅い傟向にあるため、リリヌス盎埌の怜玢甚にも䜜っおおくず良い Pola PCE の堎合、GitHub Pages は公開埌半日皋、GitHub のリポゞトリペヌゞは公開埌玄2週間埌に Google 怜玢結果ぞ衚瀺された 環境構築方法を gh-pages/README.md に蚘茉枈。誰でも PR ベヌスで線集可胜 䞋蚘の Hugo ず Docsy を利甚し、ペヌゞ䜜成を効率化 Hugo Markdown で蚘茉したファむルから動的に Web ペヌゞを生成するツヌル カスタマむズの仕方などは Hugo のペヌゞ にたずたっおいる テンプレヌト䞀芧 も存圚 Template を掻甚し぀぀、Markdown ベヌスで手軜にブログが䜜成できるのは䟿利 Docsy 技術文曞を曞くためのテンプレヌト。gRPC・Selenium・etcd など様々な゜フトりェアが䜿甚䞭 各団䜓が 公匏ペヌゞ で Example を提䟛しおいる OSS プロダクトらしい公匏ペヌゞを高速に開発可胜。1 時間ほどで必芁な機胜・芋た目のペヌゞを䜜るこずができお助かった GitHub Container Registryghcrによる Docker むメヌゞのリリヌス GitHub 䞊で Docker むメヌゞを提䟛する機胜 Docker Hub ず異なり、公匏機胜で GitHub Actions ずの API 連携が可胜 公匏ワヌクフロヌを利甚するだけで、リポゞトリ情報・バヌゞョンやラむセンス情報などがラベルずしお埋め蟌たれた Docker むメヌゞを生成可胜 䟋  Docker むメヌゞのも含め、党おを Github で完結しお公開できるのは良い点 䞀方、Docker Hub ず違いレゞストリ名ghcr.ioが必芁になるため、むメヌゞ名が長くなるデメリットも存圚 その他 README.md の敎備 トップペヌゞの README.md には、CI 状態や関連ペヌゞなどを Badge ずしお付䞎 各階局にも README.md を配眮し、ツヌルの䜿い方等を解説 コマンドの䜿い方や仕様などの蚘茉は特に重芁 main ブランチの保護 latest リリヌス砎壊の防止 Setting → Branches → Branch protection rules Go の開発支揎 プロゞェクトの構造を Standard Go Project Layout に準拠 Standard Go Project Layout 可読性・保守性の高い Go プロゞェクトのベストプラクティス 各ファむルの圹割が明確になるず共に、Go の開発者が理解しやすいプロゞェクト構造になった linging/formatting golangci-lint CI から呌び出し、Go 関連の linting/formatting を行っおくれる機胜 Push の床に GitHub Actions で実行 次の Go Report Card ず合わせ、gocyclo のパラメヌタを調敎するこずを掚奚 Go Report Card lintng/formatting や 英語の綎りなどを確認し、Web 䞊で衚瀺するサヌビス 蚭定䞍芁でコヌドの確認ができるので䟿利 Go の文法的な lint/format の他、英語のスペル確認なども実行しおくれる 結果は Badge ずしお README.md に衚瀺可胜 editorconfig コヌドの統䞀性を持たせるための linter/formatter 開発者の環境を問わず、生成されるコヌドを統䞀する意図。 CI 実斜前のチェックに利甚 Vim/Emacs/VSCode など様々な゚ディタヌに導入可胜 Go の堎合その他の linter が充実しおいるため恩恵は薄いが、Markdown/YAML 他様々な圢匏に察応 いずれは開発環境の敎え方のような手順を䜜る、あるいはネットワヌク環境を含めた開発甚コンテナを公開するず良さそう その他 gocredits Go で䜿甚したラむブラリのラむセンスをたずめお衚瀺しおくれるツヌル OSS ずしお公開する䞊で重芁なラむセンス管理をサポヌト 今のずころリリヌスごずにロヌカルでコマンドを実行しお利甚䞭 Tag を付䞎した際、あるいは go ファむルが曎新された際に自動実行するなど、CI に組み蟌むのが良さそう pkg.dev.go Go 公匏のドキュメント機胜 go install するだけでコヌドを自動解析しおドキュメントを䜜っおくれるのは䟿利 その他 OSS 開発・運甚の工倫 Getting Started や Example の敎備 ツヌルの利甚方法ず詊しやすい手順を公開するこずでナヌザを増やす狙い Example は誰もが手軜に詊すこずができ、なるべく同じ環境で再珟できるず Good 手軜さず再珟性の䞡立にはコンテナ環境がおすすめ Pola PCE は Tinet の蚭定ファむルを公開 Docker さえ準備すれば、誰でも気軜に蚭定枈みの SR ネットワヌクD-Plane/C-Planeを利甚可胜に 実際に手元で動かした結果をもずにした問い合わせや感想もいただくこずができた 公匏アむコンの䜜成 トポロゞヌ図・システム図等で゜フトりェアを瀺すこずができ、発衚資料の顔にもなるので重芁 遠目に Pola や PCE の P ずなるようにデザむン 公匏ペヌゞや OSS の各所で利甚するためのテヌマカラヌを決めおおくず䟿利 Pola PCE では #81C0FC ず #03498D の2色をテヌマカラヌずしお蚭定、アむコンや GitHub Pages のテヌマに利甚 ステッカヌを䜜成、JANOG 50 等のむベントで配垃 興味を持っおいただけた方が怜玢可胜なように、名前入りのロゎを䜜成 自身で図やスラむドを䜜成する際も䟿利であり、たたこれをきっかけにお声がけいただいたりもしたため、やっおよかった取り組みの1぀ たずめ 本蚘事では、Pola PCE の開発経隓を通じお埗た知芋を、Go 補 OSS の開発支揎ず・GitHub における公開の Tips ずしおご玹介したした。 各 Tips に蚘茉した通り、各 CI やベストプラクティスに埓うこずでリポゞトリ公開・運甚やドキュメントの敎備等を効率的に進めるこずができたず感じおいたす。 より Pola PCE に寄せた感想ずしおは、OSS ずしおの公開を通じお、 研究での利甚をしおいただくなど、事前に期埅した通りの䞀郚 PCE 界隈の盛り䞊げやナヌスケヌスの創出に貢献できたかなず感じおいたす。 たた、今回はネットワヌクに関する゜フトりェアであるため、 公開した Example ネットワヌク環境を手元で動かした結果をもずに感想や問い合わせをいただくなど、裟野を広げるこずができたのもよかったポむントです。 OSS 公開を怜蚎䞭の方や、開発に興味のある方はぜひそれぞれの Tips を参考にしおみおください。 たた、その他こんな方法もあるよずいう知芋をお持ちの方は、ぜひはおなブックマヌクやTwitterでコメントをお願いしたす 宣䌝 Pola PCE ぞの Contribution 募集 Pola PCE の Contributor を募集䞭です SR 網を運甚䞭で、SDN 制埡による運甚効率化や新たなサヌビスを提䟛しおみたい方 RFC/Internet-Draft 準拠の゜フトりェアを開発しおみたい方 お気軜に PR/Issue の䜜成をお願いしたす 12/19 (月) に SR 芖点で Pola PCE の内郚構造ず䜿い方を玹介する蚘事を公開予定ですので、ぜひそちらもご芧ください たた、PCE の掻甚事䟋も含め、SR の怜蚌䟋を 連茉蚘事 ずしおご玹介しおいたす。こちらも合わせおご芧ください。 冬季むンタヌンシップ開催のお知らせ 2022幎床むンタヌンシップの参加者を募集䞭です 冬むンタヌンシップ2022 公匏ペヌゞ: 珟堎受け入れ型むンタヌンシップ むンタヌンシップ開催に関するブログ蚘事: 【コムで螏み切れ。】 冬期むンタヌンシップを開催したす! 期間は 2023幎02月06日〜17日 のうち、土日祝を陀く実働10日間です。 締め切りは 12月14日氎13:00 たでずなっおいたすので、興味のある方はお早めにご応募ください 私たちのチヌム SR を甚いたキャリアネットワヌクの開発 では、SR-MPLS/SRv6 の技術怜蚌や Pola PCE を含めた SR 呚蟺技術の OSS 実装等のテヌマを甚意しおいたす。 たた、参加者の垌望するテヌマをご提案いただくこずもできたす。 昚幎は2名の方に参加いただき、FRRouting ぞの BGP-LS の実装ず、キャリアルヌタヌを甚いた SRv6 VPN の技術怜蚌を実斜しおいただきたした。 䜓隓蚘を寄皿しおもらっおいたすので、こちらもぜひ参考にしおください。 むンタヌンシップ䜓隓蚘 〜BGP-LSの機胜をFRRに実装しおみた〜 むンタヌンシップ䜓隓蚘 〜SRv6 L3VPN機胜怜蚌〜
この蚘事は、 NTT Communications Advent Calendar 2022 7日目の蚘事です。 はじめに こんにちは、むノベヌションセンタヌ所属の志村ず申したす。 「Metemcyber」プロゞェクトで脅嚁むンテリゞェンスに関する内補開発や、「NA4Sec」プロゞェクトで攻撃むンフラの解明・撲滅に関する技術開発を担圓しおいたす。 今回は「開発に䜿える脆匱性スキャンツヌル」をテヌマに、GitHub Dependabot, Trivy, Grypeずいったツヌルの玹介をさせおいただきたす。 脆匱性の原因ずSCAによるスキャン 珟圚の゜フトりェア開発は、倚くのOSSを含む倖郚の゜フトりェアに䟝存しおいたす。Python、Go、npm など倚くの蚀語は、様々な゜フトりェアをパッケヌゞずしお利甚できる゚コシステムを提䟛しおおり、この仕組みを利甚しおOSSなどのコンポヌネントを゜フトりェアに組み蟌んで掻甚するのが䞀般的です。 倖郚パッケヌゞを利甚するこずで効率的な開発が可胜になる䞀方で、それらに含たれる脆匱性の圱響を受けおしたうリスクが増加しおいたす。Snyk瀟のレポヌト 1 によれば、オヌプン゜ヌスの゜フトりェアの脆匱性の玄80%は間接的に䟝存しおいるパッケヌゞによりもたらされるずされおいたす。 そのため盎接的に利甚しおいるパッケヌゞだけでなく、それらの䟝存先のパッケヌゞたで含めお把握し、脆匱性がないか管理する必芁がありたす。 ゜フトりェアの䟝存関係を解析する手段ずしお、SCA (Software Composition Analysis) ず呌ばれるツヌルの掻甚が挙げられたす。 SCAを掻甚しお゜フトりェアの䟝存関係から脆匱性を発芋し、それらに察しお適切に凊眮をする、ずいうこずが耇雑化する゜フトりェア開発における脆匱性察応では重芁です。 SCA型のスキャンツヌルの玹介 脆匱性察策に䜿えるSCAは有償のものも含めお倚くありたすが、今回は無償で䜿える以䞋の3぀を玹介したす。 Dependabot Trivy Grype GitHub Dependabot 抂芁 GitHub Dependabot はRepositoryの構成芁玠を分析し、脆匱な䟝存関係を発芋・通知するGitHubの機胜です。 GitHub Dependabotの機胜はPrivate Repoであっおも無償で利甚できるため、GitHubを利甚しおいるならば䞇人にお勧めできたす。 2 デヌタ゜ヌス GitHub Dependabotは、既知の脆匱性やマルりェアの情報が含たれるデヌタベヌスである  GItHub Advisory Database に含たれる脆匱性が通知されたす。 NVD や各皮蚀語のセキュリティアドバむザリの情報がデヌタ゜ヌスずなっおいたす。 GitHub Advisory Databaseの情報はGitHub独自の脆匱性IDで管理され、脆匱性の詳现や圱響を受けるバヌゞョン、修正枈みのバヌゞョンなどの情報が含たれおいたす。 GitHub Advisory Databseの䞭でも、GitHubがサポヌトする゚コシステムにマッピングされた脆匱性/マルりェアの情報を GitHub-reviewed Advisory ず呌び、この情報がDependabot で通知されたす。 GitHub-reviewed AdvisoryはGitHub瀟によるレビュヌやパッケヌゞシステムずの察応づけが完了しおおり、圱響を受けるバヌゞョンや修埩枈みのバヌゞョンの情報も含たれおいるため、察応策定に圹立おるこずができたす。 本ブログ執筆時点で察応しおいる゚コシステムは以䞋の通りです。 Composer (registry: https://packagist.org/) Erlang (registry: https://hex.pm/) Go (registry: https://pkg.go.dev/) GitHub Actions ( https://github.com/marketplace?type=actions/ ) Maven (registry: https://repo.maven.apache.org/maven2) npm (registry: https://www.npmjs.com/) NuGet (registry: https://www.nuget.org/) pip (registry: https://pypi.org/) pub (registry: https://pub.dev/packages/registry) RubyGems (registry: https://rubygems.org/) Rust (registry: https://crates.io/) 䜿い方 Dependabot を利甚するには、Repositoryペヌゞの Settings -> Code security and analysis にアクセスし、 Dependency graph および Dependabot 関連の機胜をEnableにする必芁がありたす。 GitHub Dependency Graph はRepositoryの䞭の蚀語䟝存ラむブラリの管理ファむルなどを解析し、䟝存しおいるラむブラリの䞀芧を抜出する機胜です。 Dependency Graph で解析できる察象は About the dependency graph のドキュメントを参照しおください。 Dependency Graphを有効にするず゜ヌスコヌドが解析され、䟝存パッケヌゞが確認できる様になりたす。 解析結果はRepositoryペヌゞの Insight → Dependency Graph にアクセスするこずで確認できたす。 Dependabot alertsを有効化するず、GitHub Advisory Databaseに関連する情報が登録されるず通知される様になりたす。 Dependabot alertsの情報は、Repositoryの Security -> Dependabot から確認できたす。 Dependabot security updates を有効化しおいるず、パッケヌゞのバヌゞョンを脆匱性修正バヌゞョンに䞊げるPull Request が自動的に発行されたす。 Trivy 抂芁 Trivy はGo補のツヌルで、Linux, Windows, Mac いずれの環境でも動䜜したす。 Trivyはセキュリティのアヌミヌナむフをうたっおおり、以䞋のような倚様な機胜を有しおいたす。 脆匱性スキャン OSパッケヌゞ、蚀語のパッケヌゞをスキャンし、脆匱性を発芋する Secret スキャン 鍵ファむル (AWSキヌ、slackキヌなど) が存圚しおないかを確認する Configスキャン Terraform 蚭定ファむルやDockerfileなどをスキャンし、セキュリティ䞊問題になりうる蚭定が含たれおないかチェックする いずれの機胜も゜フトりェアの安党性を高めるために有効ですが、今回は脆匱性スキャンに぀いお取り䞊げたす。 Trivyの脆匱性スキャンはファむルシステムなどを解析し、䟝存しおいるOSや蚀語のパッケヌゞを抜出し、既存の脆匱性情報ずマッチングするこずで脆匱性の有無を刀断したす。 Trivyが脆匱性の有無を解析できる察象は以䞋の通りです。 OSパッケヌゞ apt, yum などでむンストヌルしたOSパッケヌゞ情報を抜出し、脆匱性を衚瀺する 蚀語パッケヌゞ 蚀語の䟝存ラむブラリの管理ファむル (pacakge-lock.json, pipenv.lock など) をスキャンしお、パッケヌゞのバヌゞョンを取埗し、脆匱性を衚瀺する デヌタ゜ヌス Trivyの脆匱性スキャンは、Trivyが収集したOSや蚀語パッケヌゞのバヌゞョン情報を、Trivyの脆匱性DBずマッチングするこずで行われたす。 Trivyが利甚する脆匱性DBは trivy-db ずいうツヌルで䜜成されおおり、DB自䜓の曎新もこのtrivy-db Repositoryの GitHub Actions で実行されおいたす。 このDBは6時間ごずに曎新されおおり、最新の脆匱性情報を参照できたす。 Trivyがどのようなデヌタ゜ヌスから情報を収集しおいるかは、Trivyドキュメントの Data Sources やtrivy-dbの ゜ヌスコヌド から読み解けたす。前述したGitHub Advisory Database もデヌタ゜ヌスに含たれおいたす。 䞻なデヌタ゜ヌスは以䞋の通りです。 GitHub Advisory Database Open Source Vulnerabilities GitLab Advisories Community NVD 各皮OS/蚀語の脆匱性DB 䜿い方 Trivyの脆匱性スキャンの察象は以䞋の通りです。 コンテナむメヌゞ ファむルシステム GIt Repo コンテナむメヌゞのスキャン コンテナむメヌゞをスキャンする堎合は、 trivy image コマンド を利甚したす。 trivy image python:3.4-alpine 出力は以䞋の様になりたす。 むメヌゞスキャンは コンテナむメヌゞを指定しお、その䞭に含たれるOSパッケヌゞや蚀語ラむブラリの脆匱性をスキャンできたす。 ファむルシステムのスキャン ファむルシステムスキャンをする堎合は、 trivy fs コマンド もしくは trivy rootfs コマンド を利甚したす。 trivy fs /path/to/project trivy rootfs / ファむルシステムをスキャンしお、OSパッケヌゞのファむルや蚀語のパッケヌゞの蚭定ファむル (npm の package-lock.json など) を解析しおバヌゞョン情報などを抜出し、既知の脆匱性が発芋された堎合に通知したす。 fsコマンドは䞻にロヌカルにあるプロゞェクトのスキャン、rootfsコマンドはRootfsのスキャン (コンテナ内郚でスキャンや、コンテナむメヌゞのファむルのスキャンなど) での利甚を想定されおいたす。 参考 䟋えばPythonでは、fsコマンドだず Pipfile.lock などのパッケヌゞの管理ファむルからパッケヌゞずバヌゞョンを抜出するのに察し、rootfsコマンドでは site-packages/ ディレクトリなどをスキャンしお実際にむンストヌルされおいるパッケヌゞずバヌゞョンを抜出する、ずいう挙動の違いがありたす。開発䞭のプロゞェクトの゜ヌスコヌドをスキャンしたい堎合はfsコマンド、コンテナやホストマシン内郚など今動いおいる環境のスキャンはrootfs、の様に䜿い分けるのが良いでしょう。 fsコマンドずrootfsコマンドのスキャン察象の違いに぀いおは Trivyのドキュメント なども参照しおください。 スキャンの挙動蚭定 Configファむル (trivy.yaml)を利甚するこずで、スキャンの挙動を蚭定できたす。蚭定可胜な内容は  ドキュメント を参照しおください。 たた .trivyignore に脆匱性ID (CVE-ID) を蚘茉するこずで、その脆匱性を無芖できたす。 スキャンフォヌマットの指定 Trivyはスキャン結果の出力フォヌマットが指定可胜です。デフォルトのtableフォヌマットはスキャン察象・脆匱性・Severityなどが衚瀺され、芖認性が高いフォヌマットです。 それ以倖にもjsonフォヌマットなどを指定できたす。 jsonフォヌマットで出力するず、tableフォヌマットでは出力されないスキャンタヌゲットのファむルパス ( PkgPath )などの情報が衚瀺されたす。 rootfs スキャンでマシン党䜓をスキャンした際など、どこで脆匱性が怜知されたかわからない、ずいう堎合に有効です。 json オプションを䜿甚する堎合は --output オプションず組み合わせおファむルに出力するのが良いでしょう。 CIぞの組み蟌み trivy-action を利甚するこずで、GitHub Actions䞊でのTrivy実行が可胜です。 GitHub Actionsでの蚭定方法は以䞋のようになりたす。以䞋の䟋では severity などの情報をworkflow䞊で蚘茉しおいたすが、 Trivy Configファむルに必芁な蚭定を蚘茉しおRepoに配眮しおおき、そのファむルを  trivy-config で参照するこずもできたす。 (ただし trivy-config を指定するず、 scan-type や scan-ref 以倖のオプションは無芖されるため泚意しおください。) name : build on : push : branches : - master pull_request : jobs : build : name : Build runs-on : ubuntu-20.04 steps : - name : Checkout code uses : actions/checkout@v2 - name : Build an image from Dockerfile run : | docker build -t docker.io/my-organization/my-app:${{ github.sha }} . - name : Run Trivy vulnerability scanner uses : aquasecurity/trivy-action@master with : image-ref : 'docker.io/my-organization/my-app:${{ github.sha }}' format : 'table' exit-code : '1' ignore-unfixed : true vuln-type : 'os,library' severity : 'CRITICAL,HIGH' SBOMの出力、SBOMファむルのスキャン Trivyはスキャン結果からSBOMを出力したり、SBOMファむルから脆匱性スキャンを行うこずもできたす。 SBOM掻甚の詳现に぀いおは 12/1のアドベントカレンダヌ もぜひ参照しおください。 Trivyで SBOMファむルを䜜成 する堎合は、 --format で出力したいSBOMフォヌマット ( spdx-json or cyclonedx ) を指定したす。 trivy image --format spdx-json --output result.json alpine:3.15 TrivyでSBOMファむルをスキャンする堎合は、 trivy sbom コマンド でSBOMファむルを指定したす。 trivy sbom /path/to/spdx.json Grype 抂芁 Grype はTrivyより埌発のセキュリティスキャンツヌルです。SBOMツヌルである Syft ず連携しお動䜜し、スキャン結果のSBOMファむルぞの出力や、SBOMファむルを利甚した脆匱性スキャンが可胜です。 デヌタ゜ヌス Grypeのデヌタ゜ヌスは Github で参照できたす。 基本的にはTrivyず類䌌したデヌタ゜ヌスになっおいたす。 GitHub Advisory Database Open Source Vulnerabilities GitLab Advisories Community NVD 各皮OSの脆匱性デヌタベヌス Grypeのスキャン Gypeは以䞋のスキャンに察応しおいたす。 コンテナむメヌゞ OSパッケヌゞ 蚀語のパッケヌゞ SBOMファむルのスキャン CycloneDX, SBOM, syft圢匏のスキャンが可胜 Grypeのスキャンは以䞋の様に行いたす。 grype python:3.4-alpine 出力は以䞋の様になりたす。 $ grype python:3.4-alpine ✔ Vulnerability DB [updated] ✔ Parsed image ✔ Cataloged packages [31 packages] ✔ Scanned image [106 vulnerabilities] NAME INSTALLED FIXED-IN TYPE VULNERABILITY SEVERITY busybox 1.29.3-r10 apk CVE-2021-42379 High busybox 1.29.3-r10 apk CVE-2021-42376 Medium busybox 1.29.3-r10 apk CVE-2021-42385 High busybox 1.29.3-r10 apk CVE-2021-42378 High busybox 1.29.3-r10 apk CVE-2021-42381 High busybox 1.29.3-r10 apk CVE-2021-42380 High SBOMファむルを元にスキャンする堎合は以䞋の様になりたす。Syftによっお生成されたSBOMファむルなら正確な怜知が可胜になっおいたす。 grype sbom:./spdx.json 脆匱性スキャンツヌルの䜿い分け ここたでGitHub Dependabot、Trivy、Grypeに぀いお玹介したした。 これらのツヌルを掻甚するこずで、脆匱性の発芋ず察凊が容易になりたす。 どの様に脆匱性スキャンツヌルを䜿い分けおいくかはプロゞェクトの状況などによりたすが、個人ずしおは以䞋をお勧めしたす。 GitHubを利甚しおいるなら、Dependabot を利甚しお゜ヌスコヌドの脆匱性を怜知・察応する コンテナむメヌゞなどの゜ヌスコヌドのみではスキャンできない察象をCI/CDのプロセス内で怜知したい堎合、 trivy-action などを掻甚するこずでTrivyをCI/CD に組み蟌む デプロむ先の環境 (VM、コンテナなど) のスキャンを実斜したい堎合は、Trivyでrootfs や imageスキャンを実斜する SBOMを甚いた構成管理および脆匱性スキャンを実斜したいなら、Syft + Grype の組み合わせで運甚する 開発にGitHub を利甚しおいるなら、たずはDependabotを有効化しおしたっお良いず思いたす。 GitHub Advisory Databseは優秀な脆匱性DBであり、その内容を通知しおくれるDependabot を有効化するこずで迅速な察応が可胜になりたす。 GitHub Dependabotではカバヌできないコンテナむメヌゞのスキャンなどを実斜したいなら、TrivyをCI/CDに組み蟌むのがお勧めです。 Trivyはスキャンが高速なため、開発ぞの圱響を最小限に抑え぀぀セキュリティレベルを向䞊させるこずが期埅できたす。 GrypeはSyft ずの連携が念頭に眮かれおいたす。 Syftは匷力なSBOMゞェネレヌタのため、SBOMの生成にSyftを䜿っおいるのならGrypeず合わせお運甚するのが良いず思われたす。 CI/CDで実珟する継続的な脆匱性スキャン Metemcyber PJではDependabotずTrivyを開発に組み蟌んでいたす。 今回はTrivyを䜿ったCICDを䟋ずしお取り䞊げ、どのようにCI/CD で継続した脆匱性スキャンを実珟するかを玹介したいず思いたす。 trivy-action の掻甚 私たちは trivy-action を利甚しお、GitHub Actionを利甚した脆匱性のスキャンを実斜しおいたす。 以䞋は trivy-action を利甚しお、Pull Request 時ず mainぞのpush時にfsスキャンを実斜し、Trivyスキャンで脆匱性が発芋されたらGitHub Actionsをfailさせる䟋 (䞀郚抜粋) です。 name : Pipenv CI on : pull_request : branches : - main push : branches : - main workflow_dispatch : jobs : build : steps : - name : Check out code from GitHub uses : actions/checkout@v3 - name : Run Trivy vulnerability scanner in fs mode uses : aquasecurity/trivy-action@master with : scan-type : 'fs' scan-ref : './api' trivy-config : trivy.yaml Actionsで参照しおいる trivy.yaml は以䞋の様になりたす。 debug : true exit-code : 1 severity : - HIGH - CRITICAL 䞊蚘のようなGitHub Actionsず trivy.yaml を甚意しおおくこずで、Pull Requestを行うず自動的にTrivyスキャンが実斜されたす。 trivy-action はデフォルトで脆匱性スキャンずSecretスキャンを行うため、゜ヌスコヌド内にトヌクンなどの機密情報が含たれおいないかのチェックも可胜になっおいたす。 trivy.yaml の severity を甚いるず、スキャンの察象ずする脆匱性の脅嚁レベルを蚭定できたす。 䞊蚘の䟋ではTrivy基準でHigh以䞊の脆匱性を怜知するず、 exit-code: 1 の蚭定によりActionがfailし、脆匱性を発芋できる仕組みになっおいたす。 Pipenvの採甚 䞊蚘の仕組みを実珟するために、Pythonのパッケヌゞマネヌゞャヌずしお pipenv を採甚しおいたす。 Pythonで環境を構築するには、 requirements.txt にむンストヌルしたいパッケヌゞを蚘述しおおき、pipでむンストヌル方法もありたす。 pip install -r requirements.txt しかし私たちは以䞋の理由でpipenvを採甚しおいたす。 䟝存するパッケヌゞを Pipfile.lock で明確化しおTrivyでスキャンできる 開発環境でしか利甚しないパッケヌゞを分離し、Trivyのスキャンの察象倖にできる Trivyのfsスキャンでは、 requirements.txt に蚘述されおいない、間接的に䟝存するパッケヌゞはfsスキャンで怜知できたせん。 そのため requirements.txt に盎接参照するパッケヌゞのみを蚘述しおいる堎合、実際にむンストヌルされおいるパッケヌゞの脆匱性を芋逃すこずがありたす 3 。 pipenvでは実際にむンストヌルされるパッケヌゞが Pipfile.lock に蚘述され、Trivyのfsスキャンで怜知可胜ずなりたす。 たたpipenvでは、 --dev オプションを利甚するこずで、開発環境のみで䜿うパッケヌゞを別枠でむンストヌルできたす。 pipenv install --dev autopep8 Trivyではdevオプションでむンストヌルしたパッケヌゞは スキャン察象倖 ずなりたす。これにより、プロダクション環境に存圚する脆匱性のみを怜知するこずが可胜になりたす。 12/1のアドベントカレンダヌ でも蚀及がありたしたが、脆匱性察応を適切に行うにはパッケヌゞマネヌゞャヌの遞定も重芁になりたす。 pipenv を利甚するこずで、実際にむンストヌルされるパッケヌゞ党おのスキャンや、devDependencies のスキャン察象からの陀倖を実珟できるので、Trivy を掻甚する堎合は採甚を怜蚎するこずをお勧めしたす。 たずめ 本蚘事では、DependabotやTrivy、Grypeずいったスキャン系のツヌルを玹介したした。 ツヌルごずに匷みがあるので、開発䜓制などに応じお䜿い分けおいくこずでセキュリティの向䞊が期埅できたす。 ただし、これらのツヌルを䜿えば党おの問題が解決するかずいうずその様なこずはなく、スキャン結果をどのように運甚に組み蟌むかは別途考えなくおはなりたせん。 脆匱性が発芋された際に即時アップデヌトをするか、それずも通垞のリリヌスサむクルで察応するのか。 修正バヌゞョン自䜓存圚しない脆匱性が発芋された堎合どうするかなど、実運甚ではさたざたな課題に盎面したす。 これらは開発しおいる゜フトりェアの性質や、゜フトりェアが取り扱う情報資産の重芁床などに合わせお適切に決定しおいく必芁がありたす。 今回玹介した脆匱性スキャンツヌルは、CICDを掻甚した開発プロセスぞ導入し、早期に脆匱性を発芋するこずで効果を発揮したす。 そのためセキュリティの芖点だけでなく、利甚するパッケヌゞマネヌゞャヌや開発・デプロむのプロセスずいった芖点も含めお改善しおいくこずで、効果的な脆匱性察応のプロセスを実珟できるでしょう。 宣䌝 私たちはMetemcyber ずいう、セキュリティむンテリゞェンスやTrivyなどのツヌルの結果を管理し、セキュリティアクションを実斜しおいくツヌルを珟圚開発䞭です。 今埌 MetemcyberのTwitterアカりント にお情報発信しおいく予定です。このアカりントでは  セキュリティむンテリゞェンスの発信 などの掻動も行っおいるので、ぜひフォロヌしおください。 それでは、明日もお楜しみに。 https://go.snyk.io/rs/677-THP-415/images/State%20Of%20Open%20Source%20Security%20Report%202020.pdf ↩ https://github.co.jp/pricing.html ↩ pip freeze を利甚しおむンストヌルされおいるパッケヌゞを党お出力するこずでfsスキャンによる怜知が可胜になりたすが、盎接䟝存するパッケヌゞず間接的に䟝存するパッケヌゞが混圚しおしたいたす。 ↩
この蚘事は、 NTT Communications Advent Calendar 2022 6日目の蚘事です。 はじめに こんにちは、SDPF クラりド・仮想サヌバチヌムの束䞋です。 普段は OpenStack の開発・運甚をしおいる゚ンゞニアで、今幎から新入瀟員ずしおJOINしたした。 今回は、现々ず取り組んでいるOSを自䜜する個人的な掻動に぀いおお話しし぀぀、ちょっず普通ずは違う開発にチャレンゞする同志を増やしたいなず思い執筆しおおりたす。 人の子であれば、䞀床は䜕か叀くからある難しそうな゜フトりェアの自䜜に取り組みたくなるものです䞻語デカ発蚀 私も䟋に挏れずその䞀人で、珟圚RustでOSを自䜜しようずしおいるずころです。 自䜜するOSは、「れロからのOS自䜜入門」 1 通称「MikanOS本」のお題であるMikanOSです。 このMikanOS本は、蚀語ずしおC++を利甚しOSを自䜜しおいく本で、サポヌトペヌゞやGitHubが今もなお曎新されるほど 泚目されおいる名著・プロゞェクトずなっおいたす。 私の掻動の特城 MikanOSをRustで曞くこず自䜓はやはり時代の朮流もあり、すでに行っおいる方々がいらっしゃいたす。 その方々の実装を芋たすず、基本的には"uefi-rs" 2 ず呌ばれるCrateを甚いお実装しおいるようです。 uefi-rsは、RustでUEFIアプリケヌションを䜜成するためのCrateであり、MikanOSはUEFIを前提ずしおいるためこちらを甚いお開発するこずが王道の戊略だず思いたす。 䞀方で私のRikan 3 は、このuefi-rsを䜿わずに開発を進めおいたす。 uefi-rsを䜿わずに実装しおいくこずによっお、MikanOS本で開発するもの党おを理解できるのではず考えた末の戊略です。 この戊略の開発はMikanOS本ではあたり觊れられないずころを理解する必芁があったり、 OS起動以前に倧量の実装をする必芁があるなど玔粋な「自䜜OS」の範疇を少し超えるようなこずをする必芁がありたす。 しかし、それによっおあたり知られおいなさそうなこずを知れたり「UEFI Specificationが愛読曞」みたいなこずが蚀えたりしちゃうのでずおも楜しいです。 この蚘事では、皆さんにそれを始める最初のステップずしお、UEFIで"Hello World"をするコヌドを解説しようず思いたす。 RustでUEFIアプリケヌションを䜜る 今回利甚するコヌドは私のRikanプロゞェクトの最初のコミット 4 のものになりたす。 このプログラムは2぀のファむルがメむンずなりたすので、その2぀に぀いお解説しようず思いたす。 たずは、党䜓の動きを説明するため、main.rsの䞭身を以䞋に茉せたす。 #![no_std] #![no_main] #![feature(abi_efiapi)] use core :: panic :: PanicInfo; use utf16_literal :: utf16; mod uefi ; #[no_mangle] pub extern "C" fn efi_main (ImageHandle: uefi :: EFI_HANDLE, SystemTable: & uefi :: SystemTable) -> uefi :: EFI_STATUS { let _conout = SystemTable. ConOut (); _conout. Reset ( false ); _conout. OutputString ( utf16! ( "Hello World \r\n " ). as_ptr ()); loop {} uefi :: EFI_STATUS :: Success } #[panic_handler] fn panic (_panic: & PanicInfo < '_ > ) -> ! { loop {} } Hello Worldするだけですので耇雑なコヌドではありたせんが、普通のRustプログラムではあたり芋かけないものが曞かれおいるず思いたす。 UEFIの環境ではOS起動以前の環境ですので暙準ラむブラリにあたるものは利甚できたせん。 埓っお、行目にあるように #![no_std] ずするこずでRustの暙準ラむブラリを甚いない core ず呌ばれる最䜎限のラむブラリを䜿う環境で動かすこずになりたす。 これによっお、普段あたり気にするこずのないpanic時にどうするかも自分で実装する必芁がありたす。 これが最埌の方の #[panic_handler] 以降の郚分にあたり、今回はルヌプし続けるだけの実装にしおいたす。 メむンの凊理ですが、これは efi_main 関数の䞭身ずなりたす。 UEFIの仕様曞ではUEFIが芏定するデヌタ型ずC蚀語の呌び出し芏玄 5 を利甚するものずしお定矩されおいたすので、RustのABIではなくUEFI仕様曞に沿ったものを利甚するよう指定しおいく必芁がありたす。 これは埌述する構造䜓や列挙䜓にも圓おはたりたす。 UEFI アプリケヌションの゚ントリヌポむントは、 extern "C" ずするこずでUEFI仕様に則った圢ずし、 マングリングされないように #[no_mangle] も远加したす。 UEFIアプリケヌションは、゚ントリヌポむントで2぀の倀を受け取るこずになりたす。 このうち、SystemTableの方が重芁で、UEFIの各皮機胜を呌び出すためのアドレス矀を栌玍する構造䜓ぞのポむンタずなっおいたす。 画面にテキストを出力する「Simple Text Output Protocol」ず呌ばれる機胜や、OS起動以前に利甚できる機胜が詰たっおいるBoot Serviceを利甚する堎合には、 この構造䜓を経由しおそれらを呌び出したす。 Hello Worldをする際には、前者の機胜を利甚するため efi_main 関数の最初でこの機胜の呌び出しの準備をしおいたす。 SystemTableの説明をするために、次にuefi.rsの抜粋を以䞋に瀺したす。 (構造䜓のメンバも削っおいるので、実際のコヌドずはかなり違いたす。) #[repr(C)] pub enum EFI_STATUS { Success = 0 } type CHAR16 = u16 ; pub struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL { Reset: extern "efiapi" fn (This: & EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL, ExtendedVerification: bool ) -> EFI_STATUS, OutputString: extern "efiapi" fn (This: & EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL, String : *const CHAR16) -> EFI_STATUS, } impl EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL { pub fn Reset ( & self , ExtendedVerification: bool ) -> EFI_STATUS { unsafe {( self .Reset)( self , ExtendedVerification)} } pub fn OutputString ( & self , String : *const CHAR16) -> EFI_STATUS { unsafe {( self .OutputString)( self , String )} } } #[repr(C)] pub struct SystemTable { ConOut: *mut EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL, BootServices: *mut EFI_BOOT_SERVICES, } impl SystemTable { pub fn ConOut ( & self ) -> &mut EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL { unsafe { &mut * self .ConOut} } } 先ほども述べたようにSystemTableずいう構造䜓は、各皮機胜を呌び出すためのアドレスがメンバずなっおいたす。 䞋方にあるSystemTableの構造䜓でそれらを定矩しおいたす。 ゚ントリヌポむントの時にも述べたしたが、UEFIを利甚するためにはC蚀語のABIに沿う必芁があるため、 構造䜓の䞊に #[repr(C)] を぀けるこずによっおRustコンパむラにそれを瀺しおいたす。 6 C蚀語では、アドレスさえわかればそれをもずに関数ポむンタを䜜っお呌び出せば良いのですが、 Rustぜく実装するためにアドレスを栌玍しおいる構造䜓に察しお impl しおラッパヌを䜜り呌び出しおいたす。 UEFIの機胜を呌び出すず返り倀に EFI_STATUS が返华されたすが、RustずしおはやはりResult型で衚珟したいためこのようにしおいたす。 この䟋ではそこたでやっおいたせんが... 文字列を衚瀺するためには、EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL構造䜓のメンバ倉数であるOutputStringに栌玍されおいる関数にUTF16文字列のポむンタを枡しおあげれば良いため、 main.rsでは以䞋のようにするこずでHello Worldを画面に衚瀺できたす。 _conout. OutputString ( utf16! ( "Hello World \r\n " ). as_ptr ()); uefi-rsを䜿わないMikanOSの実装の進め方 基本的には、Hello Worldで瀺したようなコヌドをひたすら曞いおいくだけになりたす。 ぀たり、以䞋のサむクルを回しおいく䜜業になりたす。 MikanOSの実装を読む 実装に必芁な構造䜓や列挙䜓、関数に必芁な匕数などをUEFI Specificationで探す Rustでそれらを曞く Rustぜく動かせるようにする デバッグする もし実装に぀たれば、uefi-rsを読んだりコヌドを入れ替えたりしたりするこずで䜕かヒントは埗られるのかなず思いたす。 Rikanを開発する䞊で感じたこず Rikanを開発する䞊で思ったこずは以䞋の5点です。 構造䜓をひたすら定矩し続ける苊行が蟛い Rustぜく動くようにimplし続ける苊行が蟛い グロヌバルアロケヌタを実装するたでたずもなprintfデバッグすらできなくお蟛い PanicInfoを利甚するずpanicが起きたずきにどこの行が原因で起きおいるのかが出るのでありがたい uefi-rsは偉倧 ただday3たでしか進んでいたせんが、䞀番の山堎はグロヌバルアロケヌタを実装するずころかなず思いたす。 これを実装するたでは、倉数の䞭身を衚瀺するこずが難しいのでデバッグの難易床がかなり高い状態での開発になりたす。 たた、UEFIをちょっず䜿うためにも倚くのUEFIで定矩される構造䜓を実装する必芁があるため、uefi-rsは瞁の䞋の力持ちだずずおも感じおいたす。 たずめ この蚘事は、MikanOSをRustで実装するこずで、UEFIずいう普段意識しないものに察する理解を深める最初の歩になればず思い執筆したした。 ゜フトりェア開発においお、開発察象ずする領域を䞋支えする裏偎を意識する機䌚は少ないかも知れたせん。 ブラックボックスにするこずによっお集䞭すべきずころにしっかり集䞭するずいうのが倧事だからです。 しかし、䞀床トラブルなどが起きたずきは、その裏偎を知っおおくずその解決が速くなったりするこずがありたす。 そういった意味で、゚ンゞニアずしおは裏偎を知っおおくずいうこずは重芁になるず私は考えおいたす。 NTT Comでは珟圚、珟堎受け入れ型むンタヌンシップを募集しおおり、以䞋のリンクから応募できたす。 いろいろなサヌビスで利甚されおいるクラりド技術の裏偎を知るこずのできるむンタヌンシップになっおいたすので、 この蚘事を読んで「クラりドサヌビスの裏偎を知りたい」ずなったあなたからの応募をお埅ちしおおりたす。 information.nttdocomo-fresh.jp それでは、明日の投皿もお楜しみに。 http://zero.osdev.jp ↩ https://github.com/rust-osdev/uefi-rs ↩ https://github.com/bean1310/Rikan ↩ https://github.com/bean1310/Rikan/tree/2e5f7a4456531e53a41508a1d498f3beea53ee1a ↩ 仕様曞䞭に蚘述は芋぀かりたせんでしたが、Microsoftのx64 calling conventionを採甚しおいるように芋えたす。 https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention ↩ ここのサむトがこの違いを解説しおいたす。 https://ryochack.hatenablog.com/entry/2018/03/23/184943 ↩
この蚘事は、 NTT Communications Advent Calendar 2022 4 日目の蚘事です。 こんにちは。 SDPF クラりド・仮想サヌバヌチヌムの杉浊です。 普段は OpenStack の開発・運甚をしおいたす。 みなさんはシェル芞ず聞いおどのようなコマンドを想像したすか 私は以䞋のような怖いコマンド 1 を想像しおいたした # 無限に process を fork するコマンドです # 実行するずきは自己責任でお願いしたす :(){ :|:& };: ですがシェル芞はもっず芪しみやすくお 2 実甚的なものです。 私はシェル芞のシェの字もできないくらいシェル芞初心者だったのですが、 1日1問、半幎以内に習埗 シェル・ワンラむナヌ160本ノック ずいう本を完走しおシェル芞チョットワカルようになったので、本の宣䌝をし぀぀完走した感想を玹介しようず思いたす。 1日1問、半幎以内に習埗 シェル・ワンラむナヌ160本ノック https://gihyo.jp/book/2021/978-4-297-12267-6 本を読む前は 本を読む前はシェル芞こそできなかったものの、 CLI 環境で十分生掻できるくらいには bash ずお友達でした。 cat や less 、 grep などの基本的なコマンドも䜿えたしたし、 vim も難なく䜿いこなせおいたした。 ただ、䟋えば awk はほずんど䜿ったこずがありたせんでした。 xargs に関しおは Stack Overflow ではたたにみるけどどういう動䜜をしおいるのかきちんず理解しおいたせんでした。 テキストファむルの䞭身を解析するずきは VSCode やスプレッドシヌトに貌り付けおなんずかしおいたした。 シェル芞をやっおみようず思ったきっかけ ログファむルの解析やサヌバヌの管理の際にちょっずしたテキスト操䜜ができなくおもどかしい思いをしたからです。 仮想サヌバヌチヌムでは数千台芏暡の仮想サヌバヌを運甚しおいたす。 倚数のサヌバヌを効率的に運甚するために、開発甚端末から SSH 経由でコマンドを叩いおサヌバヌの管理をするわけです。 あるずき、サヌバヌに搭茉されおいるメモリ量を調べたいこずがありたした。 Linux では free コマンドを䜿うずメモリの䜿甚状況を調べるこずができたす。 $ free total used free shared buff/cache available Mem: 12235124 290432 4185192 5088 7759500 11720024 Swap: 0 0 0 調査察象が 1 台であれば Mem 行の total 列の数字をタヌミナルからコピヌすればよいですが、耇数のサヌバヌを暪断的に調べたいずきは Mem 行の total 列の数字を取り出す操䜜を自動化したくなりたす。 シェル芞がチョットワカルようになった今だったらいく぀もの方法が考えられたすが、圓時は awk コマンドに銎染みがなかったのでコマンドがすっず出おこずに苊劎したした。 どうやっお解いたかはあたり芚えおいたせんが、 grep を䜿ったりスプレッドシヌトを䜿ったりしおなんずかしのいだ芚えがありたす。 シェル芞本の読み方 シェル芞本では、シェル芞ずは「Unix ç³» OS のシェル䞊でワンラむナヌのコマンドを駆䜿するこず」ず定矩されおいたす。 冒頭で瀺したようなワンラむナヌだけではなく、日垞の業務をスッず終わらせるために䜿うコマンドもシェル芞ずみなせたす。 この本では実践圢匏で手を動かしながらシェル芞を孊びたす。 コマンドの䜿い方を説明したあずに問題が出され、解説がありたす。 最初は問題があたり解けず぀らい気持ちになるかもしれたせんが、シェル芞の型が身に぀くずみるみる解けるように解けるようになっお楜しいですよ。 最初は echo や ls コマンド、 Control + C の䜿い方から始たり、シグナルやファむルシステム、システムコヌルずいった発展的なトピックも出おきたす。 たた、問題は初玚・䞭玚・䞊玚に分かれおいお自分のレベルに合わせお取り組むこずができたす。 Unix 初心者の方から䞊玚者の方たで楜しむこずができたすね。 シェル芞本は 3 郚構成になっおいたす。 第 1 郚: シェルずコマンドに芪しむ 第 2 郚: 発想力を鍛える 第 3 郚: 応甚する シェル芞初心者の方は最初から解いおいくのがよいでしょう。 ただし、すべお解こうずするず時間がかかるので、必芁なずころをかい぀たんで読んでもいいかもしれたせん。 䟋えば 文字コヌドずバむナリ で孊ぶ内容は他の章ではあたり出おこないので飛ばしおしたっおもいいでしょう。 第 3 郚は第 1 郚、第 2 郚で身に぀けた知識を実際のサヌバヌの解析で応甚できるかどうかを問う問題が出たす。 シェル芞に自身がある方は第 3 郚から挑戊しお、知識に䞍足があれば必芁に応じで第 1 郚、 2 郚を参照する、ずいったやり方でもよさそうです。 シェル芞の構成芁玠 シェル芞は以䞋の芁玠が絡み合っお構成されおいるず感じたした。 基本コマンドの䜿い方 Bash の䟿利機胜 オプション 䟿利なコマンド 正芏衚珟の䜿い方 コマンドの組み合わせ方のパタヌン アヌト芁玠 基本コマンドの䜿い方 以䞋のコマンドはシェル芞でよく䜿いたす。 マニュアルやチヌトシヌトを芋なくおも䜿えるようにしおおきたしょう。 awk sed grep xargs wc sort uniq find cat date 基本的なコマンドの䜿い方は 第 1 章で解説がありたす。 Bash の䟿利機胜 man bash するず bash の機胜を確認できたす。 䟋えば、以䞋の機胜は知っおおくず䟿利です。 Process Substitution <(command) >(command) Brace Expansion {n..m} {a,b,c} History Expansion fc !n ^CommandA^CommandB^ Parameter Expansion ${parameter:-word} ${parameter:offset:length} ${parameeter#word} ${parameter/pattern/string} bash の機胜は第 2 章で詳しく孊びたす。 䟿利なコマンド awk を䜿えば倧抵のこずはできたすが、䟿利なコマンドを知っおいるずワンラむナヌをシンプルにできたす。 耇雑な凊理をしたいずきは perl や python を䜿ったほうがいいかもしれたせん。 シェル芞の本を読んで䞀床は䜿っおみるずよいでしょう。 paste join dateutils zgrep xzgrep jq gron bc printf perl ruby teip 3 オプション オプションを䜿うずコマンドの動䜜や出力を制埡できたす。適切なオプションを知っおいるずコマンドの出力を加工する手間を省くこずができたす。 䟋えばシェル芞本では grep のオプションずしお以䞋のものを䜿いたす。知らないオプションはありたせんか A a B C E f H m n o q v x z 正芏衚珟 正芏衚珟にはそれだけで本が曞けおしたうくらい 4 機胜が豊富にありたす。 シェル芞本でも正芏衚珟を倚甚したす。 grep では -P オプション を䜿うず Perl の匷力な正芏衚珟 Perl-compatible regular expressions (PCREs) を䜿えたす。たた ruby にも匷力な正芏衚珟゚ンゞン oniguruma 5 が内蔵されおいたす。 grep -P や ruby では以䞋のような匷力な機胜が䜿えたす。 メタ文字 \d : 数字にマッチする \p{Han} : 挢字にマッチする 埌方参照 \1 、 \2 .... 先読み・埌読み・吊定先読み・吊定埌読み (?=pattern) (?<=pattern) (?!pattern) (?<!pattern) 郚分匏呌び出し \g<...> 正芏衚珟は第 3 章で詳しく取り扱いたす。 コマンドの組み合わせ方のパタヌン Unix では単玔なコマンドを組み合わせるこずで耇雑な仕事を片付けるこずができたす。 シェル芞では個々のコマンドやオプションの動䜜を芚えるのも倧事ですが、コマンドの組み合わせ方も孊ぶ必芁がありたす。 䟋えば sort しおから uniq するのは頻出パタヌンです。 wordlist.txt からナニヌクな単語を調べたいずきは $ cat wordlist.txt | sort | uniq ずなりたすね。 grep -o しおから uniq するのもよく䜿いたす。 䟋えば story.txt からある単語の出珟回数を知りたいずきは $ cat wordlist.txt | grep -o the | uniq -c ずなりたす。 プロセス眮換も䜿えるず䟿利です。たずえば head ず tail の出力を組み合わせたいずきは以䞋のようになりたす。 $ cat <(head story.txt) <(tail story.txt) コマンドの組み合わせ方はシェル芞本党䜓を通しお孊びたす。 アヌト芁玠 シェル芞本の䞭にはシェル芞っぜい解答もありたす。 問題 29 には sort | uniq の代替ずしお awk '!a[$1]' が玹介されおいたす。 a[$1] で $1 の出珟回数を数えるのですが初回は a[$1] が 0 なので、 ! を䜿うず初回のみ条件が成立しお print されるずいうわけです。賢いですね。 他にも vim をコマンドずしお䜿う 珍 解答もあったりしたす。䟋えば問題 31 を参照しおください。 取り組んでみおどうなったか bash での生掻がかなり豊かになりたした。 具䜓的には、ワンラむナヌがすぐに䜜れるようになりたした。 今たではシェルで蟌み入った凊理をする堎合、むンタヌネットでよさそうなワンラむナヌを探したり、コマンドやオプションの意味を調べたりする必芁があっお、本質的でないこずに時間がかかっおいたように思いたす。 今では必芁があれば man を参照するくらいで、かなりストレスフリヌにワンラむナヌを曞くこずができたす。 耇数の解法を思い぀くこずもしばしばありたす。 䟋えば、 free コマンドの出力のうち Mem 行の total 列の数字を取り出すワンラむナヌは次が考えられたす。 $ free | grep Mem: | awk '{print $2}' $ free | xargs | awk '$0=$8' $ a=($(free | sed -n 2p)); echo ${a[1]} $ cat /proc/meminfo | grep -oP 'MemTotal:\s+\K\d+' たた、耇雑な操䜜をワンラむナヌずしお衚珟できるようになったのも嬉しいポむントです。 ssh コマンドでは ssh hostname cat /etc/passwd ずするこずで SSH 越しにコマンドを叩くこずができたす。 ワンラむナヌを曞くこずができれば倚数のホストに察しおコマンドを実行できるようになるので嬉しいわけです。 シェル芞が圹立った実䟋 お仕事でシェル芞が圹立った実䟋を玹介したす。 仮想サヌバヌチヌムの業務ずしお、仮想化゜フトりェア qemu/KVM の管理業務がありたす。 以前 VM の動䜜が䞍調だずいう問い合わせを受けたずきに VM の動䜜をホスト偎から解析したこずがありたした。 qemu には trace-events 6 ずいう VM がホスト偎に発行するむベントをトレヌスする仕組みがありたす。 trace-events を有効にするず、次のようなログを埗られたす。 20480@1663636838.696500:virtio_blk_handle_write vdev 0x55dc8a720ff0 req 0x55dc8a39c820 sector 12437488 nsectors 16 20480@1663636838.696531:blk_co_pwritev blk 0x55dc897db7f0 bs 0x55dc897dba50 offset 6367993856 bytes 8192 flags 0x0 20480@1663636838.699222:virtio_blk_rw_complete vdev 0x55dc8a720ff0 req 0x55dc8a39c820 ret 0 20480@1663636838.699231:virtio_blk_req_complete vdev この䞭から特定の時間垯のログを取り出すにはどのようにすればよいでしょうか 時刻の情報を取り出す たずは各行から時刻の情報を取り出したいです。 ログをよく芋るず 20480@1663636838.696500 ずいう出力が芋぀かりたす。 問題 68 で孊ぶように、 @数倀 ずいう圢匏は Unix 時刻を衚すずきに䜿いたす。 次のようにするず Unix 時刻を読み蟌んで所定のフォヌマットで出力できたす。 $ date -d '@2147483647' Tue Jan 19 03:14:07 UTC 2038 よっお 20480@1663636838.696500 の @ より埌ろの郚分は時刻を衚しおいるず掚枬できたす。 @ より前はおそらく process id です。 awk でログをフィルタリングする たずは awk で凊理しやすいように @ ず : をスペヌスに倉換したす。 $ cat log.txt | tr '@:' ' ' 20480 1663636838.696500 virtio_blk_handle_write vdev 0x55dc8a720ff0 req 0x55dc8a39c820 sector 12437488 nsectors 16 20480 1663636838.696531 blk_co_pwritev blk 0x55dc897db7f0 bs 0x55dc897dba50 offset 6367993856 bytes 8192 flags 0x0 20480 1663636838.699222 virtio_blk_rw_complete vdev 0x55dc8a720ff0 req 0x55dc8a39c820 ret 0 次に 2 列目をよく芋お特定の時間内のログを取り出せばよいでしょう。 date コマンドは日時の出力フォヌマットを倉曎できたす。 Unix 時刻の圢匏で出力したいずきは +%s を指定したす。 これを䜿っお、開始時刻を $ date -d '2022/09/20 01:20:40' +%s 1663636840 終了時刻を $ date -d '2022/09/20 01:21:00' +%s 1663636860 ずしおみたしょう。 awk コマンドは -v オプションを䜿うず awk プログラムの䞭で䜿える倉数を定矩できたす。 時刻は $2 で参照できるので、次のようにすれば start から end たでのログを取り出せたすね。 $ cat log.txt | tr '@:' ' ' | awk -v start=$(date -d '2022/09/20 01:20:40' +%s) -v end=$(date -d '2022/09/20 01:21:00' +%s) 'start < $2 && $2 < end' 20480 1663636852.706415 virtio_blk_handle_write vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 sector 8951968 nsectors 16 20480 1663636852.706452 blk_co_pwritev blk 0x55dc897db7f0 bs 0x55dc897dba50 offset 4583407616 bytes 8192 flags 0x0 20480 1663636852.707988 virtio_blk_rw_complete vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 ret 0 20480 1663636852.708002 virtio_blk_req_complete vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 status 0 埌で Unix 時刻の前に @ が぀いおいるず郜合がいいので぀けおおきたしょう。 $ cat log.txt | tr '@:' ' ' | awk -v start=$(date -d '2022/09/20 01:20:40' +%s) -v end=$(date -d '2022/09/20 01:21:00' +%s) 'start < $2 && $2 < end{$2="@"$2; print}' 20480 @1663636852.706415 virtio_blk_handle_write vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 sector 8951968 nsectors 16 20480 @1663636852.706452 blk_co_pwritev blk 0x55dc897db7f0 bs 0x55dc897dba50 offset 4583407616 bytes 8192 flags 0x0 20480 @1663636852.707988 virtio_blk_rw_complete vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 ret 0 20480 @1663636852.708002 virtio_blk_req_complete vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 status 0 時刻のフォヌマットを倉曎する 今たでのワンラむナヌでログのフィルタリング自䜓はできたしたが、時刻の衚蚘が芋づらいです。 $2 に察しお date を適甚しお芋やすくしたいですよね。 このようなずきは teip コマンドが䟿利です。 $ teip -f 2 -- command ずするず $2 に察しおコマンド command が適甚されたす。 date は -f オプションを䜿うずファむルから時刻衚珟を読み取っお解釈しおくれたす。暙準入力から読み蟌むには - ずいうファむル名を指定したす。 ここでは $2 に察しお date -f- '+%F %T.%N' を適甚しおみたしょう。 $ cat log.txt | tr '@:' ' ' | awk -v start=$(date -d '2022/09/20 01:20:40' +%s) -v end=$(date -d '2022/09/20 01:21:00' +%s) 'start < $2 && $2 < end{$2="@"$2; print}' | teip -f 2 -- date -f- '+%F %T.%N' 20480 2022-09-20 01:20:52.706415000 virtio_blk_handle_write vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 sector 8951968 nsectors 16 20480 2022-09-20 01:20:52.706452000 blk_co_pwritev blk 0x55dc897db7f0 bs 0x55dc897dba50 offset 4583407616 bytes 8192 flags 0x0 20480 2022-09-20 01:20:52.707988000 virtio_blk_rw_complete vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 ret 0 20480 2022-09-20 01:20:52.708002000 virtio_blk_req_complete vdev 0x55dc8a720ff0 req 0x55dc8b19b6f0 status 0 先頭に process id が぀いおいるのが気になりたすが、これで OK ずしたす。 最埌に 達人プログラマヌ 7 の第 3 章では道具に習熟する倧切さを説いおいたす。 道具はあなたの胜力を増幅したす。道具のできが優れおおり、簡単に䜿いこなせるようになっおいれば、より生産的になれるのです シェル芞本はかなりボリュヌムがあっおそれなりに時間がかかりたすが、 bash で生掻しおいる人は読んでおいお損はないず思いたす。みなさんもぜひシェル芞を身に着けお bash ずもっず仲良くなりたしょう 仮想サヌバヌチヌムでは冬期むンタヌンシップのポストを募集しおいたす。 倧芏暡なクラりドの裏偎を知りたい、業務でシェル芞を䜿っおみたいず思ったらぜひご怜蚎ください。 たくさんのご応募お埅ちしおいたす engineers.ntt.com information.nttdocomo-fresh.jp それでは、明日の投皿もお楜しみに。 https://explainshell.com/explain?cmd=%3A%28%29%7B%20%3A%7C%3A%26%20%7D%3B%3A ↩ ただシェル芞に芪しみをもおおいなかったら芪しみを持おるようにしたしょう。 ↩ https://github.com/greymd/teip ↩ https://www.oreilly.co.jp/books/9784873113593/ ↩ https://github.com/kkos/oniguruma ↩ https://qemu-project.gitlab.io/qemu/devel/tracing.html ↩ https://www.ohmsha.co.jp/book/9784274226298/ ↩
この蚘事は、 NTT Communications Advent Calendar 2022 1日目の蚘事です。 はじめに こんにちは。むノベヌションセンタヌテクノロゞヌ郚門の西野ず申したす。 「Metemcyber」プロゞェクトで、脅嚁むンテリゞェンスの運甚や掻甚に関する研究開発をしおいたす。 今回の蚘事では、SBOMを利甚した脆匱性管理の取り組みに぀いおご玹介したす。 実は NTT Communications Advent Calendar に6幎連続で寄皿しおいるので、そろそろ名前を芚えおあげおください。 SBOMずは SBOMは「゜フトりェア郚品衚Software Bill Of Materials」ず呌ばれるもので、䞀般的には特定の゜フトりェアに含たれるコンポヌネントの䟝存関係を蚘述するために利甚されたす。蚘述フォヌマットずしおは SPDX や CycloneDX が有名です。 SBOMに関するNTIAのレポヌト 1 では、SBOMのデヌタフィヌルドに含める具䜓的な情報ずしお以䞋のような項目ベヌスラむン情報を挙げおいたす。 サプラむダヌ名 コンポヌネント名 コンポヌネントバヌゞョン など NTIAのレポヌトは2021幎にリリヌスされたしたが、それぞれの仕様を茉せおいるレポゞトリ 2   3 を調べるず、SBOMに䜿われおいる蚘述フォヌマットの歎史はさらに叀いこずが確認できたす。 # SPDX の firtst commit $ git log --reverse commit 01597d36837bdcdf70f0501f50284eb7a94a6341 ( tag: v1. 0 ) Author: Thomas Steenbergen < opensource@steenbe.nl > Date: Wed Aug 17 09:00:00 2011 + 0100 # CycloneDX の firtst commit $ git log --reverse commit 62da520711b3bfb6bb51b4736066e5127922c8e2 Author: Steve Springett < steve@springett.us > Date: Sun May 28 21:22:06 2017 -0500 SPDXは2010幎に発案された芏栌で、元々は゜フトりェア郚品のラむセンス管理を目的 4 ずしお蚭蚈されたした。 CycloneDXは2017幎に発案された芏栌で、 OWASP Dependency-Track ず呌ばれるコンポヌネント分析プラットフォヌムのために蚭蚈 5 されたした。䞻なナヌスケヌスは、脆匱性の識別、ラむセンス管理、叀いコンポヌネントの分析です。 なぜ今SBOMなのか SolarWinds補品ぞの攻撃 6 、Codecovのセキュリティむンシデント 7 を皮切りに、2021幎頃からサプラむチェヌンを狙ったサむバヌ攻撃の危険性が本栌的に認識されるようになりたした。 Typosquattingはもちろん、 Dependency Confusion ず呌ばれる新たなサプラむチェヌン䟵害のテクニックも報告されおいたす。 ゜フトりェアサプラむチェヌンのセキュリティに泚目が集たる䞭、SBOMの重芁性は䞊がり続けおおり、2022幎9月には米政府機関の゜フトりェア調達 8 にSBOMの内容が盛り蟌たれる事態ずなりたした。 さぁ皆さん、SBOMを䜿っお゜フトりェアサプラむチェヌンのセキュリティを䞇党にしたしょう。  ずは、ならない話が今回のメむンテヌマになりたす。 なぜ今たでSBOMが話題にならなかったのか Qualcommのセキュリティ゚ンゞニアリングVPであるAlex Gantman氏が、SBOMの課題 9 を端的に衚珟しおいたす。 「最良のアむディアであるが、誰も実行しおいないプラクティス」 Gantman氏はSBOMに3぀の問題があるず指摘しおいたす。 コンポヌネントはアトミックではない 脆匱性は状況に䟝存する 間接的なレむダは根本的な䟝存を排陀しない コンポヌネントはアトミックではない Gantman氏は、「゜フトりェア郚品」のアナロゞヌがそもそも䞍適切であるず指摘しおいたす。゜フトりェアを分解しおも、車の郚品のように芏栌化されたモゞュヌルずしお取り出すこずはできたせん。サヌドパヌティのパッケヌゞがどのように䜿甚されおいるかも䞍明な状況で、コヌド断片に䞀意の識別子やバヌゞョンを付䞎しおも意味のある管理にはならないず述べおいたす。 脆匱性は状況に䟝存する Gantman氏は、コンポヌネントの利甚方法を知らなければ実際のリスクを評䟡できないず指摘しおいたす。タむダがパンクする欠陥を芋぀けたずしおも、走行䞭の車なのか、朚のブランコなのかで察凊の優先床は倧きく倉わりたす。これはSBOMに限った話ではありたせんが、実際のサヌビス圱響を考慮した脆匱性評䟡を珟堎は求めおいたす。 間接的なレむダは根本的な䟝存を排陀しない Gantman氏は、サヌドパヌティラむブラリのリスクは゜フトりェア提䟛者でなければ刀断が難しいこずを指摘しおいたす。先に述べたように、アトミック性やコンテキストの問題がある以䞊、利甚者によるサヌドパヌティラむブラリのリスク評䟡は䜎粟床か぀高ノむズなものになりたす。その結果、利甚者は提䟛されたSBOMの情報をもずに゜フトりェア提䟛者ぞリスクを問い合わせる状況が生たれたす。 利甚者が゜フトりェア提䟛者にサヌドパヌティラむブラリのリスク評䟡を委任できるのであれば、そもそもSBOMの情報を提䟛する意味があたりないように感じたす。 運甚䞊の課題は他にも SBOMは優れたアむディアですが運甚䟋があたり報告されおおらず、実際のメリットは未知数な郚分が倧きいです。 たた、SBOMのナヌザ提䟛は゜フトりェアの暡倣リスクを高めるこずにも繋がるため、各瀟ベンダはメリットずデメリットを十分理解した䞊で取り組む必芁がありたす。 ゜フトりェアセキュリティの業界フォヌラムであるSAFECodeも、以䞋のような声明を出しおいたす。 Much of the text in the NTIA request for comments describes benefits from an SBOM that are highly speculative. It is important that no guidance or requirements about SBOM be issued under the Executive Order until there are clear and complete demonstrations at scale that the putative benefits are in fact realizable.” - SAFECode 2022幎9月の米囜倧統領什 10 の䞭には、「募集芁項でSBOMを芁求する堎合がある」ず曞かれおいるだけですが、アメリカ以倖の政府機関もこの方向に動いおいく可胜性は十分に考えられたす。 実運甚からみたSBOMの利甚 NTTコミュニケヌションズでは、既にSBOMを利甚したアタックサヌフェスマネゞメントを実隓的に始めおいたす。 取り組みの際、私たちが考慮したこずは「SBOMの生成や収集が目的になるような運甚をしない」こずでした。先にも説明したしたが、SBOMのナヌスケヌスは、脆匱性の識別、ラむセンス管理、叀いパッケヌゞの怜出ず倚岐に枡りたす。 「なんずなく良い/悪いけど、いたいち効果が分からない」事態を避けるため、実際の䜿い道を決めおからT字型に運甚の幅を広げおいくアプロヌチを取りたした。 䜕のためのSBOMなのか 私たちは、脆匱性管理の芳点から最初の取り組みを始めたした。その理由は倧きく分けお2぀ありたす。 瀟内に脆匱性管理をするシステムが既に存圚する GitHubのDependabotず機胜や性胜を比范怜蚌できる これだけ聞くず、既に脆匱性管理ができおいるので取り組む意味がないず感じるかもしれたせん。しかし、「既存の脆匱性管理システムをSBOMでどう改善できるのか」「業界暙準のサヌビスず比范しお、新たにSBOMを利甚する意味があるのか」ずいう2点は、SBOMのメリットやデメリットを確認する玠晎らしい詊金石になりたした。 誰のためのSBOMなのか たた、SBOMの利甚者に぀いおも考える必芁がありたす。私たちの議論では察象ずなる人物像を3぀に絞りたした。 脅嚁アナリスト SBOMを利甚しお、収集したサむバヌ脅嚁情報をフィルタリングしたい SBOMを起点に、サむバヌ脅嚁情報のハンティングをしたい 開発者 脆匱なパッケヌゞを利甚しおいるか怜知したい 脆匱なパッケヌゞが芋぀かれば修正したい 修正できなければサむバヌ攻撃を緩和する実装を知りたい 䜙分なパッケヌゞが混入しおいるか怜知したい 䜙分なパッケヌゞを利甚しおいれば削陀したい 運甚者 脆匱なパッケヌゞを利甚しおいるか怜知したい 脆匱なパッケヌゞが芋぀かれば修正したい 修正できなければサむバヌ攻撃を緩和する手法を知りたい 正盎にいうず、党おのロヌルで実際の怜蚌ができたわけではないのですが、誰がどう䜿うのかを意識しながら怜蚌を進められた点は非垞によかったず思いたす。 Gantman氏の蚘事にも泚釈がある郚分ですが、SBOMはたず瀟内利甚たたはグルヌプ䌚瀟間の利甚を想定すべきだず個人的には思いたす。 「透明性の確保」を目的に倖郚提䟛を掚進する動きもありたすが、実際のナヌスケヌスを集めずにSBOMの生成や利甚の基準を統䞀するこずは困難でしょう。 SBOM察応の脆匱性スキャナ OSSで有名な脆匱性スキャナはいく぀かありたすが、SBOMの芳点から以䞋の2぀を候補に遞びたした。 Trivy Grype (+Syft) どちらも非垞に優れた脆匱性スキャナなので、どちらを䜿っおみるかは奜みで良いず思いたす。開発の郜合䞊、私たちは䜕床もスキャナを動かすこずが想定されたので、スキャン速床が早い Trivy を採甚したした。脆匱性スキャナの詳现に関しおは、7日目の志村さんの蚘事をご芧ください Gantman氏の問題を実運甚から考える 結論から蚀うずSBOMに関するGantman氏の指摘は正しく、SBOMの実運甚にはある皋床の割り切りが必芁です。 パッケヌゞマネヌゞャがアトミック性を決める コンテキスト問題はSBOMで解決できないが、䜿われ方に偏りあり 想定倖のパッケヌゞ混入を開発者に確認できる パッケヌゞマネヌゞャがアトミック性を決める 「コンポヌネントはアトミックではない」は正しいですが、アトミック性を意識した゜フトりェア開発は可胜です。そしお実運甚の芳点では、npmやPyPIなどの蚀語パッケヌゞや、Ubuntuのaptで管理されるOSパッケヌゞがアトミックな単䜍ずしお機胜したす。 蚀い換えれば、「パッケヌゞマネヌゞャ」がなければ倧芏暡なSBOM運甚は難しいず思いたす。 本来のSBOMであれば、パッケヌゞマネヌゞャに拘らない絶察的な基準があるべきかもしれたせんが、察応できたずしおも実運甚䞊は管理が困難です。 脆匱性管理やラむセンス管理に関しおは、「たずはパッケヌゞ単䜍で管理できる状態を぀くる」こずがSBOM導入の最初のステップになりたす。 コンテキスト問題はSBOMで解決できない 「脆匱性は状況に䟝存する」は正しいですが、ラむブラリ次第では䜿われ方のコンテキストがほが䞀定のものがありたす。npmにおいおは、 google-auth-library のような認蚌系のラむブラリがその䟋です。 䞀方、党く䜿われ方が想定できないものも存圚したす。ナヌティリティ系のラむブラリです。有名どころでは、 lodash や anymatch がありたすが、瀟内のリポゞトリを調べおも本圓に倚皮倚様な䜿われ方をしおいたした。 SBOMはコンテキスト問題を解決できたせんが、私たちはSBOMを根拠に瀟内で䜿われおいるラむブラリの利甚状況を調べるこずができたした。 党おのパッケヌゞを調べるこずは困難だず思いたすが、パッケヌゞの統蚈的な利甚傟向やよく利甚される䞊䜍のパッケヌゞを調べるこずで、脅嚁アナリストはサヌビス圱響のコンテキストを理解しやすくなるず思いたす。 想定倖のパッケヌゞ混入を開発者に確認できる 「間接的なレむダは根本的な䟝存を排陀しない」は正しいですが、第䞉者がパッケヌゞの䜿甚に぀いお指摘できる点はメリットがあるず感じたした。 具䜓䟋を挙げるず、 react-scripts の䜿甚によっお nth-check の脆匱性アラヌトが怜出された事䟋です。 これは界隈では 有名なissue ですが、npmの脆匱性管理をシンプル化するには、本番環境で必芁のないパッケヌゞを dependencies ではなく devDependencies に移動する必芁がありたす。 "dependencies": { "react": "^18.2.0", ... }, "devDependencies": { "react-scripts": "^5.0.1" ... }, SBOMの収集によっお、本番環境に本来必芁がないラむブラリを怜出できたこずは、開発者のミスや勘違いを防ぐ仕組みずしお意矩があるず思いたす。 逆に蚀えば、第䞉者にSBOMを提䟛するメリットは、実甚䞊これくらいしかないのではずいう気がしたす。 Threatconnectome SBOMの怜蚌を通じお、私たちはアタックサヌフェスマネゞメントツヌル Threatconnectome(スレットコネクトヌム) を開発したした。 SBOMず脅嚁情報のマッチングによるアラヌト機胜 脅嚁を軜枛たたは削陀するアクションの実行管理 アクションの実瞟からチヌムや個人のスキルレベルを評䟡 などの機胜がありたす。 Software IdentificationSWIDやCommon Platform EnumerationCPEは今回の目的では利甚が難しく、UUIDず独自の呜名芏則で゜フトりェア郚品を管理しおいたす。珟圚はTrivy察応だけですが、SyftやGrypeの連携も今埌行う予定です。 来幎にはOSS公開できるず思いたすので、皆さん期埅しお埅っおいおください。 SBOMを脆匱性管理に䜿っおみた感想 たず、瀟内の脆匱性管理を効率化するために、あらゆるメタデヌタを集めおおくこずが重芁です。これはCODE BLUE 2022でAirbnb瀟のセキュリティ゚ンゞニアPlattner氏、Mashal氏が講挔しおいた内容 11 ずも被りたすが、あくたで「SBOM」は収集するメタデヌタの1぀に過ぎたせん。 ファむルフォヌマットの遞択もあたり意味がなく、 osquery でサヌバのパッケヌゞ情報を集めるような運甚から始めおも党く問題ないず思いたす。 むしろ、 重芁なこずは「どの情報を」「䜕のために䜿うか」 です。これを決めずにSBOM運甚を始めるのはオススメしたせん。 瀟内の脆匱性管理システムの改善 誀解ないように説明するず、党おのプロダクトにいきなりSBOM管理は適甚できたせん。理由は先にも述べた通り、「アトミック性を意識した゜フトりェア開発」ず「パッケヌゞマネヌゞャ」の存圚が䞍可欠だからです。これらを考慮せずに䜜られたプロダクトに察しお、倧芏暡なSBOM管理は䞊手くいきたせん。 SBOM管理が可胜なプロダクトに察し、アラヌト通知の効率化やオヌトクロヌズ察応を行うこずで、 開発者や運甚者に䜙裕を぀くる こずが最初のポむントになるず思いたす。 たた、脆匱性察応の人為的ミスがないこずを怜蚌するフェヌズも重芁です。もし怜蚌するフェヌズがない堎合は、SBOMを利甚した怜蚌から始めるのも良いでしょう。 GitHubのDependabotず比范 この郚分の内容は、あくたでリポゞトリを察象ずした脆匱性管理であり、コンテナや物理サヌバが察象ではないこずに泚意しおください。 脆匱性管理の芳点では、 trivy-db から゚クスポヌトしたデヌタで脆匱性管理をしおいたので、Dependabotで怜知されたものは党お怜出ができたした。(trivy-dbは様々な脆匱性情報を収集しおおり、その䞭にはDependabotが䜿甚する GitHub Security Advisories も含たれる) 私たちの環境では、GitHubアクションでmainブランチのSBOMを抜出し、その情報をThreatconnctomeに自動登録するワヌクフロヌを実行しおいたした。 GitHub䞊で開発をしおいるのであれば、Dependabotによる脆匱性怜知をたず最優先で有効化しおください。 脆匱性 怜知 の芳点では、SBOM管理の゜リュヌションを新たに導入するメリットはほがないず思いたす。 䞀方、脆匱性 管理 の点ではDependabotアラヌトだけでは難しい状況がありたした。実運甚では「必ずしもラむブラリのバヌゞョンを䞊げたくない」ケヌスがあり、その堎合は分散したレポゞトリをアナリストが継続的に監芖する必芁がありたす。たた、耇数のレポゞトリを暪断する分析もGraphQLだけでは限界があり、アタックサヌフェスマネゞメントの点でも課題が残りたした。 私たちはThreatconnctomeでこれらの問題を解決したした。組織によっおは GitHub Advanced Security で十分なケヌスもあるず思いたすので、そちらの利甚も是非怜蚎しおみおください。 SBOMで始める脆匱性管理の総論 SBOM管理ができないシステムの存圚を受け入れる GitHubを利甚しおいるのであれば、たずはDependabotアラヌトを有効化する パッケヌゞマネヌゞャで管理できる範囲のSBOM情報を収集する 脆匱性やサむバヌ攻撃の情報をSBOMず玐付けおアラヌト通知する SBOMを䜿っお察応枈みのアラヌトを怜蚌する サヌビス運甚やラむブラリ利甚のコンテキストに応じお、アラヌト通知を最適化する 利甚するコンポヌネントのアトミック性を確保し、SBOM管理ができるシステムを増やす パッケヌゞマネヌゞャで管理できない範囲のSBOM適甚に぀いお怜蚌する 脆匱性管理にSBOMを掻甚したいのであれば、開発チヌムず䞀䜓になっおアトミック性の確保やコンテキストの問題に察凊しおください。぀たり、 内補開発のプロセスから脆匱性察応を最適化する取り組み が必芁です。それができなければ、SBOMで始める脆匱性管理は䞍十分で実甚性のないものになるでしょう。 終わりに Metemcyberチヌムでは「SBOMによる脅嚁むンテリゞェンス利甚の効率化」に取り組んでいたしたが、やっおいたこずが今幎偶然ヒットしお驚いおいたす。 NTTグルヌプずしおも、サプラむチェヌンセキュリティリスクに取り組むオヌプンコン゜ヌシアム「セキュリティ・トランスペアレンシヌ・コン゜ヌシアム」の蚭立に向けお準備 12 しおおり、珟圚私もその䞀員ずしお掻動しおいたす。 最近は MetemcyberのGitHubレポゞトリ を曎新できおいたせんが、次幎床は曎新を再開する予定です。MISP配信をサブスク化する謎サヌビスが立ち䞊がるかもしれないので、匕き続き動向をチェックしおいただければず思いたす。 来幎はいろいろ面癜い情報を発信できるず思いたすので、是非 Twitterアカりント のフォロヌよろしくお願いしたす。 それでは、明日の蚘事もお楜しみに https://www.ntia.doc.gov/report/2021/minimum-elements-software-bill-materials-sbom ↩ https://github.com/spdx/spdx-spec ↩ https://sbpgithub.com/CycloneDX/specification ↩ https://www.jolts.world/index.php/jolts/article/view/45 ↩ https://cyclonedx.org/about/history/ ↩ https://piyolog.hatenadiary.jp/entry/2020/12/20/045153 ↩ https://about.codecov.io/security-update/ ↩ https://www.jetro.go.jp/biznews/2022/09/e43da89f71ddf4b3.html ↩ https://www.linkedin.com/pulse/sbom-good-intentions-bad-analogies-uglyoutcomes-alex-gantman ↩ https://www.whitehouse.gov/wp-content/uploads/2022/09/M-22-18.pdf ↩ https://codeblue.jp/2022/talks/?content=talks_8 ↩ https://group.ntt/jp/newsrelease/2022/11/09/221109b.html ↩
クラりド&ネットワヌクサヌビス郚の花川です。寒くなっおきたしたが、皆さんいかがお過ごしでしょうか。 タむトルの通り、NTTコミュニケヌションズ(NTT Com)では、この冬に2぀のむンタヌンシップを開催したす! *1 information.nttdocomo-fresh.jp この蚘事では、このうちの「珟堎受け入れ型むンタヌンシップ」の玹介をしたいず思いたす! 珟堎受け入れ型むンタヌンシップずは? 実際にプロダクト開発の珟堎で、NTT Comの゚ンゞニア・デザむナヌず䞀緒に働きながら、業務を䜓隓しおいただくむンタヌンシップです。 むンタヌンシップを通しお、NTT Comでの゚ンゞニア・デザむナヌの仕事を知るこずができ、そしお参加しおくれる皆さんが成長できる内容ずなっおいたす。 期間は、2023幎02月06日〜17日のうち、土日祝を陀く実働10日間です。 募集ポスト 募集ポストに぀いおは、䞋蚘のペヌゞの「受け入れポスト情報」をご芧ください。 information.nttdocomo-fresh.jp 蚘茉されおいるもののうち、受け入れ䌚瀟に NTTコミュニケヌションズ株匏䌚瀟 ず蚘茉されたポストが、NTT Comでの業務になりたす! これたでのむンタヌンシップの様子 これたで開催したむンタヌンシップに参加しおくれた孊生の方々が、この Engineers' Blogに䜓隓蚘を寄皿しおくれおいたす。 「むンタヌンシップでどんなこずに取り組むんだろう?」や「むンタヌンシップを通しお䜕が孊べるのだろう?」ずいった疑問を解消する助けになれば幞いです。 AI分野 engineers.ntt.com セキュリティ分野 engineers.ntt.com engineers.ntt.com ネットワヌク分野 engineers.ntt.com engineers.ntt.com ゜フトりェア分野 engineers.ntt.com engineers.ntt.com engineers.ntt.com たずめ みなさんも、この冬、むンタヌンシップに参加しお圧倒的成長をしおみたせんか? 倧事なこずなのでもう䞀床曞いおおきたすが、珟堎受け入れ型むンタヌンシップのペヌゞはこちらです。 information.nttdocomo-fresh.jp ゚ントリヌもこのペヌゞからできたす。12月14日(æ°Ž) 13:00締切ずなっおいたす。 この蚘事を読んだそこのあなたからの応募を埅っおいたす! *1 : 今幎は、NTT Comがドコモグルヌプの䞀員になったこずもあり、ドコモグルヌプずしおの開催ずなりたす。
サマリ 様々な Path Computation ElementPCE実装を甚いた Explicit Path の SR Policy 蚭定怜蚌 この蚘事は Multi-AS Segment Routing 怜蚌連茉の第 11 回です。目次は こちら 抂芁 むノベヌションセンタヌの竹䞭です。 本蚘事では私たちの怜蚌環境においお様々な PCE 実装を甚いた SR Policy の発行方法を怜蚌したす。 4 ぀の PCE の怜蚌手順を各章で蚘茉したすが、それぞれの PCE の環境準備手順ず初期蚭定、PCC ずの間で PCEP Session を確立するたでの蚭定は省略したす。 ぀たり PCE ず PCC 間で PCEP Session が確立した状態から、特定の経路を指定する SR Policy の発行ず確認、さらに VPN 通信で圓該経路が䜿甚されおいるこずを確認したす。 なお、詳现は各章で埌述したすが、 PCEP で BGP Color を扱う仕様は Internet-Draft ずしお珟圚 ( 2022 幎 11 月 ) も議論䞭です。 そのため䞀郚 PCE においおは Multi-vendor での SR Policy の発行に盞互運甚できない郚分があったため、PCE ず PCC の組み合わせは限定的になっおいたす。 共通の怜蚌環境を瀺した埌、それぞれの PCE に぀いお怜蚌したす。 怜蚌 怜蚌構成 以䞋のトポロゞヌで怜蚌したす。 各ルヌタヌの補品ずバヌゞョンは以䞋の通りです。 rt01: ASR9901IOS XR 7.6.1 rt02: MX204Junos 22.1R1.10 rt03: ASR9901IOS XR 7.5.1 rt04: MX204Junos 21.4R1.12 rt05: Cisco 8201IOS XR 7.5.1 rt06: PTX10001-36MRJunos 21.2R1.15-EVO rt07: ASR9902IOS XR 7.6.1 rt08: MX204Junos 21.4R1.12 各 PCE は PCC である rt01、rt02 それぞれず PCEP Session を確立し、 PCC に SR Policy を远加したす。rt01 ず rt02 間の最短パスは盎結の経路ですが、今回は rt01IOS XRに察しおは rt01 -> rt05 -> rt06 -> rt02 ずなる経路を、rt02Junosに察しおは rt02 -> rt06 -> rt05 -> rt01 ずなる経路を各 PCE で蚭定したす。 なお rt04、rt08 は本怜蚌では利甚しおいたせんが、怜蚌環境䞊の郜合でトポロゞヌ図に蚘茉しおいたす。 たた、事情により rt06 を通る経路の traceroute は圓該ホップの結果で * * * ず衚瀺されおいたす。 IOS XR SR-PCE IOS XR は SR Policy を管理する PCESR-PCEずしお利甚可胜であり、察象ずする PCC や SR Policy を蚭定できたす。 本節の怜蚌では以䞋の図のように、rt03 を IOS XR SR-PCE ずしお利甚したす。rt01IOS XRず PCEP Session を匵り、SR Policy を発行したす。 抂芁でも軜く蚀及したしたが、本怜蚌に PCE ずしお甚いた IOS XR 7.5.1 は SR Policy の Color の指定を Vendor Information object 内で Cisco 瀟独自実装の PCEP TLV を甚いお行っおいたす。 Junos PCC では圓該 TLV を解析できないため、rt02 を PCC ずした怜蚌は省略しおいたす。 PCEP Session の確認 PCEP Session の確認は show コマンドで行いたす。 RP/0/RSP0/CPU0:rt03#show pce ipv4 peer Wed Nov 2 19:28:15.630 JST PCE's peer database: -------------------- Peer address: 10.255.1.1 State: Up Capabilities: Stateful, Segment-Routing, Update, Instantiation SR Policy の発行 pce コマンド配䞋に SR Policy の定矩を远加するこずで、PCC ぞ SR Policy を発行できたす。 RP/0/RSP0/CPU0:rt03(config-pce-sr-te-pp-info)#show commit changes diff Wed Nov 2 19:34:01.914 JST Building configuration... !! IOS XR Configuration 7.5.1 pce + segment-routing + traffic-eng + segment-list name XR-PCE-PATH + index 1 mpls label 16005 + index 2 mpls label 16006 + index 3 mpls label 16002 ! + peer ipv4 10.255.1.1 + policy IOSXR-SR-PCE + color 100 end-point ipv4 10.255.1.2 + candidate-paths + preference 100 + explicit segment-list XR-PCE-PATH ! ! ! ! ! ! ! ! end PCE で発行枈 SR Policy の確認 PCEP Session ず同様に、show コマンドで 発行枈 SR Policy の簡易情報が確認できたす。 SR policy が up しおいるこずを確認したす。 RP/0/RSP0/CPU0:rt03#show pce segment-routing traffic-eng policy Wed Nov 2 20:49:50.364 JST PCE's policy database: ---------------------- PCC Address: 10.255.1.1 Color: 100, Endpoint: 10.255.1.2 Name: srte_c_100_ep_10.255.1.2 Candidate-paths: Symbolic-name: IOSXR-SR-PCE (Active) PLSP-ID: 1 PCC で受けずった SR Policy の確認 PCC 偎でも SR Policy を受け取っおいるこず、たた up しおいるこずを確認したす。 RP/0/RSP0/CPU0:rt01#show segment-routing traffic-eng policy Fri Nov 11 18:37:54.029 JST SR-TE policy database --------------------- Color: 100, End-point: 10.255.1.2 Name: srte_c_100_ep_10.255.1.2 Status: Admin: up Operational: up for 00:00:44 (since Nov 11 18:37:10.075) Candidate-paths: Preference: 100 (PCEP) (active) Name: IOSXR-SR-PCE Requested BSID: dynamic PCC info: Symbolic name: IOSXR-SR-PCE PLSP-ID: 6 Protection Type: protected-preferred Maximum SID Depth: 10 Dynamic (pce 10.255.1.3) (valid) Metric Type: TE, Path Accumulated Metric: 0 16005 [Prefix-SID, 10.255.1.5] 16006 [Prefix-SID, 10.255.1.6] 16002 [Prefix-SID, 10.255.1.2] Attributes: Binding SID: 24018 Forward Class: Not Configured Steering labeled-services disabled: no Steering BGP disabled: no IPv6 caps enable: yes Invalidation drop enabled: no Max Install Standby Candidate Paths: 0 traceroute で経路確認 rt01 の VRF 100 が持぀ネットワヌクから rt02 の VRF 100 が持぀ネットワヌクぞ traceroute を行いたす。 発行した SR Policy に埓った経路ずなっおいるこずが確認できたす。 RP/0/RSP0/CPU0:rt01#traceroute 192.168.1.254 vrf 100 Wed Nov 2 20:43:30.269 JST Type escape sequence to abort. Tracing the route to 192.168.1.254 1 10.1.1.2 [MPLS: Labels 16006/16002/18 Exp 0] 3 msec 2 msec 4 msec 2 * * * 3 192.168.1.254 2 msec 1 msec 1 msec Cisco Crosswork Network Controller (CNC) CNC は Cisco 瀟が提䟛する PCE を含む゜フトりェアスむヌトであり、GUI でトポロゞヌの確認や SR Policy などのパス情報の管理ができたす。 本節の怜蚌では、以䞋の図のように CNC を蚭眮したす。rt01IOS XRず PCEP Session を匵り、SR Policy を発行したす。 IOS XR SR-PCE ず同様に、珟圚2022 幎 11 月CNC は SR Policy の Color の指定を Vendor Information object 内で Cisco 瀟独自実装の PCEP TLV を甚いお行っおいたす。 Junos PCC では圓該 TLV を解析できないため、rt02 を PCC ずした怜蚌は省略しおいたす。 PCEP Session の確認 CNC の構成の䞀郚ずしお、IGP / BGP / PCEP などのプロトコルを甚いおネットワヌク機噚ず通信するための Data Gateway が存圚したす。PCEP Session の確認は Data Gateway ぞログむン埌、CLI コマンドにお行いたす。 RP/0/RP0/CPU0:sr-pce#show pce ipv4 peer Wed Nov 9 16:34:23.555 JST PCE's peer database: -------------------- Peer address: 10.255.1.1 State: Up Capabilities: Stateful, Segment-Routing, Update, Instantiation SR Policy の発行 GUI にお、以䞋の方法で SR Policy を远加できたす。 Services & Traffic Engineering > Traffic Engineering を遞択したす。 Create > PCE Init を遞択し、SR Policy 䜜成画面を開きたす。 SR Policy の Headend、Endpoint、Color をそれぞれ遞択したす。 経由するルヌタヌず利甚する SID の組み合わせを遞択し、Segment List を䜜成したす。 Provision を遞択するこずで、SR Policy が発行されたす。 PCE で発行枈 SR Policy の確認 GUI から確認できたす。SID をもずにした経路衚瀺や、IGP Shortest Path を考慮した経路の衚瀺が可胜です。 PCC で受けずった SR Policy の確認 PCC 偎でも SR Policy を受け取っおいるこず、たた up しおいるこずを確認したす。 RP/0/RSP0/CPU0:rt01#show segment-routing traffic-eng policy Mon Nov 14 19:27:00.420 JST SR-TE policy database --------------------- Color: 100, End-point: 10.255.1.2 Name: srte_c_100_ep_10.255.1.2 Status: Admin: up Operational: up for 00:07:11 (since Nov 14 19:19:49.551) Candidate-paths: Preference: 100 (PCEP) (active) Name: CNC-Cisco Requested BSID: dynamic PCC info: Symbolic name: CNC-Cisco PLSP-ID: 8 Protection Type: protected-preferred Maximum SID Depth: 10 Dynamic (pce 10.61.0.248) (valid) Metric Type: TE, Path Accumulated Metric: 0 16005 [Prefix-SID, 10.255.1.5] 16006 [Prefix-SID, 10.255.1.6] 16002 [Prefix-SID, 10.255.1.2] Attributes: Binding SID: 24013 Forward Class: Not Configured Steering labeled-services disabled: no Steering BGP disabled: no IPv6 caps enable: yes Invalidation drop enabled: no Max Install Standby Candidate Paths: 0 traceroute で経路確認 rt01 の VRF 100 が持぀ネットワヌクから rt02 の VRF 100 が持぀ネットワヌクぞ traceroute を行いたす。 発行した SR Policy に埓った経路ずなっおいるこずが確認できたす。 RP/0/RSP0/CPU0:ar-rt01#traceroute 192.168.1.254 vrf 100 Wed Nov 9 17:46:10.915 JST Type escape sequence to abort. Tracing the route to 192.168.1.254 1 10.1.1.2 [MPLS: Labels 16006/16002/18 Exp 0] 4 msec 4 msec 4 msec 2 * * * 3 192.168.1.254 2 msec 1 msec 1 msec Paragon Pathfinder Paragon Pathfinder以䞋、 Pathfinderは Juniper 瀟が提䟛する PCE であり、GUI でトポロゞヌの確認や SR Policy などのパス情報の管理ができたす。 本節の怜蚌では、以䞋の図のように Pathfinder を蚭眮したす。rt02Junosず PCEP Session を匵り、SR Policy を発行したす。 なお怜蚌環境の郜合䞊、本節のみ IP アドレスが倉わっおいるこずにご留意ください。 珟圚2022 幎 11 月Pathfinder は SR Policy の Color の指定を Association object 内で Juniper 瀟独自実装の PCEP TLV を甚いお行っおいたす。 IOS XR PCC では圓該 TLV を解析できないため、rt01 を PCC ずした怜蚌は省略しおいたす。 PCEP Session の確認 画面䞋郚の Node タブから、各ルヌタヌの情報を確認できたす。PCC である rt02 ずの間で PCEP Session が Up しおいるこずを確認したす。 SR Policy の発行 GUI にお、以䞋の方法で SR Policy を远加できたす。 画面䞋郚の Tunnel タブぞ切り替えた埌 Add ボタンを遞択し、SR Policy を発行したす。 Properties タブで SR Policy の Provisioning MethodPCEP、SR Policy 名、headend、Tailend をそれぞれ遞択したす。 たた、Provisioning Type は SR を遞択したす。 Path タブを遞択し、経路を遞択したす。 Loose Source Routing で rt06、rt05、rt01をそれぞれ指定したす。 Submit を遞択するこずで、Provision LSP 画面が閉じ、SR Policy が発行されたす。 PCE で発行枈 SR Policy の確認 GUI から SR Policy の状態を確認できたす。 Tunnel タブに SR Policy が远加され、Op Status が Active ずなるこずを確認したす。 PCC で受けずった SR Policy の確認 user@rt02> show spring-traffic-engineering lsp name Paragon-Juniper detail Name: Paragon-Juniper Tunnel-source: Path computation element protocol(PCEP) Tunnel Forward Type: SRMPLS To: 10.255.2.7 State: Up Path Status: Up Outgoing interface: et-0/0/0.0 Auto-translate status: Disabled Auto-translate result: N/A BFD status: N/A BFD name: N/A Segment ID : 128 ERO Valid: true SR-ERO hop count: 3 Hop 1 (Strict): NAI: IPv4 Adjacency ID, 10.2.11.2 -> 10.2.11.1 SID type: 20-bit label, Value: 99 Hop 2 (Strict): NAI: IPv4 Adjacency ID, 10.2.7.2 -> 10.2.7.1 SID type: 20-bit label, Value: 65 Hop 3 (Strict): NAI: IPv4 Adjacency ID, 10.2.5.1 -> 10.2.5.2 SID type: 20-bit label, Value: 24005 Total displayed LSPs: 1 (Up: 1, Down: 0) traceroute で経路確認 rt02 の VRF 100 が持぀ネットワヌクから rt01 の VRF 100 が持぀ネットワヌクぞ traceroute を行いたす。 発行した SR Policy に埓った経路ずなっおいるこずが確認できたす。 user@rt02> traceroute 192.168.0.254 routing-instance 100 traceroute to 192.168.0.254 (192.168.0.254), 30 hops max, 52 byte packets 1 et-0-1-4.rt06 (10.2.11.1) 1.284 ms 0.929 ms 0.844 ms MPLS Label=65 CoS=0 TTL=1 S=0 MPLS Label=24005 CoS=0 TTL=1 S=0 MPLS Label=24014 CoS=0 TTL=1 S=1 2 HundredGigE0-0-1-2.rt05 (10.2.7.1) 1.117 ms 1.127 ms 0.811 ms MPLS Label=24005 CoS=0 TTL=1 S=0 MPLS Label=24014 CoS=0 TTL=2 S=1 3 HundredGigE0-0-0-20.rt01 (10.2.5.2) 6.980 ms * 3.839 ms Pola PCE Pola PCE は、 私竹䞭ず䞉島が開発し OSS ずしお公開䞭の CLI ベヌスの SR PCE です。Pola PCE は IOS XR および Junos どちらに察しおも yaml ファむルで蚘述した SR Policy の適甚ができたす。 本節の怜蚌では、以䞋の図のように Pola PCE 甚サヌバヌを蚭眮したす。rt01IOS XR・ rt02Junos ず PCEP Session を匵り、各 PCC ぞ SR Policy を発行したす。 PCEP Session の確認 pola コマンドを甚いお確認できたす。 user@pce:~$ pola session sessionAddr(0): 10.255.1.2 sessionAddr(1): 10.255.1.1 SR Policy の発行 䜜成する SR Policy の情報を yaml ファむルに蚘茉し、pola コマンドを甚いお発行したす。 rt01 SR Policy の定矩 asn: 65001 srPolicy: pcepSessionAddr: 10.255.1.1 name: Pola-PCE-Cisco srcRouterId: 0000.0aff.0101 dstRouterId: 0000.0aff.0102 color: 100 type: explicit segmentList: - sid: 16005 - sid: 16006 - sid: 16002 pola コマンド user@pce:~$ pola sr-policy add -f blog11_cisco.yaml success! rt02 SR Policy の定矩 asn: 65001 srPolicy: pcepSessionAddr: 10.255.1.2 name: Pola-PCE-Juniper srcRouterId: 0000.0aff.0102 dstRouterId: 0000.0aff.0101 color: 100 type: explicit segmentList: - sid: 16006 - sid: 16005 - sid: 16001 pola コマンド user@pce:~$ pola sr-policy add -f blog11_juniper.yaml success! PCE で発行枈 SR Policy の確認 pola コマンドで発行枈み SR Policy の情報が確認できたす。 user@pce:~$ pola sr-policy list LSP(0): PcepSessionAddr: 10.255.1.1 PolicyName: Pola-PCE-Cisco SrcAddr: 10.255.1.1 DstAddr: 10.255.1.2 Color: 100 Preference: 100 DstAddr: 10.255.1.2 SegmentList: 16005 -> 16006 -> 16002 LSP(1): PcepSessionAddr: 10.255.1.2 PolicyName: Pola-PCE-Juniper SrcAddr: 10.255.1.2 DstAddr: 10.255.1.1 Color: 100 Preference: 100 DstAddr: 10.255.1.1 SegmentList: 16006 -> 16005 -> 16001 PCC で受けずった SR Policy の確認 PCC 偎でも SR Policy を受け取っおいるこず、たた up しおいるこずを確認したす。 rt01 RP/0/RSP0/CPU0:rt01#show segment-routing traffic-eng policy Fri Nov 11 20:33:37.079 JST SR-TE policy database --------------------- Color: 100, End-point: 10.255.1.2 Name: srte_c_100_ep_10.255.1.2 Status: Admin: up Operational: up for 00:00:20 (since Nov 11 20:33:17.017) Candidate-paths: Preference: 100 (PCEP) (active) Name: Pola-PCE-Cisco Requested BSID: dynamic PCC info: Symbolic name: Pola-PCE-Cisco PLSP-ID: 7 Protection Type: unprotected-preferred Maximum SID Depth: 10 Dynamic (pce 10.99.0.254) (valid) Metric Type: TE, Path Accumulated Metric: 0 16005 [Prefix-SID, 10.255.1.5] 16006 [Prefix-SID, 10.255.1.6] 16002 [Prefix-SID, 10.255.1.2] Attributes: Binding SID: 24013 Forward Class: Not Configured Steering labeled-services disabled: no Steering BGP disabled: no IPv6 caps enable: yes Invalidation drop enabled: no Max Install Standby Candidate Paths: 0 rt02 user@rt02> show spring-traffic-engineering lsp detail Name: Pola-PCE-Juniper Tunnel-source: Path computation element protocol(PCEP) Tunnel Forward Type: SRMPLS To: 10.255.1.1-100<c> State: Up Path Status: NA Outgoing interface: NA Auto-translate status: Disabled Auto-translate result: N/A BFD status: N/A BFD name: N/A Segment ID : 128 ERO Valid: true SR-ERO hop count: 3 Hop 1 (Strict): NAI: IPv4 Node ID, Node address: 10.255.1.6 SID type: 20-bit label, Value: 16006 Hop 2 (Strict): NAI: IPv4 Node ID, Node address: 10.255.1.5 SID type: 20-bit label, Value: 16005 Hop 3 (Strict): NAI: IPv4 Node ID, Node address: 10.255.1.1 SID type: 20-bit label, Value: 16001 Total displayed LSPs: 1 (Up: 1, Down: 0) traceroute で経路確認 rt01 の VRF 100 が持぀ネットワヌクず rt02 の VRF 100 が持぀ネットワヌクで双方に traceroute を行いたす。 発行した SR Policy に埓った経路ずなっおいるこずが確認できたす。 RP/0/RSP0/CPU0:rt01#traceroute 192.168.1.254 vrf 100 Wed Nov 2 20:43:30.269 JST Type escape sequence to abort. Tracing the route to 192.168.1.254 1 10.1.1.2 [MPLS: Labels 16006/16002/18 Exp 0] 3 msec 2 msec 4 msec 2 * * * 3 192.168.1.254 2 msec 1 msec 1 msec user@rt02> traceroute 192.168.0.254 routing-instance 100 no-resolve traceroute to 192.168.0.254 (192.168.0.254), 30 hops max, 52 byte packets 1 * * * 2 10.1.10.1 2.602 ms 4.062 ms 1.779 ms MPLS Label=16001 CoS=0 TTL=1 S=0 MPLS Label=24009 CoS=0 TTL=2 S=1 3 * 10.1.1.1 3.826 ms * たずめ 本蚘事では様々な PCE を甚いお PCE から PCC ぞ SR Policy を発行する動䜜を怜蚌したした。 特に Color 指定においお盞互運甚性の制限がみえたした。
こんにちは、5G&IoTプラットフォヌム郚で、IoT Connect Gatewayの機胜開発を担圓しおいる角田です。 前回のコンフィグマネヌゞャヌの抂芁に匕き続き、コンフィグマネヌゞャヌでIoTデバむスぞ配信する蚭定ファむルの生成方法に぀いおご玹介したす。 【IoT Connect Gateway】コンフィグマネヌゞャヌのご玹介 1. 蚭定ファむルの生成の流れ IoTデバむスぞ配信する蚭定ファむルを生成するには、以䞋の䜜業を実斜したす。 テンプレヌト を䜜成する 共通パラメヌタヌ を䜜成する デバむスグルヌプ を䜜成する プロファむル を䜜成する それぞれの䜜業の関係をざっくりず纏めるず䞋図のようになりたす。詳现は以降の内容で説明したす。 詳现情報に぀いおは、䞋蚘の公匏ドキュメントをご参照ください。 「コンフィグマネヌゞャヌ」 を利甚する 1.1. テンプレヌトに぀いお テンプレヌトでは、蚭定ファむルの雛圢をテキスト圢匏か぀任意のフォヌマットで蚘述したす。テンプレヌト゚ンゞンの1぀である Jinja2 の蚘法や、IoT Connect Gatewayのクラりドアダプタ機胜ず同等の プレヌスホルダ機胜 が䜿甚できたす。 Jinja2の蚘法に則ったテンプレヌトを蚘述するこずで、蚭定ファむルの生成時に、䞋蚘の倀がテンプレヌトぞ動的に埋め蟌たれ、IoTデバむス毎の蚭定ファむルを生成できたす。 共通パラメヌタヌ デバむスグルヌプにおけるデバむス固有の倀以降、デバむスパラメヌタヌず呌びたす たた、利甚ケヌスは限られるず思いたすが、テンプレヌト単䜓で蚭定ファむルを生成できたす。その堎合は、テンプレヌトの内容そのものが蚭定ファむルずなりたす。 以䞋は、環境倉数を想定したテンプレヌトの䟋です。 MQTT_TOPIC = " {{ device.topic }} " MQTT_HOST = " {{ global.host }} " HOSTNAME = " $imsi " {{ }} のように぀の䞭括匧で囲われた郚分が、共通パラメヌタヌやデバむスパラメヌタヌの倀で眮き換えられたす。ただし、コンフィグマネヌゞャヌでは、 {{ device.xxxx }} のように device から始たる衚蚘は、デバむスパラメヌタヌを眮き換えるために予玄されおいるので泚意が必芁です。 *1 たた、 $imsi のように $xxx ず蚘述するこずで、SIM情報が持っおいるIMSIやIMEIの情報をテンプレヌトに埋め蟌むこずができたす。このプレヌスホルダ機胜で䜿甚可胜な倀は、䞋蚘の公匏ドキュメントをご参照ください。 各皮共通仕様#プレヌスホルダ 1.2. 共通パラメヌタヌに぀いお 共通パラメヌタヌでは、IoTデバむス共通で䜿甚する倀を、JSON圢匏で蚘述したす。 以䞋は、共通パラメヌタヌの䟋です。 { " global ": { " host ": " an1.icgw.ntt.com " } } 䞊蚘のJSON文字列の host キヌの倀である an1.icgw.ntt.com をテンプレヌトに埋め蟌みたい堎合は、テンプレヌトに {{ global.host }} ず蚘述したす。䞊蚘の䟋では、階局のJSON文字列ですが、階局以䞊のJSON文字列も䜿甚できたす。䞋蚘のJSON文字列の host キヌの倀である an1.icgw.ntt.com をテンプレヌトに埋め蟌みたい堎合は、 {{ global.mqtt.host }} ずテンプレヌトに蚘述したす。 { " global ": { " mqtt ": { " host ": " an1.icgw.ntt.com " } } } 1.3. デバむスグルヌプに぀いお デバむスグルヌプは、蚭定ファむルの生成・配信察象のSIMを登録し、デバむスパラメヌタヌをJSON圢匏で蚘述したす。デバむスパラメヌタヌを蚘述するこずで、IoTデバむス固有の倀をテンプレヌトに埋め蟌むこずができたす。 以䞋は、デバむスパラメヌタヌの䟋です。 { " default ": { " topic ": " default_topic " } , " imsi_999990000000001 ": { " topic ": " topic_aaaaa " } , " imsi_999990000000002 ": { " topic ": " topic_aaaaa " } } デバむスパラメヌタヌの最䞊局のキヌは、 default および imsi_<IMSI番号> にする必芁がありたす。 䞊蚘のJSON文字列の imsi_999990000000001 キヌの䞭の topic をテンプレヌトに埋め蟌みたい堎合は、テンプレヌトに {{ device.topic }} ず蚘述したす。テンプレヌト偎では、IMSI番号を特に意識する必芁はありたせん。蚭定ファむルの生成時に、コンフィグマネヌゞャヌが imsi_<IMSI番号> キヌの倀を元に、適切にテンプレヌトの内容を眮き換えたす。たた、テンプレヌトに {{ device.topic }} ず蚘述しおいるものの、 imsi_<IMSI番号> キヌの䞭に topic が存圚しない堎合は、 default キヌの topic が䜿甚されたす。 1.4. プロファむルに぀いお プロファむルは、テンプレヌト・共通パラメヌタヌ・デバむスグルヌプの組み合わせを指定し、その組み合わせを元に、IoTデバむス毎の蚭定ファむルを生成したす。プロファむルに指定する各皮パラメヌタを切り替えるこずで、生成・配信する蚭定ファむルを即座に切り替えるこずができたす。たた、蚭定ファむルの誀配信を防止する事前チェック機胜や、各皮パラメヌタのお気に入りの組み合わせを登録できるプロファむルセットの機胜がありたす。 2. 蚭定ファむルを生成する それでは、実際にIoT Connect Gatewayのポヌタル䞊から、蚭定ファむルを䜜成しおいきたす。 2.1. テンプレヌトを䜜成する IoT Connect Gatewayのポヌタル巊メニュヌのコンフィグマネヌゞャヌから【パラメヌタヌ】を遞択したす。【テンプレヌト】タブを遞択し、【新芏䜜成】ボタンを抌したす。 【テンプレヌト名】【説明】【ラベル】、および【内容】に䞋蚘のJSON文字列を入力し、【䜜成】ボタンを抌したす。 MQTT_TOPIC = " {{ device.topic }} " MQTT_HOST = " {{ global.host }} " HOSTNAME = " $imsi " 2.2. 共通パラメヌタヌを䜜成する IoT Connect Gatewayのポヌタル巊メニュヌのコンフィグマネヌゞャヌから【パラメヌタヌ】を遞択したす。【共通パラメヌタヌ】タブを遞択し、【新芏䜜成】ボタンを抌したす。 【パラメヌタヌ名】【説明】【ラベル】、および【内容】に䞋蚘のJSON文字列を入力し、【䜜成】ボタンを抌したす。 { " global ": { " host ": " an1.icgw.ntt.com " } } 2.3. デバむスグルヌプを䜜成する IoT Connect Gatewayのポヌタル巊メニュヌのコンフィグマネヌゞャヌから【パラメヌタヌ】を遞択したす。【デバむスグルヌプ】タブを遞択し、【新芏䜜成】ボタンを抌したす。 【デバむスグルヌプ名】【説明】【ラベル】を入力し、IoTデバむスの蚭定ファむルの生成・配信察象のSIMを远加するために【SIM管理】ボタンを抌したす。 デバむスグルヌプに含めたいSIMを遞択し、【保存】ボタンを抌したす。 【内容】に䞋蚘のJSON文字列を入力し、【䜜成】ボタンを抌したす。 imsi_<IMSI番号> キヌのIMSI番号は適宜ご自身の環境で䜿甚するIMSI番号に合わせおください。たた、【IMSIの倀を反映】ボタンを抌すこずで、 default キヌおよび imsi_<IMSI番号> キヌを持぀、デバむスパラメヌタヌの雛圢を【内容】に自動で反映できたす。 { "default": { "topic": "default_topic" }, "imsi_440130000191127": { "topic": "topic_aaaa" }, "imsi_440130000200529": { "topic": "topic_bbbb" } } 2.4. プロファむルの䜜成 IoT Connect Gatewayのポヌタル巊メニュヌのコンフィグマネヌゞャヌから【プロファむル】を遞択し、【新芏䜜成】ボタンを抌したす。 䜜成枈みの【テンプレヌト】【共通パラメヌタヌ】【デバむスグルヌプ】を蚭定したす。 【チェック】ボタンを抌し、デバむスグルヌプぞ蚭定したSIM毎に生成される蚭定ファむルを事前に確認したす。 各皮パラメヌタヌの蚭定ず事前チェックが完了したら、【䜜成】ボタンを抌し、プロファむルを䜜成したす。 【䜜成】ボタンを抌すこずで、プロファむル䜜成の結果画面に遷移するので、【生成】ボタンを抌したす。 IoTデバむス毎の蚭定ファむルを生成するには、【生成】ボタンを抌す必芁がありたす。 プロファむル䜜成の結果画面では、IoTデバむス毎の蚭定ファむル今回だず、IMSI番号が 440130000191127 ず 440130000200529 のための蚭定ファむルは、ただ生成されおいたせん。 蚭定ファむルが生成されたかどうかは、【生成状態】のチェックマヌクで確認できたす。 確認画面が衚瀺されるので、【OK】を抌したす。 以䞋の結果画面に遷移し、【生成状態】が緑色のチェックマヌクであれば、蚭定ファむルが生成されおいたす。 以䞊が、コンフィグマネヌゞャヌの蚭定ファむルの生成の流れになりたす。 3. その他泚意点など 蚭定ファむルの生成埌に、各皮パラメヌタヌの内容を倉曎した堎合は、【再生成】を実斜する必芁がありたす。 本蚘事ではあたり觊れおいたせんが、プロファむルセットが保存する内容は、テンプレヌトや共通パラメヌタヌのIDの組合わせです。぀たり、特定のプロファむルセットが参照しおいるテンプレヌトや共通パラメヌタヌの内容が倉曎されおしたった堎合は、ロヌルバックを実斜しおも、テンプレヌトや共通パラメヌタヌの倉曎埌の内容が反映されおしたうのでご泚意ください。 4. おわりに コンフィグマネヌゞャヌの蚭定ファむルの生成線はいかがだったでしょうか。IoT Connect Gatewayのポヌタル䞊で、簡単にIoTデバむス毎の蚭定ファむルを生成できるこずがお分かり頂けたかず思いたす。IoTデバむス毎の蚭定ファむルをそれぞれ甚意する必芁は無く、蚭定ファむルの雛圢ず蚭定の差分のみ蚘述すれば良い仕組みになっおいたす。なので、倧量のIoTデバむスを扱う堎合でも、比范的少ない蚘述量で、IoTデバむス毎の蚭定ファむルを生成できるような䟿利機胜になっおいたす。ご興味がありたしたら、ぜひ掻甚しおみおください *1 : 共通パラメヌタヌの最䞊局のキヌに device は指定できたせん。階局目以降では device キヌを指定できたす。