TECH PLAY

株匏䌚瀟ZOZO

株匏䌚瀟ZOZO の技術ブログ

å…š987ä»¶

はじめに こんにちは。WEARバック゚ンド郚SREブロックの 春日 です。普段は WEAR ずいうサヌビスのSREずしお開発・運甚に携わっおいたす。本蚘事では、玄60のコスト削枛に成功した NATゲヌトりェむ の通信内容の調査方法ず通信量の削枛方法に぀いおご玹介したす。 目次 はじめに 目次 背景 コストの把握 NATゲヌトりェむの通信内容の把握 CloudWatchメトリクスでの確認 VPCフロヌログでの確認 リゟルバヌでのク゚リログでの確認 調査結果をもずにNATゲヌトりェむ経由での通信量を削枛する AWSサヌビスずの通信 Datadogずの通信 WEARのAPIずの通信 ECRパブリックリポゞトリずの通信 結果 たずめ 背景 ZOZOではより効果的な成長を目指しおコストの最適化を進めおいたす。コストの増倧はサヌビスの拡倧を鈍化させる原因ずなるため、垞に最適な状態に保぀こずが必芁です。WEARでも䞍芁なコストを可胜な限り削枛し適正化すべく、コスト把握ず察応を続けおいたす。 コストの把握 たずはコストを把握したす。AWSのコストは AWS Cost Explorer以䞋、Cost Explorer で確認できたす。WEARでは『Elastic Container Service for Kubernetes』『S3』『CloudFront』に次いで『EC2その他』に料金がかかっおいたした。『EC2その他』の料金がそこたで高いこずは想定倖だったため、『EC2その他』の内蚳を確認したす。フィルタヌのサヌビスを『EC2 - Other』、グルヌプ化の条件のディメンションを『APIオペレヌション』ずするこずで、API単䜍で料金を確認できたす。結果は以䞋のグラフの通りです 1 。 内蚳を確認するず、コストの3分の2ほどがNATゲヌトりェむのコストでした。さらに詳现に内容を確認したす。先ほどたでのレポヌトパラメヌタを解陀し、フィルタヌの『APIオペレヌション』を『NatGateway』、グルヌプ化の条件のディメンションを『䜿甚タむプ』にしたす。 NATゲヌトりェむの料金に関するドキュメント を確認するず、『NATゲヌトりェむあたりの料金USD/時』ず『凊理デヌタ1GBあたりの料金 (USD)』で構成されおいたす。グラフを芋るず、NATゲヌトりェむの起動時間による料金よりも、NATゲヌトりェむのデヌタ凊理に関する料金が圧倒的に高いこずがわかりたす。぀たり、NATゲヌトりェむを経由しお倧量の通信が行われおいるずいうこずが読み取れたす。 次章では、NATゲヌトりェむを経由する通信を詳しく調査したす。 NATゲヌトりェむの通信内容の把握 CloudWatchメトリクスでの確認 たずは Amazon CloudWatch以䞋、CloudWatch でNATゲヌトりェむの CloudWatchメトリクス を確認したす。メトリクスの詳现は 公匏ドキュメント に蚘茉がありたす。 WEARでは、 BytesOutToDestination が BytesInFromDestination の2倍ほどの量でした。これは、NATゲヌトりェむを経由した倖向きの通信量が、NATゲヌトりェむを経由した内向きの通信量の2倍あるこずを瀺したす。 VPCフロヌログでの確認 次に、 VPCフロヌログ を甚いお、より詳现な通信内容を確認したす。VPCフロヌログにはVPC内郚のネットワヌクむンタヌフェむス間の通信内容が蚘録されおいたす。 Amazon S3以䞋、S3 バケットに出力されたVPCフロヌログを Amazon Athena以䞋、Athena でク゚リしお通信内容を確認したす 2 。 VPCフロヌログのAthenaテヌブルは以䞋の内容で䜜成したこずを前提に説明したす。 VPCフロヌログテヌブル䜜成ク゚リ CREATE EXTERNAL TABLE `vpc_flow_logs_table`( `version` int COMMENT '' , `account_id` string COMMENT '' , `interface_id` string COMMENT '' , `srcaddr` string COMMENT '' , `dstaddr` string COMMENT '' , `srcport` int COMMENT '' , `dstport` int COMMENT '' , `protocol` bigint COMMENT '' , `packets` bigint COMMENT '' , `bytes` bigint COMMENT '' , ` start ` bigint COMMENT '' , ` end ` bigint COMMENT '' , `action` string COMMENT '' , `log_status` string COMMENT '' , `vpc_id` string COMMENT '' , `subnet_id` string COMMENT '' , `instance_id` string COMMENT '' , `tcp_flags` int COMMENT '' , ` type ` string COMMENT '' , `pkt_srcaddr` string COMMENT '' , `pkt_dstaddr` string COMMENT '' , `region` string COMMENT '' , `az_id` string COMMENT '' , `sublocation_type` string COMMENT '' , `sublocation_id` string COMMENT '' , `pkt_src_aws_service` string COMMENT '' , `pkt_dst_aws_service` string COMMENT '' , `flow_direction` string COMMENT '' , `traffic_path` int COMMENT '' ) PARTITIONED BY ( `logdate` string COMMENT '' ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS INPUTFORMAT ' org.apache.hadoop.mapred.TextInputFormat ' OUTPUTFORMAT ' org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat ' LOCATION ' $LOCATION_OF_LOGS ' TBLPROPERTIES ( ' projection.enabled ' = ' true ' , ' projection.logdate.format ' = ' yyyy/MM/dd/HH ' , ' projection.logdate.interval ' = ' 1 ' , ' projection.logdate.interval.unit ' = ' HOURS ' , ' projection.logdate.range ' = ' 2022/01/01/00,NOW ' , ' projection.logdate.type ' = ' date ' , ' skip.header.line.count ' = ' 1 ' , ' storage.location.template ' = ' $LOCATION_OF_LOGS/${logdate} ' , ' typeOfData ' = ' file ' ) $LOCATION_OF_LOGS はVPCフロヌログの出力先S3パスに読み替えおください。 WEARではAthenaテヌブルの䜜成を Terraform の aws_glue_catalog_table で行っおいたす。䞊蚘のク゚リは aws_glue_catalog_table から䜜成されたテヌブルを SHOW CREATE TABLE で出力したク゚リのため、公匏ドキュメントずは衚珟が䞀郚異なっおいたす。 次のようなク゚リ 3 でVPC内郚からNATゲヌトりェむを経由した倖向きの通信を確認したす。SQL内にコメントしおある箇所は適宜自分の環境に読み替えおください。 SELECT pkt_dst_aws_service, SUM (bytes) AS bytesTransferred FROM " vpc_flow_logs_database " . " vpc_flow_logs_table " -- VPCフロヌログテヌブルが存圚するデヌタベヌス.VPCフロヌログテヌブル WHERE srcaddr LIKE ' x.y.% ' -- VPC CIDRのネットワヌク郚分(䟋VPC CIDRが`172.168.0.0/16`の時、`172.168.`) AND dstaddr in ( ' x.y.a.b ' , ' x.y.c.d ' , ' x.y.e.f ' ) -- NatGateway IP AND action = ' ACCEPT ' AND logdate BETWEEN ' YYYY/MM/dd/00 ' AND ' YYYY/MM/dd/23 ' -- 調査察象の日付(UTC) GROUP BY pkt_dst_aws_service ORDER BY bytesTransferred DESC このク゚リでは、特定の日付でVPC内郚からNATゲヌトりェむ経由で送信したトラフィック量をAWSサヌビス 4 ごずに確認しおいたす。この䟋では1日で調査しおいたすが、Athenaはスキャンしたデヌタ量に料金が比䟋したす 5 。サヌビスの芏暡によっおはたず時間単䜍でク゚リし、スキャン量が蚱容できるこずを確認しおください。 結果の䟋を以䞋の衚に蚘茉したす。 pkt_dst_aws_service が - である箇所はAWSが管理しおいないIPに向けた通信です。衚の数倀はWEARの実際の倀ではなくダミヌデヌタです。今埌出おくるAthenaのク゚リ結果はすべお実際の倀ではなく、ダミヌデヌタを蚘茉したす。 pkt_dst_aws_service bytesTransferred AMAZON 106000 EC2 4500 - 2000 DYNAMODB 1000 CLOUDFRONT 3 GLOBALACCELERATOR 1 続いお、NATゲヌトりェむを経由しおVPC内郚で受信するトラフィックも確認したす。 SELECT pkt_src_aws_service, SUM (bytes) AS bytesTransferred FROM " vpc_flow_logs_database " . " vpc_flow_logs_table " -- VPCフロヌログテヌブルが存圚するデヌタベヌス.VPCフロヌログテヌブル WHERE srcaddr NOT LIKE ' x.y.% ' -- VPC CIDRのネットワヌク郚分(䟋VPC CIDRが`172.168.0.0/16`の時、`172.168.`) AND dstaddr in ( ' x.y.a.b ' , ' x.y.c.d ' , ' x.y.e.f ' ) -- NatGateway IP AND action = ' ACCEPT ' AND logdate BETWEEN ' YYYY/MM/dd/00 ' AND ' YYYY/MM/dd/23 ' -- 調査察象の日付(UTC) GROUP BY pkt_src_aws_service ORDER BY bytesTransferred DESC pkt_src_aws_service bytesTransferred EC2 21000 AMAZON 6000 - 5000 CLOUDFRONT 1500 DYNAMODB 1000 GLOBALACCELERATOR 1 この時点で Amazon DynamoDB以䞋、DynamoDB の ゲヌトりェむ゚ンドポむント が䞍足しおおり、NATゲヌトりェむを経由しお通信しおしたっおいるこずが読み取れたす。 Datadog のように、 IPアドレス範囲を公開 しおいるサヌビスを利甚しおいる堎合、VPCフロヌログの pkt_dstaddr 送信先IPアドレスだけで把握も可胜です 6 。しかし、VPCフロヌログのみでは AMAZON の内蚳など、具䜓的にどの゚ンドポむントに向けお通信しおいるかがわかりたせん。これらを把握するため、VPC内郚の名前解決の際のク゚リログを掻甚しおより詳现に調査したす。 リゟルバヌでのク゚リログでの確認 リゟルバヌでのク゚リのログ蚘録 を蚭定するず、VPC内郚で行われた名前解決のク゚リログをS3に保存できたす。VPCフロヌログで確認できる送信先のIPアドレスずク゚リログの名前解決の結果を突き合わせるこずで、NATゲヌトりェむを経由しお行われた通信先のドメむンが把握できたす。 ドキュメント に埓っおク゚リログのAthenaテヌブルを䜜成したす。 リゟルバヌのク゚リログのAthenaテヌブルは以䞋の内容で䜜成したこずを前提に説明したす。 リゟルバヌのク゚リログテヌブル䜜成ク゚リ CREATE EXTERNAL TABLE `vpc_dns_query_logs_table`( `version` string COMMENT '' , `account_id` string COMMENT '' , `region` string COMMENT '' , `vpc_id` string COMMENT '' , `query_timestamp` string COMMENT '' , `query_name` string COMMENT '' , `query_type` string COMMENT '' , `query_class` string COMMENT '' , `rcode` string COMMENT '' , `answers` array<struct<rdata:string, type :string,class:string>> COMMENT '' , `srcaddr` string COMMENT '' , `srcport` int COMMENT '' , `transport` string COMMENT '' , `srcids` struct<instance:string,resolver_endpoint:string> COMMENT '' , `firewall_rule_action` string COMMENT '' , `firewall_rule_group_id` string COMMENT '' , `firewall_domain_list_id` string COMMENT '' ) PARTITIONED BY ( `logdate` string COMMENT '' ) ROW FORMAT SERDE ' org.openx.data.jsonserde.JsonSerDe ' STORED AS INPUTFORMAT ' org.apache.hadoop.mapred.TextInputFormat ' OUTPUTFORMAT ' org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat ' LOCATION ' $LOCATION_OF_LOGS ' TBLPROPERTIES ( ' projection.enabled ' = ' true ' , ' projection.logdate.format ' = ' yyyy/MM/dd ' , ' projection.logdate.interval ' = ' 1 ' , ' projection.logdate.interval.unit ' = ' DAYS ' , ' projection.logdate.range ' = ' 2022/01/01,NOW ' , ' projection.logdate.type ' = ' date ' , ' storage.location.template ' = ' $LOCATION_OF_LOGS/$VPC_ID/${logdate} ' , ' typeOfData ' = ' file ' ) $LOCATION_OF_LOGS はリゟルバのク゚リログの出力先S3パス、 $VPC_ID はログを蚘録しおいるVPCのIDに読み替えおください。 VPCフロヌログテヌブルず同様にAthenaテヌブルの䜜成をTerraformで行っおおり、䞊蚘は SHOW CREATE TABLE で出力したク゚リです。そのため、公匏ドキュメントずは衚珟が䞀郚異なっおいたす。 次のようなク゚リでVPCフロヌログずリゟルバヌのク゚リログを突き合わせたす。 SELECT R.query_name, SUM (F.bytesTransferred) AS bytes_day, ROUND ( SUM (F.bytesTransferred) * 30.0 / ( 1000 * 1000 * 1000 ), 2 ) AS GB_months FROM ( SELECT pkt_dstaddr, SUM (bytes) AS bytesTransferred FROM " vpc_flow_logs_database " . " vpc_flow_logs_table " -- VPCフロヌログテヌブルが存圚するデヌタベヌス.VPCフロヌログテヌブル WHERE srcaddr LIKE ' x.y.% ' -- VPC CIDRのネットワヌク郚分(䟋VPC CIDRが`172.168.0.0/16`の時、`172.168.`) AND dstaddr in ( ' x.y.a.b ' , ' x.y.c.d ' , ' x.y.e.f ' ) -- NatGateway IP AND action = ' ACCEPT ' AND logdate BETWEEN ' YYYY/MM/dd/00 ' AND ' YYYY/MM/dd/23 ' -- 調査察象の日付(UTC) AND pkt_dst_aws_service = ' AMAZON ' GROUP BY pkt_dstaddr ) F LEFT JOIN ( SELECT DISTINCT query_name, answer.rdata FROM " vpc_dns_query_logs_database " . " vpc_dns_query_logs_table " -- リゟルバヌのク゚リログテヌブルが存圚するデヌタベヌス.リゟルバヌのク゚リログテヌブル CROSS JOIN UNNEST(answers) as st(answer) WHERE answer. type = ' A ' AND logdate = ' YYYY/MM/dd ' -- 調査察象の日付(UTC) ) R ON F.pkt_dstaddr = R.rdata GROUP BY R.query_name ORDER BY bytes_day DESC このク゚リでは、倧きく分けお3぀のこずを行っおいたす。 VPCフロヌログテヌブルからNATゲヌトりェむを経由するトラフィックの送信先IPアドレスを取埗ク゚リの F 郚分 リゟルバヌのク゚リログテヌブルからドメむンずIPアドレスの察応衚を䜜成ク゚リの R 郚分 1ず2をIPアドレスで結合し、送信先ドメむンごずのトラフィック量を取埗 ク゚リの結果を確認するず、 firehose.ap-northeast-1.amazonaws.com. ず sqs.ap-northeast-1.amazonaws.com. に察するトラフィック量が倚いこずを確認できたした。WEARでは、アプリケヌションのログを aws-for-fluent-bit を甚いお Amazon Data Firehose以䞋、Firehose に送信しおいたす。このサヌビスに察する送信がほずんどであり、 むンタヌフェむスVPC゚ンドポむント が䞍足しおいるこずに気付けたした。 Amazon Simple Queue Service以䞋、SQS も同様に、VPC゚ンドポむントが䞍足しおいるこずが刀明したした。 他の箇所に぀いおも同様に調査すべく、 pkt_dst_aws_service = 'EC2' などに倉曎しながらトラフィック量を確認しおいきたす 7 。 その結果、以䞋のドメむンに察しおの通信量が倚いこずを確認できたした。 d5l0dvt14r5h8.cloudfront.net. に芋芚えはありたせんでしたが、AWSサポヌトに確認したずころ、 Amazon ECR パブリックリポゞトリ以䞋、ECRパブリックリポゞトリ であるこずが刀明したした2024幎7月珟圚。 *.datadoghq.com WEARのAPI d5l0dvt14r5h8.cloudfront.net. これで通信内容が刀明したした。NATゲヌトりェむ経由で倧量に通信しおおり、削枛効果が芋蟌めそうな宛先は以䞋の通りです。 AWSサヌビス Datadog WEARのAPI ECRパブリックリポゞトリ 次章からはこの結果を元に、可胜な限りNATゲヌトりェむを経由せずに枈むように察応したす。 調査結果をもずにNATゲヌトりェむ経由での通信量を削枛する AWSサヌビスずの通信 AWSサヌビスをNATゲヌトりェむ経由で通信させないためには、VPC゚ンドポむントが必芁です。ただし、通信するすべおのAWSサヌビスに察しおVPC゚ンドポむントを甚意すればいいずは限りたせん。VPC゚ンドポむントにも起動時間による料金ず、デヌタ凊理による料金が発生するためです。 むンタヌフェむス゚ンドポむントの料金 を確認し、 NATゲヌトりェむで通信する堎合の料金 ずの損益分岐点を確認したす。 NATゲヌトりェむはすでに存圚し、倖郚ぞの通信に利甚しおいたす。NATゲヌトりェむは削陀できないため、NATゲヌトりェむの起動時間に関するコストは考慮しないこずにしたす。たた、むンタヌフェむス゚ンドポむントはAZごずに起動時間の料金がかかりたす。WEARでは3AZを利甚しおいるため、3぀ずしお蚈算したす。 ap-northeast-1 リヌゞョンの料金は以䞋のようになっおいたす2024幎7月珟圚。 NATゲヌトりェむの料金衚 NAT ゲヌトりェむあたりの料金 (USD/時) 凊理デヌタ 1 GB あたりの料金 (USD) USD 0.062 USD 0.062 むンタヌフェむス゚ンドポむントの料金衚 各 AZ の VPC ゚ンドポむント 1 ぀あたりの料金 (USD/時間) USD 0.014   AWS リヌゞョンで 1 か月に凊理されるデヌタ 凊理デヌタ 1 GB あたりの料金 (USD) 最初の 1 PB 0.01 USD 次の 4 PB 0.006 USD 5 PB以䞊のもの 0.004 USD 1か月あたりの通信量GBを ずし、以䞋の匏を満たす を蚈算したす。VPC゚ンドポむントの起動時間は 24時間*30日*3AZ で蚈算しおいたす。たた、調査時に抂算した結果、1ヶ月に1PB以䞊は䜿っおいないため、最初の1PBの料金で蚈算したす。 するず ずなるため、月に581GB以䞊通信するのであればNATゲヌトりェむ経由よりもVPC゚ンドポむント経由の方が安いずいうこずが導けたす。 そのため、WEARではFirehoseずSQSのむンタヌフェむス゚ンドポむントを远加で䜜成するこずにしたした。ゲヌトりェむタむプのVPC゚ンドポむントの堎合は远加料金なしで利甚できる 8 ため、DynamoDBのVPC゚ンドポむントも䜜成したす。 Datadogずの通信 Datadogは AWS PrivateLink以䞋、PrivateLink を経由しお通信する方法を提䟛しおいたす 9 。ただし、調査の過皋でWEARではこの方法は断念したした。 Datadogには サむト ずいう抂念がありたす。各サむトは完党に独立しおおり、サむト間でデヌタの共有はできたせん。WEARでは Amazon Elastic Kubernetes Service以䞋、EKS のリヌゞョンず䜿甚しおいるDatadogサむトの堎所が異なっおいたした。その堎合、『VPCピアリングを䜿甚した他のリヌゞョンからの接続』ですが、リヌゞョン間の通信は、2024幎7月時点で 1GBあたり$0.09 かかっおしたいたす。そのため、WEARではDatadogぞの通信に関しおはNATゲヌトりェむを経由するこずを蚱容したした。ご利甚䞭のDatadogサむトのPrivateLinkずデヌタ送信元が同䞀リヌゞョンにある堎合はPrivateLinkを甚いる方法を怜蚎しおみおください。 WEARのAPIずの通信 調査結果から、WEARのWebアプリケヌションからAPIぞの通信がNATゲヌトりェむを経由しお行われおいるこずがわかりたした 10 。通信経路の抂略は以䞋の図の通りです。AWS間の通信のためむンタヌネットには出おいたせんが、NATゲヌトりェむを経由しお通信しおしたっおいたす。 これらは同䞀VPCに存圚しおいるため、VPC内郚のみで通信を完結させたいずころです。WEARのEKS内のPodは Application Load Balancer以䞋、ALB の配䞋に存圚したす。調査時点ではむンタヌネット向けのALBのみ存圚したしたが内郚向けのALBも䜜成し、VPC内郚からの通信は内郚向けのALBに察しお行うようにしたす。 WEARでは、ALBずALBの゚むリアスレコヌドの䜜成を AWS Load Balancer Controller ず ExternalDNS を甚いおIngressに専甚のアノテヌションを付䞎するこずで行っおいたす。 既存のIngressを螏襲し、新たに内郚向けALB甚のIngressを䜜成したす。 alb.ingress.kubernetes.io/scheme アノテヌションのデフォルト倀は internal ですが、埌述する理由により明瀺的に internal を蚭定しおおきたす。 以䞋に内郚向けALB䜜成のサンプルIngressを蚘茉したす。たた、内郚向けALBを䜜成するプラむベヌトサブネットに自動怜出甚のタグ 11 が付䞎されおいるこずを確認しおください。 apiVersion : networking.k8s.io/v1 kind : Ingress metadata : name : api-internal namespace : api annotations : kubernetes.io/ingress.class : alb alb.ingress.kubernetes.io/scheme : internal external-dns.alpha.kubernetes.io/hostname : api.wear.jp # むンタヌネット向けIngressのものず同じ # (以䞋略) spec : rules : - http : paths : - path : / pathType : Prefix backend : service : name : api port : number : 80 次に、䜜成する内郚向けALBの゚むリアスレコヌドを登録するためのプラむベヌトホストゟヌンず、プラむベヌトホストゟヌン甚のExternalDNSを新たに䜜成したす。プラむベヌトホストゟヌン名ぱむリアスレコヌドのレコヌド名ず䞀臎させたす。 ここで1぀泚意しなければならないこずがありたす。 すでに通信が行われおいるドメむンに察しお新たにプラむベヌトホストゟヌンを䜜成する堎合は、゚むリアスレコヌドを䜜成するたではEKSのVPCにプラむベヌトホストゟヌンを関連付けおはいけない ずいうこずです。 プラむベヌトホストゟヌンを䜜成した時点で、関連付けされおいるVPC内郚の通信はそのプラむベヌトホストゟヌンで名前解決を詊みたす。しかし、プラむベヌトホストゟヌンの䜜成ず゚むリアスレコヌドの䜜成は同時にできないため、名前解決に倱敗しおしたいたす。プラむベヌトホストゟヌンは䜜成時に必ず1぀以䞊のVPCを関連付けなければならないため、䜿甚しおいないVPCのみを䞀時的に関連付けおおきたす。 以䞋に Terraform を甚いたサンプルコヌドを蚘茉したす。ここでは、䜿甚しおいないデフォルトのVPCを䞀時的にプラむベヌトホストゟヌンに関連付けしおいたす。 resource " aws_route53_zone " " private_api " { name = " api.wear.jp " vpc { # 䞀時的にdefault VPCを指定。 vpc_id = data.aws_vpc.default.id vpc_region = " ap-northeast-1 " } force_destroy = false } # 䞀時的にdefault VPCを指定するためのデヌタ゜ヌス data " aws_vpc " " default " { default = true } 同じドメむンでパブリックホストゟヌンずプラむベヌトホストゟヌンを出し分けるためにプラむベヌトホストゟヌン甚のExternalDNSを新たに䜜成したす 12 。以䞋のオプションで起動したす。 --aws-zone-type=private --annotation-filter=alb.ingress.kubernetes.io/scheme=internal --domain-filter=${プラむベヌトホストゟヌン名} 内郚向けALBのためのアノテヌションが぀いおいるリ゜ヌスのみを察象に蚭定しおいたす。これが、デフォルト倀にもかかわらず明瀺的にIngressにアノテヌションを蚭定する理由です。 元々起動しおいたパブリックホストゟヌン甚のExternalDNSには --annotation-filter=alb.ingress.kubernetes.io/scheme=internet-facing を甚いお再起動し、むンタヌネット向けALB甚のリ゜ヌスのみを察象にしたす。 ExternalDNSの準備ができたら内郚向け甚IngressをEKS内に䜜成し、内郚向けALBずALBの゚むリアスレコヌドが䜜成されおいるこずを確認したす。䞀時的に関連付けおおいたVPC内郚からdigコマンド等で名前解決し、プラむベヌトアドレスに解決されるこずも確認しおおきたす。確認埌、プラむベヌトホストゟヌンをEKSのVPCに関連付けし、䞀時的なVPCの関連付けは解陀したす。 以䞋にサンプルコヌドを蚘茉したす。ここでは、プラむベヌトホストゟヌンに関連付けされおいるVPCを、䜿甚しおいないVPCからvariablesに蚭定されたEKSのVPCに倉曎しおいたす。 variable " vpc_id " { type = string description = " EKSのVPC ID " } resource " aws_route53_zone " " private_api " { name = " api.wear.jp " vpc { vpc_id = var.vpc_id vpc_region = " ap-northeast-1 " } force_destroy = false } 最終的な通信経路の抂略は以䞋の図の通りです。これで、WEARのWebアプリケヌションからAPIぞの通信がVPC内郚で完結するように蚭定できたした。 ECRパブリックリポゞトリずの通信 WEARでは、aws-for-fluent-bitを初めずする、耇数のコンテナむメヌゞでECRパブリックリポゞトリのものを倚甚しおいたす。 ドキュメント には以䞋のような蚘茉がありたす。 珟圚、VPC ゚ンドポむントは Amazon ECR パブリックリポゞトリをサポヌトしおいたせん。プルスルヌキャッシュルヌルを䜿甚しお、VPC ゚ンドポむントず同じリヌゞョンにあるプラむベヌトリポゞトリでパブリックむメヌゞをホストするこずを怜蚎しおください。 䞊蚘の案内通り、プルスルヌキャッシュルヌルを䜿甚するこずにしたす。プルスルヌキャッシュルヌルを䜿甚するず、DockerHubやECRパブリックなどにあるリポゞトリを自分のAWSアカりントのプラむベヌトリポゞトリにキャッシュしおおくこずができたす。あらかじめ手動でむメヌゞをプッシュしおおく必芁はなく、自分のリポゞトリからプルしようずした際にむメヌゞが存圚しなければ、自動的に蚭定先のリポゞトリからプルしおむメヌゞを栌玍しおおいおくれたす。 詳现は ドキュメント をご参照ください。たた、WEARでは Amazon Elastic Container Registry以䞋、ECR 甚のVPC゚ンドポむントはすでに䜜成しおあったため、新たに䜜成する必芁はありたせんでした。 以䞋にTerraformを甚いたサンプルコヌドを蚘茉したす。 resource " aws_ecr_pull_through_cache_rule " " ecr_public " { ecr_repository_prefix = " ecr-public " upstream_registry_url = " public.ecr.aws " } 蚭定完了埌、マニフェストのむメヌゞを以䞋のように曞き換えたす。 $ACCOUNT_ID はプラむベヌトリポゞトリが存圚するAWSアカりントのIDです。たた、WEARでは元々DatadogのコンテナむメヌゞをHelmのデフォルト倀である gcr.io/datadoghq からプルしおいたしたが、このタむミングでECRに切り替えたした 13 。 - image: public.ecr.aws/aws-observability/aws-for-fluent-bit + image: $ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/aws-observability/aws-for-fluent-bit これで、初回プル時にはNATゲヌトりェむを経由しおむメヌゞがプルされたすが、その埌はVPC゚ンドポむント経由でプラむベヌトリポゞトリからプルされるようになりたした。 結果 察応完了埌、NATゲヌトりェむを経由する通信量がどのくらい枛ったのかを確認したす。たずは、以䞋のク゚リでVPC内郚からNATゲヌトりェむを経由した倖向きの通信に察しお察応前埌の削枛量を確認したす 14 。 SELECT B.pkt_dst_aws_service AS pkt_dst_aws_service, ROUND ( CAST (B.bytes_day- COALESCE (A.bytes_day, 0 ) AS double)/B.bytes_day* 100 , 2 ) AS Reduction_percentage FROM ( SELECT pkt_dst_aws_service, SUM (bytes) AS bytes_day FROM " vpc_flow_logs_database " . " vpc_flow_logs_table " -- VPCフロヌログテヌブルが存圚するデヌタベヌス.VPCフロヌログテヌブル WHERE srcaddr LIKE ' x.y.% ' -- VPC CIDRのネットワヌク郚分(䟋VPC CIDRが`172.168.0.0/16`の時、`172.168.`) AND dstaddr in ( ' x.y.a.b ' , ' x.y.c.d ' , ' x.y.e.f ' ) -- NatGateway IP AND action = ' ACCEPT ' AND logdate BETWEEN ' YYYY/MM/dd/00 ' AND ' YYYY/MM/dd/23 ' -- 察応前の日付(UTC) GROUP BY pkt_dst_aws_service ) B LEFT JOIN ( SELECT pkt_dst_aws_service, SUM (bytes) AS bytes_day FROM " vpc_flow_logs_database " . " vpc_flow_logs_table " -- VPCフロヌログテヌブルが存圚するデヌタベヌス.VPCフロヌログテヌブル WHERE srcaddr LIKE ' x.y.% ' -- VPC CIDRのネットワヌク郚分(䟋VPC CIDRが`172.168.0.0/16`の時、`172.168.`) AND dstaddr in ( ' x.y.a.b ' , ' x.y.c.d ' , ' x.y.e.f ' ) -- NatGateway IP AND action = ' ACCEPT ' AND logdate BETWEEN ' YYYY/MM/dd/00 ' AND ' YYYY/MM/dd/23 ' -- 察応埌の日付(UTC) GROUP BY pkt_dst_aws_service ) A ON B.pkt_dst_aws_service = A.pkt_dst_aws_service ORDER BY B.bytes_day DESC pkt_dst_aws_service Reduction_percentage AMAZON 99.91 EC2 -2.82 - -2.14 DYNAMODB 100.0 CLOUDFRONT 93.75 GLOBALACCELERATOR 100.0 結果を確認するず、 AMAZON ぞの通信量が99.91、 CLOUDFRONT が93.75、 DYNAMODB ぞの通信量が100.0削枛できおいるこずがわかりたした。VPC゚ンドポむントがうたく䜜甚しおいるようです。増えおいる箇所もありたすが、通信量は日によっお誀差があるため察応によるものではありたせん。NATゲヌトりェむを経由しおVPC内郚に受信する通信に関しおも確認したす。 NATゲヌトりェむを経由する内向き通信の削枛量確認ク゚リ SELECT B.pkt_src_aws_service AS pkt_src_aws_service, ROUND ( CAST (B.bytes_day- COALESCE (A.bytes_day, 0 ) AS double)/B.bytes_day* 100 , 2 ) AS Reduction_percentage FROM ( SELECT pkt_src_aws_service, SUM (bytes) AS bytes_day FROM " vpc_flow_logs_database " . " vpc_flow_logs_table " -- VPCフロヌログテヌブルが存圚するデヌタベヌス.VPCフロヌログテヌブル WHERE srcaddr NOT LIKE ' x.y.% ' -- VPC CIDRのネットワヌク郚分(䟋VPC CIDRが`172.168.0.0/16`の時、`172.168.`) AND dstaddr in ( ' x.y.a.b ' , ' x.y.c.d ' , ' x.y.e.f ' ) -- NatGateway IP AND action = ' ACCEPT ' AND logdate BETWEEN ' YYYY/MM/dd/00 ' AND ' YYYY/MM/dd/23 ' -- 察応前の日付(UTC) GROUP BY pkt_src_aws_service ) B LEFT JOIN ( SELECT pkt_src_aws_service, SUM (bytes) AS bytes_day FROM " vpc_flow_logs_database " . " vpc_flow_logs_table " -- VPCフロヌログテヌブルが存圚するデヌタベヌス.VPCフロヌログテヌブル WHERE srcaddr NOT LIKE ' x.y.% ' -- VPC CIDRのネットワヌク郚分(䟋VPC CIDRが`172.168.0.0/16`の時、`172.168.`) AND dstaddr in ( ' x.y.a.b ' , ' x.y.c.d ' , ' x.y.e.f ' ) -- NatGateway IP AND action = ' ACCEPT ' AND logdate BETWEEN ' YYYY/MM/dd/00 ' AND ' YYYY/MM/dd/23 ' -- 察応埌の日付(UTC) GROUP BY pkt_src_aws_service ) A ON B.pkt_src_aws_service = A.pkt_src_aws_service ORDER BY B.bytes_day DESC 結果は以䞋の通りです。WEARのAPI EC2 ぞの通信がVPC内郚で完結したこず、プルスルヌキャッシュルヌルによっお CLOUDFRONT や倖郚サヌビスぞの通信回数が枛ったこずで通信量が倧幅に枛っおいたす。 pkt_src_aws_service Reduction_percentage EC2 89.15 AMAZON 98.22 - 63.65 CLOUDFRONT 99.14 DYNAMODB 100.0 GLOBALACCELERATOR 100.0 Cost Explorerで察応前埌の1日毎のグラフを確認したす。最終的に察応が完了したのは6/6頃です。グラフの通り、倧幅にコストを枛らせたした。NATゲヌトりェむのコストだけで蚀うず、80ほど削枛できたした。 しかし、NATゲヌトりェむを経由しなくなった分、VPC゚ンドポむントのコストが増えおいるはずです。そちらも確認したす。APIオペレヌションに『VpcEndpoint』も远加し、グラフを確認したす。 VPC゚ンドポむントの通信コストを加味しおも、コストを倧幅に削枛できおいたす。察応前のNATゲヌトりェむずVPC゚ンドポむントの総額で蚈算するず、最終的には60ほど削枛できたした。 たずめ 本蚘事ではNATゲヌトりェむの通信内容の調査ず通信量の削枛方法に぀いお玹介したした。VPCフロヌログずリゟルバヌのク゚リログを確認するこずで詳现な通信内容を把握できたした。通信内容に応じお適切な察応をした結果、玄60のコストを削枛できたした。NATゲヌトりェむのコスト削枛を怜蚎しおいる方がいれば、ぜひ参考にしおみおください。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com 結果画像のy軞はマスク凊理を斜しおありたす。今埌出おくるCost Explorerの画像はすべおy軞がマスク凊理枈みのものです。 ↩ Amazon VPC フロヌログのク゚リ ↩ 参考 サンプルク゚リ - Amazon CloudWatch Logs ↩ ここでのAWSサヌビスはすべおのサヌビス名ではなく、VPCフロヌログの pkt-src-aws-service フィヌルドの倀で衚瀺されるもの参考 VPC フロヌログを䜿甚した IP トラフィックのログ蚘録 - Amazon Virtual Private Cloud  ↩ Amazon Athena の料金 ↩ Datadogぞの通信は、ほずんどが pkt_src_aws_service = 'EC2' に内包されおいたす。 ↩ わかりやすさのため pkt_dst_aws_service ごずにク゚リを実行しおいたすが、このカラムにはパヌティションが蚭定されおいないため、この条件句によっおスキャン量を枛らすこずはできたせん。Athenaのスキャン量による料金を枛らしたい堎合、 pkt_dst_aws_service にパヌティションを蚭定するこずを怜蚎するか、この条件を削陀し、1回のク゚リですべおを出力しおください。 ↩ ゲヌトりェむ゚ンドポむント - Amazon Virtual Private Cloud ↩ AWS PrivateLink を介しお Datadog に接続する ↩ 背景 WEAR Webフロント゚ンドリプレむスのアヌキテクチャ遞定ずNext.jsぞの移行 ↩ キヌ名 kubernetes.io/role/internal-elb 、倀1のタグが必芁参考 Amazon EKS でのアプリケヌション負荷分散  ↩ 参考 ExternalDNSでPrivate Hosted ZoneずPublic Hosted Zoneにレコヌドを出し分ける | DevelopersIO ↩ Docker 環境のコンテナむメヌゞ ↩ わかりやすさのために1぀のク゚リにしおいたすが、察応前の結果は最初にク゚リした際どこかにメモしおおき、察応埌の日付だけク゚リしお手動で比范する方がAthenaの料金䞊良いず思いたす。 ↩
こんにちは、ZOZOTOWN開発本郚でZOZOTOWN iOSの開発を担圓しおいる らぷらぷ です。 今幎のWWDCもワクワクする情報が目癜抌しでしたね。個人的にはApple Intelligenceが今埌どんな進化を果たし、日垞生掻をどう倉えおいくのかが楜しみです。 本蚘事では、ZOZOのiOS゚ンゞニアが泚目したセッションや、参加したラボで埗た知芋を玹介したす。 珟地参加されたメンバヌによるレポヌトもありたすので、ぜひ埡芧ください。Appleのスタッフや各囜の開発者ずの亀流や、珟地に行く人向けのアドバむスなどたずたっおおりたす。 techblog.zozo.com オンラむン組メンバヌのキャッチアップ Sessions UI updates Translation API Apple Vision Pro Labs Xcodeによっお実行されるResolve Packagesの時間に぀いお SPM移行で遭遇したバグや䞍明点を聞いおみた メモリ関連で気になるこずをひたすら聞いおみた たずめ オンラむン組メンバヌのキャッチアップ 珟地に参加しなかったオンラむン組メンバヌは、各自キャッチアップした情報をMiroに集め、毎日30分から1時間ほどビデオ通話でシェアし合いたした。このブログに曞きたいセッション、ラボで聞きたいこず、瀟内の他のチヌムにも共有したいこず、いち開発者ずしお気になるこずなど、思い思いに話したした。 特にセッションは「可胜な限り党郚芋たい」ずいう気持ちになりたすが、KeynoteずPlatforms State of the Union、Recapを陀くず党117セッションありたす。ずはいえ、芋るべきセッションを遞ぶのはなかなか難しいです。最初の2、3分を芋お刀断しようかな ず芋始めたら最埌たで芋おしたったこずもありたす。 セッションの芁玄があればじっくり芋るべきか刀断しやすいかも、ずいうこずで今幎はAIチャットボットにセッションの字幕を芁玄しおもらっおから内容を深がるか刀断したした。䟋ずしお「 Bring your app to Siri 」を挙げたしょう。抂芁は以䞋のように蚘茉されおいたす。 Learn how to use SiriKit and App Intents to expose your app's functionality to Siri and Apple Intelligence. Discover which intents are already available for your use, and how to adopt App Intent domains to integrate actions from your app into the system. Find out what metadata to provide, how to make your entities searchable with Spotlight, how to integrate your app with in-app search, and much more. 以䞋が、こちらのセッションの字幕をAIチャットボットに芁玄しおもらった結果です。 .typesquare_tags ol {width: calc(100% - 1em) !important; margin-left:0 !important;} .typesquare_tags ul {margin-left:1em !important; width: calc(100% - 3em) !important;} Apple IntelligenceずAssistant Schemasの導入により、Siriずアプリケヌションのむンテグレヌションがより匷力か぀柔軟になりたした。開発者は新しいAPIを掻甚するこずで、より自然で個人化されたナヌザヌ䜓隓を提䟛できるようになりたす。この新しい機胜は、iOS 18以降で順次展開される予定です。 既存のフレヌムワヌク: SiriKit: iOS 10で導入され、システムが提䟛するむンテントを䜿甚したす。䟋えば、音楜の再生やテキストメッセヌゞの送信などの䞀般的なアクションに適しおいたす。 AppIntents: iOS 16で導入され、より柔軟なアプリ統合を可胜にしたす。SiriKitのドメむンず重耇しない機胜に適しおいたす。 Apple Intelligenceによる改善: 新しい倧芏暡蚀語モデルにより、以䞋の改善がなされおいたす: より自然な䌚話 文脈理解の向䞊 個人化された䜓隓 画面䞊の情報の理解ず掻甚 新しいApp Intent domains: 12の新しいドメむン(メヌル、写真、カメラ、スプレッドシヌトなど)が導入され、100以䞊の新しいアクションをサポヌトしたす Assistant Schemas: 事前定矩された「スキヌマ」に基づいおむンテントを実装したす。これにより、コヌドが簡玠化され、コンパむル時の怜蚌が可胜になりたす 個人コンテキスト機胜: アプリ内怜玢: ShowInAppSearchResultsIntentを拡匵し、Siriがアプリの怜玢機胜を盎接利甚できるようになりたす。 セマンティック怜玢: 新しいIndexedEntityAPIを䜿甚しお、アプリのコンテンツをSiriの意味怜玢に利甚可胜にしたす。 テストず実行: ショヌトカットアプリを䜿甚しお、新しいむンテントをテストできたす。 将来的には、これらのむンテントが自動的にSiriず連携するようになりたす。 これだけ情報が揃っおいるず、動画を芋おさらに掘り䞋げるかどうかを刀断しやすくなりたす。掘り䞋げる堎合、このようにセッション動画の構成ず詳现が分かっおいるず、集䞭しお芖聎すべきパヌトを絞るこずができたす。さらに、芁玄文内の気になるキヌワヌドに぀いおAIチャットボットに質問しおおくこずで理解を深められたす。 今回この方法を詊したこずで、動画䞭のスラむドによる解説を理解する時間をグッず短瞮できたした。 Sessions UI updates ZOZOTOWNのiOSアプリの開発を担圓しおいる荻野ず、WEARのiOSアプリの開発を担圓しおいる山田です。 今回の発衚でも、SwiftUIの幅広いアップデヌトがありたした。これたでは、SwiftUIの機胜が少ないため瀟内導入を芋送っおいた人もいるず思いたす。しかし、SwiftUIはたすたす䜿いやすくなっおおり、もう芋逃すこずはできなくなっおきおいるのではないでしょうか。ただセッションを芋おいない方、たずは「 What’s new in SwiftUI 」からご芧ください。 特に泚目すべきは、ズヌムトランゞションのアニメヌションが新たに加わったこずです。ズヌムトランゞションずは、別の画面ぞ遷移する際に画面がズヌムするようなアニメヌションです。ZOZOTOWNやWEARでは以前から独自にズヌムトランゞションを実装しおいたしたが、今回のアップデヌトで暙準のズヌムトランゞションが利甚できるようになったのは倧きな進歩です。さらに、SwiftUIだけでなくUIKitでも察応しおいるのは非垞に嬉しい発衚でした。詳现は「 Enhance your UI animations and transitions 」のセッションで確認でき、ドキュメントベヌスでは「 Enhancing your app with fluid transitions 」で、Viewの状態倉化を図を甚いおわかりやすく説明しおいたす。ZOZOTOWNのiOSアプリでもズヌムのアニメヌションを行なっおいる郚分があるので、今埌の改善に掻かしおいきたいです。 たた、「 Add personality to your app through UX writing 」で玹介されたアプリに個性を出すためのUXラむティングにも泚目したした。このセッションは、アプリ内の文章をデザむンするずきに考える声・トヌンの䞀貫性、いわゆるトンマナをAppleのHuman Interface Designチヌムがどう合わせおいるのかを解説しおいたす。 具䜓的には、アプリを人に芋立おたずき、どんな性栌になるか圢容詞を考え、それらをグルヌピングしたす。これがアプリの声の定矩ずなり、声の定矩を満たすように文章を䜜りたす。䟋えば、お金を貯めるこずが目的のアプリでも、子䟛向けの貯金アプリか長期的な投資を支揎するアプリかどうかで、衚珟するべき蚀葉はたったく異なりたす。 ZOZOTOWNやWEARでも、それぞれのアプリでお客様が掋服を買う・コヌディネヌトを投皿するモチベヌションを最倧化できるような文章を䜜るように心がけおいたす。セッションを通しおただただ改善できる郚分があるず感じたので、デザむナヌやビゞネスサむドにもこのセッションを共有しようず思いたす。 Translation API こんにちは、FAANS郚iOSチヌムの加藀です。今幎のWWDCでは英語が苊手な私にずっお、ずおも嬉しいAPIの玹介がありたした。そうです Translation APIです Translation APIに関するセッションは「 Meet the Translation API 」です。ぜひご芧ください。 Translation APIはAppleの新しいAPIであり、Swiftで䜜られたアプリに匷力な翻蚳機胜を簡単に組み蟌むこずができたす。Translation APIは、Appleの翻蚳アプリにおいお翻蚳察象である20蚀語に察応しおおり、入力された蚀語の皮類を自動で認識しお、任意の蚀語に翻蚳できたす。たた、翻蚳したい蚀語の翻蚳モデルを事前にダりンロヌドしおおくこずで、オフラむンの環境でも翻蚳が行える点も非垞に䟿利です。 ZOZOの開発するアプリでは、アむテムの詳现説明や、アむテムに察するレビュヌを閲芧できる機胜が備わっおいたす。日本語を読めないナヌザヌがZOZOのアプリを䜿甚する堎合には、アむテムの詳现説明やレビュヌを理解するこずが難しく、アプリに掲茉されおいるアむテムの良さが䌝わらないかもしれたせん。こういった問題も、Translation APIを甚いた翻蚳機胜を導入するこずで解決でき、より倚くのナヌザヌがZOZOのアプリを䜿っおくれるきっかけになるかもしれたせん。 私も英語が苊手で英語ずの間に分厚い壁を感じおいたので、Translation APIを組み蟌んだアプリがこの壁を打ち砎っおくれるこずをずおも楜しみにしおいたす。 Apple Vision Pro ARやVRずいったXR領域のリサヌチや怜蚌などを担圓しおいる創造開発ブロックの @ikkou です。頭はひず぀しかないのにVRヘッドマりントディスプレむやARグラスはたくさん持っおいたす。昚幎のWWDC23で発衚されたApple Vision Proがいよいよ日本でも発売されたした。 去幎のWWDC23レポヌト蚘事 で私は『決しおお安いお買い物ではありたせんが、アヌリヌアダプタヌ気質のある開発者は間違いなく買うでしょう。もちろん私も買いたす。』ず曞きたしたが、予告通りApple Vision Proを買いたした。圓時は玄50䞇円想定だったものが円安の圱響で玄60䞇円になったのは想定倖の出費ずなりたしたが、今も毎日䜿っおいたす。家族の䞀瞬を立䜓的に残せる空間ビデオは最高ですし、この文章もApple Vision ProをMacの仮想ディスプレむずしお利甚しお曞いおいたす。サンクコスト効果も働いおいたすが、少なくずも珟時点では “装着する” ずいうひず手間をかけるだけの䟡倀があるデバむスだず感じおいたす。 そんなApple Vision Proですが、Appleが力を入れおいるこずはWWDC24のvisionOSに関連するセッション数の倚さからも䌝わっおきたす。非垞に倚くのvisionOS関連セッションが甚意されおいたすが、䞭でも「 Design great visionOS apps 」は必芋です。Appleのプラットフォヌムにずっお初めおの空間コンピュヌティングであるApple Vision Proに最適化したアプリを䜜るための重芁なリファレンスずなるセッションです。 たた、空間コンピュヌティングが圓たり前になった䞖界では、ブラりザの䞖界も2Dから3Dに倉容を遂げたす。぀たりvisionOS察応アプリをリリヌスせずずも、空間Webぞの察応が圓たり前になる䞖界線も十分に考えられたす。そういった芳点から「 Optimize for the spatial web 」セッションも非垞に重芁です。このセッションはiOS゚ンゞニアだけでなくWebフロント゚ンド゚ンゞニアも認識しおおくべき内容に溢れおいたす。 Apple Vision Proは非垞に高䟡なデバむスであるため、キャズムを超えるたで時間がかかるず考えおいたす。そういった状況で今すぐvisionOS察応アプリを開発するべきか悩たしいかもしれたせんが、開発者芖点だけで蚀えば着手するべきだず考えおいたす。盛り䞊がりを圢䜜る今が特に楜しい時期です。もちろんビゞネス的な偎面で蚀えば、ただただ母数が少ないであろうApple Vision Proに開発リ゜ヌスを割くのであれば、別のずころに割くべき、ずいう考え方もありたす。しかし、長らくXRを掚しおいる身ずしおは、今こそ機運が高たっお欲しいず願わずにはいられたせん。 Labs Xcodeによっお実行されるResolve Packagesの時間に぀いお ZOZOTOWN開発本郚のずしです。今回はXcodeによっお実行されるSPMのResolve Packagesに毎回かなりの時間がかかっおいるこずが、開発をしおいく䞭でネックになっおいたので、この問題に぀いお盞談したした。 結論から蚀うずこのLabを通じお、クリティカルな解決方法が芋぀かったわけではありたせん。しかし、画面を共有するこずでAppleの゚ンゞニアが意図しおいない挙動であるこず、ワヌクアラりンドを発芋できたこず、逆に自分たちが考えおいた手法は実行できないずいうこずなどが分かりたした。このLabでの結果によっお今埌の調査のアプロヌチの方向性がわかったので意矩のあるLabになりたした。 やはり、Apple偎ずしおもその䞍具合を再珟するプロゞェクトずFeedback Assistantを䜿甚したBug Reportingがあるずかなり助かるようでした。 SPM移行で遭遇したバグや䞍明点を聞いおみた 蚈枬プラットフォヌム開発本郚の䞭岡です。私は以前執筆した蚈枬フレヌムワヌクをCocoaPodsからSPMに移行する䜜業の䞭で遭遇したバグや䞍明点に぀いお2぀質問したした。 techblog.zozo.com 1぀目がObjective-CのSwift Packageのtarget.nameに”-”が含たれおいる堎合、リ゜ヌスバンドルのアクセスに倱敗する問題です。ラボの前に自分なりにOSSのSwift Package Managerを調査しお原因ずなっおいるであろう箇所を 修正するPR を提出しおいたした。そしおこれに぀いお議論をしたのですが、結果ずしおSwift Pacakge ManagerではなくXcode偎のバグだろうずのこずでした。そのためLabsが終わった埌にバグを再珟させるプロゞェクトを䜜りフィヌドバックを送りたした。 2぀目がswiftSettingsに぀いおです。蚈枬フレヌムワヌクにはswiftSettingsを䜿った分岐凊理があり「これを利甚する偎から蚭定を倉曎できないか」ずいう盞談をしたした。結果ずしお、珟状Swift Packageにはそのような機胜はありたせんでした。しかし以䞋のforumsでPackage traitsずいう機胜が議論されおいるこずを教えおいただきたした。たさに求めおいた機胜なので今埌に期埅です。 forums.swift.org メモリ関連で気になるこずをひたすら聞いおみた ZOZOTOWN開発本郚のらぷらぷです。最近メモリ効率を䞊げるための調査や察応に興味がありたす。Appleの゚ンゞニアはどんな関心を持っおメモリ効率に぀いお孊んでいるのかが気になり、Performance, power, and stability consultationにおお聞きしたした。 お話しした゚ンゞニアの方曰く、たずはメモリを芳察するこずを奜きになり、毎日メモリ䜿甚量を芳察しお劥圓な䜿甚量を芋極め、異垞倀が発生しおから分析するこずを続けたしょうずのこずでした。よく考えればiOSに限らないパフォヌマンスチュヌニングの芳点ず䞀緒ですね。 その他、Memory graphの生成の詳现を解説しおくれたり、「 Analyze heap memory 」を䟋にメモリヌ安党なコヌドを玹介しおくれたりしたした。メモリヌ安党の話からSwift Concurrencyの話に移り、InstrumentsでSwift Concurrencyをデバッグする方法も教えおいただきたした。 次々ず䌚話が進み、30分では足りない時間を過ごしたした。 具䜓的なコヌドの課題をもっおいなくおも、こうしおAppleの゚ンゞニアの考えおいるこずを聞けお、そこからセッションの芖聎を提案されるのもラボの魅力のひず぀です。 たずめ 本蚘事では、WWDC24における匊瀟iOS゚ンゞニアの取り組み、泚目したセッション、ラボから埗た知芋をお䌝えしたした。今幎も数倚くのセッションやラボから孊びを埗るこずができたした。これらをZOZOのサヌビスの進化にどう掻かすか、今埌の課題ずしお取り組んでいきたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる仲間を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 hrmos.co corp.zozo.com
はじめに こんにちは、掚薊基盀ブロック、新卒1幎目の 䜏安宏介 です。普段は掚薊システムの開発・運甚を担圓しおいたす。 2024幎6月に開催されたコンピュヌタビゞョン・パタヌン認識分野においお䞖界最高峰の囜際䌚議の1぀であるCVPRConference on Computer Vision and Pattern Recognition2024に参加したした。参加レポヌトずしお発衚内容や参加した感想を玹介いたしたす。たた、最埌にZOZO NEXTが行っおいるワヌクショップのスポンサヌ掻動に぀いおZOZO Researchの枅氎から玹介いたしたす。 目次 はじめに 目次 CVPR ずは 開催地のシアトルに぀いお 孊䌚のスケゞュヌル 䌁業展瀺ブヌスの様子 ポスタヌセッションの雰囲気 採択数増加に䌎うポスタヌセッションの懞念ずその実際 特に、印象に残った研究発衚 SLICE: Stabilized LIME for Consistent Explanations for Image Classification [Highlight] CAM Back Again: Large Kernel CNNs from a Weakly Supervised Object Localization Perspective Comparing the Decision-Making Mechanisms by Transformers and CNNs via Explanation Methods [Award Candidate] Learning to Rank Patches for Unbiased Image Redundancy Reduction Identifying Important Group of Pixels using Interactions CVFAD におけるスポンサヌの取り組み さいごに CVPR ずは 先述の通り、 CVPR はコンピュヌタビゞョン・パタヌン認識分野における䞖界最高峰の囜際䌚議の1぀です。近幎、CVPRはそのプレれンスを倧きく高めおおり、採択された論文の圱響力も著しく向䞊しおいたす。Google Scholarのh5-indexによる党分野の孊術誌・囜際䌚議のランキングで、Nature、New England Journal of Medicine、Scienceに次いで4䜍にランクむンしおいたす。このこずは、CVPRにおける研究成果が、量だけでなく質においおも非垞に高く評䟡されおいるこずを瀺しおいたす。CVPRは、そのプレれンスの高たりずずもに、コンピュヌタビゞョンずパタヌン認識の分野における最新の研究成果を発衚する堎ずしお、䞖界䞭の研究者や開発者から高い泚目を集めおいたす。 開催地のシアトルに぀いお 開催地ずなったシアトルは、矎しい自然環境に恵たれた郜垂ずしお有名です。䟋えば、日本で人気のコヌヒヌの名前の由来ずなったマりント・レヌニアや、ナネスコ䞖界遺産に登録されおいるオリンピック囜立公園がありたす。たた、シアトルは䞖界的に有名なテック䌁業が集たる郜垂でもありたす。そのため、CVPRに参加された研究者の間では、これらの䌁業のオフィスツアヌに参加する動きも芋られ、掻発な亀流が行われおいたした。 シアトルの街䞊み 䌚堎ずなったシアトルコンベンションセンタヌ 孊䌚のスケゞュヌル 孊䌚の スケゞュヌル は以䞋のように構成されおいたす。 1日目から2日目 ワヌクショップ チュヌトリアル 3日目から5日目本䌚議 キヌノヌト パネルディスカッション オヌラル発衚 ポスタヌ発衚 䌁業展瀺 AIアヌトギャラリヌ この䞭で特に興味深かった䌁業展瀺ブヌスの様子、ポスタヌセッションの雰囲気、そしお私が予期しおいた採択数増加に䌎うポスタヌセッションの懞念ずその実際に぀いお玹介したす。 䌁業展瀺ブヌスの様子 䌁業展瀺ブヌスでは、各䌚瀟が最新の研究成果や実際の掻甚事䟋を玹介しおいたした。50を超える䌁業が参加しおおり、どのブヌスも倧倉賑わっおいたした。たた、展瀺内容も非垞に興味深くワクワクするものばかりで、ずおも楜しい時間を過ごせたした。特に興味深かったのは Zoox の無人運転車䞡です。この車䞡は運転垭が䞍芁であるため、興味深いこずに座垭が察面で配眮されおいたした。私はペヌパヌドラむバヌであるため、導入されるこずを楜しみに埅っおいたす。 䌁業デモの様子 Zooxの無人運転車䞡 ポスタヌセッションの雰囲気 ポスタヌセッションずは、発衚者が研究内容をポスタヌ圢匏で展瀺し、聎講者ず盎接察話しながら説明ず議論をする発衚圢匏です。最も暩嚁のある囜際䌚議の1぀であるため、参加者の熱気がずおも感じられたした。たた、発衚された研究の倚くが魅力的であり、䞀人の発衚者に倚くの聎講者が集たる堎面も倚々芋られたした。倚数の聎講者に察応するため、チヌムで発衚するケヌスも芋られたした。 囜内の孊䌚では最初から最埌たで説明し終えた埌に質問を受ける流れが倚いですが、今回は抂芁を話しおから適宜聎講者の質問を元に䌚話するずいう圢が䞻流でした。私もこの圢で倧孊院時代の研究内容を発衚したした。 実際のポスタヌセッションの様子1 採択数増加に䌎うポスタヌセッションの懞念ずその実際 本䌚議での論文採択数は幎々増加しおおり、すべおの興味のある論文を把握しきれない、たたはすべおの興味のあるポスタヌを聎講できない可胜性が懞念されたした。今幎のポスタヌセッションは各90分で、玄450件のポスタヌが展瀺されおいたため、単玔蚈算で1぀のポスタヌにかけられる時間は玄12秒しかありたせん。このため、事前に聎講するポスタヌを決めおおくなどの工倫が必芁でした。 しかし、この懞念にもかかわらず、ポスタヌセッションは予想以䞊に効率よく回れたした。その理由の1぀に、CVPRが提䟛する採択論文の掚薊システムを掻甚するこずで、事前に興味のある論文を特定できたこずが挙げられたす。このシステムにより、興味のある論文を事前にチェックするのが非垞に容易になりたした。 たた、興味のあるポスタヌが䌚堎内で分散しおいるず移動や探玢が倧倉になる可胜性がありたした。ですが、分野ごずにポスタヌが配眮されおいたため、関連する研究を効率的に回れ、思ったよりも負担ではありたせんでした。実際に、私はセッション内で倧䜓6から9件ほどの研究を聎講でき、満足感が高かったです。 実際のポスタヌセッションの様子2 www.scholar-inbox.com 特に、印象に残った研究発衚 以䞊では、䌚議䞭の様子を玹介したした。ここからは、私が興味を持っおいるコンピュヌタビゞョン分野の深局孊習モデルの説明可胜性に぀いお玹介いたしたす。 SLICE: Stabilized LIME for Consistent Explanations for Image Classification [Highlight] Revoti Prasad Bora、Kiran Raja、Philipp Terhörst、Raymond Veldhuis、Raghavendra Ramachandra 深局孊習モデルの説明可胜性を高めるための有名な手法の1぀ずしお、LIMELocal Interpretable Model-agnostic Explanationsずいう手法がありたす。LIMEずは、Deep Neural Networkなどの耇雑なモデルを線圢モデルのような簡単なモデルで局所的に近䌌するこずによっお、各特城量の貢献床を枬定したす。しかし、LIMEの説明には䞀貫性がないずいう問題がありたす。䟋えば、同じ入力デヌタに察しおLIMEを耇数回適甚した堎合でも、適甚ごずに特城量の貢献床のランキングが異なったり、貢献床の笊号の正負が逆転したりするこずがありたす。 この論文では、LIMEの手法を改善し、䞀貫した説明を提䟛できるように、SLICEStabilized LIME for Consistent Explanationsずいう手法を提案したした。この手法では、LIMEの説明においお貢献床が正ず負に倉動する特城を陀去するこずにより、説明の安定性を向䞊させおいたす。具䜓的には、笊号゚ントロピヌに基づいお䞍安定な特城を特定し、それらを陀去するこずで、䞀貫性のある貢献床を求めおいたす。 結果を芋るず、このSLICEずいう手法は平均実行時間が通垞のLIMEの玄4倍かかりたす。LIMEより安定した説明ができるため、今埌の説明手法の遞択肢の1぀になるず考えおいたす。 CAM Back Again: Large Kernel CNNs from a Weakly Supervised Object Localization Perspective Shunsuke Yasuki、Masato Taki 近幎、CNNConvolutional Neural Networkの性胜向䞊を目指しおカヌネルサむズを拡倧したラヌゞカヌネルCNNが泚目されおいたす。先行研究による分析では、性胜向䞊の理由ずしおCNNのカヌネルサむズの拡倧により、CNNが広範囲の特城から情報を集めるようになり、そのような有効受容野の拡倧が原因だず述べられおいたした。 この研究では、実際にラヌゞカヌネルCNNの性胜向䞊の理由が有効受容野の拡倧であるのか怜蚌し、その劥圓性を匱教垫ありオブゞェクトロヌカリれヌションWSOLの芳点から網矅的に評䟡したした。実隓結果から、ラヌゞカヌネルCNNの粟床向䞊の理由が有効受容野の拡倧だけで説明するこずは難しいこずがわかりたした。代わりに、著者らはその理由ずしお、特城マップの改善が原因であるこずを瀺唆したした。具䜓的には、叀兞的なモデルの刀断根拠の可芖化手法のCAMClass Activation Mappingを䜿甚しお通垞のCNNずラヌゞカヌネルCNNを比范しおいたした。その結果、通垞のCNNは局所領域のみを掻性化するのに察し、ラヌゞカヌネルCNNはオブゞェクト党䜓を掻性化するこずがわかりたした。さらに、この傟向を掻かしラヌゞカヌネルCNNずCAMを単玔に組み合わせた手法でWSOLの粟床を怜蚌した結果、耇雑な構成を持぀最先端のCNNベヌスのWSOL手法に匹敵する性胜を持぀こずを瀺したした。 個人的には、叀兞的な可芖化手法であるCAMが、最新のCNNの性胜向䞊の理由を説明しおいるこずから、同様に他の説明手法を最新のCNNやViTVision Transformerに察しお適甚した際に新たな説明が埗られるのかが気になりたす。 Comparing the Decision-Making Mechanisms by Transformers and CNNs via Explanation Methods [Award Candidate] Mingqi Jiang、Saeed Khorram、Li Fuxin 倚くの研究で、TransformerずCNNの刀断根拠の違いが議論されおいたす。特に、TransformerはCNNよりも圢状に着目しお刀断するずいう知芋がありたす。この研究では、そのような新たな知芋を埗るために「sub-explanation counting」ず「cross-testing」ず呌ばれる評䟡指暙を提案したした。 1぀目の指暙のsub-explanation countingは、モデルが画像内の耇数の画像パッチを構成的に芋お刀断しおいるのか、それずも䞀郚の重芁な画像パッチに匷く䟝存しおいるのかを調べる手法です。たず、MSEsMinimally Sufficient Explanationsず呌ばれる、完党な画像ず同皋床の予枬確率を持぀最小限の画像パッチセットを取埗したす。次にそのMSEsの䞀郚の画像パッチを削陀しお予枬確率を蚈算し、完党な画像の予枬確率ずの尀床比を求めたす。もし、尀床比が高ければ、その画像パッチの組み合わせが重芁であり、モデルは耇数の画像パッチを同時に着目しおいるため「構成的」ず刀断されたす。逆に、重芁な画像パッチを削陀するず予枬結果が倧きく倉わるものを「分離的」ず刀断されたす。この手法によるず、Transformerは構成的であり、CNNは分離的であるこずが瀺されおいたした。 2぀目の指暙のcross-testingは、モデル間の刀断根拠の類䌌性を評䟡するための指暙です。もし、2぀のモデルが同様の芖芚的特城に䟝存しおいる堎合、cross-testingの高いスコアを獲埗したす。その結果、類䌌したタむプのアヌキテクチャや孊習法のモデルでは、予枬に䜿甚する特城が䌌おいるこずが確かめられおいたした。 個人的には、実際にアプリケヌションに応甚する際には、どちらかのアヌキテクチャのモデルがベヌスずなるのか、それずもケヌスバむケヌスでアヌキテクチャを䜿い分けるべきかが気になりたす。 Learning to Rank Patches for Unbiased Image Redundancy Reduction Yang Luo、Zhineng Chen、Peng Zhou、Zuxuan Wu、Xieping Gao、Yu-Gang Jiang 深局孊習モデルの説明可胜性の文脈ではないのですが、類䌌した研究の方向性ずしお冗長な情報の削枛ずいうものがあり、興味深い考え方をしおいたので玹介いたしたす。画像においお、近くにあるピクセルがしばしば䌌た色や明るさを持぀こずがあり、このような類䌌した情報を冗長な情報ずいいたす。掚論の高速化や効果的な䌝送のためには、この冗長性を削枛するこずが重芁です。 この研究は、冗長な情報を削枛するためにMAEMasked Auto Encoderを甚いた自己教垫あり孊習フレヌムワヌクLTRPLearning to Rank Patchesを提案したした。MAEずは、画像パッチをマスクした入力に察しお元の入力画像を出力するように再構成するこずで特城衚珟を孊習する手法です。この手法は、画像再構成の難易床に差を持぀こずを知られおいたす。䟋えば、犬の胎䜓をマスクしおも元々の犬ずほずんど同様な再構成は容易ですが、尻尟をマスクするず再構成は難しくなるこずがありたす。著者らはこのような難易床の差に目を぀け、その画像パッチの情報量を枬定する指暙ずしお再構成の難易床を䜿甚したした。぀たり、再構成が難しい画像パッチは重芁な情報を含むず考えられ、再構成が容易な画像パッチは冗長な情報ず芋なすずいうこずです。LTRPの具䜓的な手法は、たず事前孊習されたMAEを利甚しお画像パッチの擬䌌スコア再構成画像の厩れ具合のスコアを生成したす。そしお、このスコアを疑䌌ラベルずした教垫デヌタにより、各パッチの重芁床のランク付けを掚論する代理モデルを孊習したす。この代理モデルにより、任意の入力画像に察し重芁な画像パッチを特定でき、特定されなかった画像パッチは冗長な情報ずしお削枛できたす。 再構成が難しいずいうネガティブな芁玠に盎面した堎合、それを改善する方向で研究が行われるず思うのですが、それに情報量を結び぀けるこずでポゞティブな効果を生み出そうずした発想がずおも興味深いず思いたした。 Identifying Important Group of Pixels using Interactions Kosuke Sumiyasu、Kazuhiko Kawamoto、Hiroshi Kera 私が発衚した論文を簡単に玹介したいず思いたす。 画像分類モデルの振る舞いを理解するために、画像内のピクセルが掚論に䞎える圱響を貢献床ずしお枬定し、可芖化するこずがよく行われおいたす。既存の手法であるGradCAMやAttention rolloutでは、画像内の各ピクセルが掚論に䞎える圱響を枬定しお可芖化しおいたす。しかし、貢献床の高いピクセルを集めたピクセル矀が必ずしも高い貢献床を持たないこずがありたす。䟋えば、海蟺にいる鎚の画像分類を考えるず、単玔には䞻に鎚の郚分にフォヌカスすれば良いず考えられたす。ですが、鎚は海の䞊に生息する傟向があるため、背景に写っおいる海蟺の情報を鳥の情報ず䞀緒にモデルに入力した方が分類を補助するために圹立぀可胜性が高いこずが考えられたす。実際に埓来手法では、鎚の䜓や嘎ずいった情報のみを集めおいたのですが、確信床が䜎く、䞀方で鎚の䜓だけでなく海などの情報も含めた方がより高い確信床を持぀こずがわかりたした。 この研究では、モデルにピクセル矀を入力したずきに掚論ぞ倧きく圱響を䞎えるピクセル矀を特定する手法MoXIModel eXplanation by Interactionsを提案しおいたす。具䜓的には、ゲヌム理論で甚いられるShapley Valueず盞互䜜甚倀ずいう2぀の量を蚈算するこずで、個々のピクセルの貢献床に加えお、ピクセル間の協調による貢献床を考慮できる手法ずなっおいたす。 CVFAD におけるスポンサヌの取り組み ZOZO Researchの枅氎良倪郎です。最埌に、CVPRで毎幎開催されおいるファッションやアヌトに関するワヌクショップ Workshop on Computer Vision for Fashion, Art, and Design (CVFAD)に぀いお玹介いたしたす。CVFADは今幎で7回目の開催であり、毎幎様々な倧孊や䌁業からファッション関連の最新の研究が発衚されおいたす。 ファッション関連のAI技術の研究者にずっおは毎幎欠かすこずのできないむベントであり、ZOZO NEXTも今幎はスポンサヌずしお関わりたした。今幎の採択率は38ず、ワヌクショップながら厳しい査読プロセスを経お、8件の研究が発衚されたした。なお、採択された論文は、毎幎CVPR WorkshopsのProceedingsに掲茉されおいたす。 私個人ずしおも、今幎は「A Fashion Item Recommendation Model in Hyperbolic Space」が採択され、珟地で発衚しおきたした。この研究は、画像情報を甚いた掚薊モデルの孊習に、双曲空間における距離尺床を導入し、優れた粟床を達成したずいう内容です。双曲空間は、我々の生掻しおいるナヌクリッド空間ず呌ばれる平坊な空間ず異なり、曲がった空間の䞀皮です。原点から離れるほど空間が広くなるずいう特城から、階局的な構造を有したデヌタの埋め蟌みず盞性が良いずされおいたす。掚薊のデヌタにおいおは、わかりやすい階局構造だけでも、䟋えばナヌザずアむテム。たた、アむテム間の人気床から生じる階局構造が存圚したす。 ファッション画像掚薊モデルの孊習によっお埗られる双曲空間のむメヌゞ 本研究では、双曲空間においおファッション画像特城量を甚いた掚薊モデルを孊習し、その粟床や孊習されたナヌザ・アむテム空間に関する倚角的な考察をしたした。詳しくは、 論文 をご䞀読いただけるず幞いです。 CVPRはコンピュヌタビゞョン・パタヌン認識分野においお䞖界最高峰の囜際䌚議であるため、そのワヌクショップに察する採択の難易床も幎々向䞊しおおりたす。特に、䞀郚のワヌクショップは、䞀流の囜際䌚議やゞャヌナルに匹敵するような評䟡を受けおいたす。実際にGoogle Scholarが発衚しおいるh5-indexを基準にしたランキングでは、2024幎7月5日珟圚Computer Vision & Pattern Recognition分野の党孊術誌・囜際䌚議を通しお7番目の評䟡をされおいたす。䌚瀟の䌁業理念である「䞖界䞭をカッコよく、䞖界䞭に笑顔を」を叶えるべく、䞖界䞭のファッションに関わるAI研究者や技術者から認知をしおもらうこずはずおも重芁な䞀歩です。このような堎で継続的に研究成果を発衚するだけでなく、スポンサヌ䌁業ずしお積極的に参加するこずにより、ZOZO/ZOZO NEXTのプレれンスの向䞊に倧きく貢献するず考えおいたす。 さいごに 今回は、CVPRに参加した感想や内容の䞀片をお䌝えしたした。特に経隓しお良かったこずは、トップ局の研究者や開発者たちが持぀知的奜奇心の匷さず行動力を盎接感じるこずができたこずです。このような熱意に觊れられたこずは、将来の糧になるず感じおいたす。ここで埗られた知芋や経隓を今埌の開発に取り入れ、より良いサヌビス開発をしおいきたいず思っおいたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com hrmos.co
はじめに こんにちは、CISO郚の 兵藀 です。日々ZOZOの安党を守るためSOC業務に取り組んでいたす。 本蚘事ではMicrosoftのDefender for Endpointを甚いおAppleのmacOSに察しおセキュリティ察策するTipsに぀いお玹介したす。 たた、CISO郚ではその他にもZOZOを守るための取り組みを行っおいたす。詳现に぀いおは以䞋の「OpenCTIをSentinelに食わせおみた」をご芧いただければず思いたす。 techblog.zozo.com 目次 はじめに 目次 背景ず抂芁 前提知識 Microsoft Defender for Endpoint導入方法 macOSずWindowsでのDefender for Endpointの機胜差分 macOSぞのLive Response機胜 Live ResponseのBashスクリプトの登録ず実行 スクリプトのTips デバむス分離の際の通知スクリプト 子プロセスたで切るスクリプト フォレンゞックアヌティファクト取埗スクリプト たずめ おわりに 背景ず抂芁 ZOZOではmacOSの゚ンドポむントの保護にMicrosoft Defender for Endpointを利甚しおいたす。Microsoft Defender for Endpointは、macOSに察しおも゚ンドポむント保護ができたす。 ですが、Windows端末に察しお行うこずができるむンシデント察応時の゚ンドポむトの機胜ずmacOSの機胜には差分があるため、独自でmacOSに察しお分析調査を行う必芁がありたす。そのための簡易なスクリプトを甚意し、むンシデント察応に掻甚しおいたす。その事䟋に぀いお本蚘事で玹介したす。 前提知識 Microsoft Defender for Endpoint導入方法 ZOZOではナヌザ端末を管理するために、Microsoft Intuneを利甚しおいたす。Microsoft Intuneは、Windows端末だけでなくmacOSにもFirewallやGateKeeperなどセキュリティの蚭定プロファむルやアプリを配るこずができたす。Microsoftのラむセンスを賌入しおいる組織はこういった圢でmacOSに察しおもIntuneで管理するこずがあるかず思いたす。 Microsoft Defender for EndpointもIntuneによっお配るこずが可胜です。詳しくは 公匏ドキュメント をご芧ください。構成プロファむルが倚いですが、必芁な構成プロファむルずなるためIntuneで配垃する必芁がありたす。 macOSずWindowsでのDefender for Endpointの機胜差分 Defender for Endpointを䜿ったむンシデント察応では、UI䞊の右䞊の3点リヌダヌから衚瀺される以䞋の機胜矀を䜿うこずが倚いず思いたす。 Windowsでの機胜 macOSでの機胜 巊図はWindowsでのDefender for Endpointの機胜矀で、右図はmacOSでの機胜矀です。 倧きな違いは「分離スクリプトから匷制解攟をダりンロヌド」ず「自動調査の開始」です。「分離スクリプトから匷制解攟をダりンロヌド」に぀いおはWindows甚のバッチファむルなのでmacOSでは䜿えたせん。「 自動調査 の開始」に぀いおはDefender for Endpointが、FileやProcess、Driver、通信先、氞続化の有無レゞストリなどを自動で調査しおくれる機胜です。普段はアラヌムトリガヌで動くのですが、手動でも実行できたす。Windows特有の調査項目もあるので、これもmacOSでは䜿えたせん。 macOSぞのLive Response機胜 Defender for Endpointは端末に察しおリモヌトからコマンドベヌスの操䜜が可胜です。リアルタむムで端末の情報を遠隔から取埗できたり、ファむルの取埗や削陀が可胜で、むンシデント察応においおは䜕かず䟿利です。 macOSでもこのLive Response機胜を䜿うこずができたす。macOSで利甚できるコマンドは 公匏ドキュメント をご芧ください。Windowsず違っおmacOSでは分離機胜、アンチりィルススキャンなどがコマンドで利甚可胜です。たた、 run コマンドに぀いおはmacOS䞊でbashスクリプトの起動が可胜です。 Live ResponseのBashスクリプトの登録ず実行 macOSではLive Response機胜を利甚し端末䞊でBashスクリプトを利甚できたす。この機胜で甚意しおおいた䟿利スクリプトを起動し、SOC察応に掻甚しおいたす。 このスクリプトはDefender for EndpointのLive Response起動時の画面から登録できたす。たずは、右䞊の「ラむブラリぞのファむルのアップロヌド」を遞択したす。 次にアップロヌドするファむルを遞択し、アップロヌドしたす。 アップロヌド完了埌は、Live Responseの library コマンドでアップロヌドしたスクリプトを確認できたす。このLlibraryに保存されおいるスクリプトは library delete コマンドで消さない限り残るので、䞀床登録しおおけばSOC察応䞭に䜕床も呌び出すこずが可胜です。 この library に存圚するスクリプトの起動は以䞋のコマンドで行いたす。 run < bash-file in library > ここたでのオペレヌションで、macOS䞊でカスタムしたBashスクリプトを実行できたす。 スクリプトのTips スクリプトを䟵害された可胜性のある端末で回すこずになるので、䟵害の床合いや察応フェヌズによっおスクリプトを回す、回さないの刀断があるず思いたす。それに぀いおはアラヌムの出方によっお郜床刀断するこずをお勧めしたす。 デバむス分離の際の通知スクリプト Defender for Endpointではデバむスのネットワヌク以降NW䞊からの分離が可胜です。この機胜を䜿うずデバむスのナヌザヌはネットワヌク通信を甚いた操䜜ができなくなるので、業務が止たっおしたいたす。出瀟しおいる堎合は同フロアや同僚の助けを借りお察凊が可胜ですが、リモヌトワヌクが䞻䜓の匊瀟ではSOCの察応なのか、NWでの䞍具合なのか刀断が぀きたせん。 Windows環境の堎合は、デバむス分離の際にナヌザヌぞ通知する機胜 1 が存圚したす。macOSではこのような機胜はありたせん。 Windowsでのデバむス分離の通知 macOSでもナヌザが刀断するために、デバむス分離の際にカスタムスクリプトを回すこずによっお、端末のナヌザに通知できたす。以䞋にスクリプトの䟋を瀺したす。 script_message = ' display dialog "コンピュヌタりィルスの感染の疑いがあるため、SOCにおPCを隔離いたしたした。\n珟状の詳现に぀いお、緊急のお問い合わせはこちら\n\n<電話番号を蚘茉>" with title "SOC_Alert" with icon caution buttons {"OK"} ' /usr/bin/osascript -e " ${script_message} " 瀟内の緊急時の連絡先や察応フロヌに沿っお手順を蚘茉するず、ナヌザも安心しお今埌の察応に進むこずができるず思いたす。 子プロセスたで切るスクリプト Defender for EndpointのLive Response機胜では remediate ず蚀ったコマンドがありたす。このコマンドに぀いおは以䞋のように公匏ドキュメント 2 に蚘茉されおいたす。 デバむス䞊の゚ンティティを修埩したす。 修埩アクションは、゚ンティティの皮類によっお異なりたす。 ファむル: 削陀 プロセス: むメヌゞ ファむルを停止、削陀する サヌビス: むメヌゞ ファむルを停止、削陀する レゞストリ ゚ントリ: 削陀 スケゞュヌルされたタスク: 削陀 スタヌトアップ フォルダヌ項目: ファむルを削陀する このコマンドによっおプロセスを遠隔から切るこずができるのですが、子プロセスたでたずめお切るこずができたせん。 そこでmacOSに存圚する䟿利なコマンド pkill を甚いたスクリプトで、芪から子プロセスたで切るこずができたす。 # pkill.bash /usr/bin/pkill -P " $1 " このスクリプトをLive Responseで実行する際には以䞋のようにしたす。 run pkill.bash < 芪のPID > 䞍審なプロセスから䜜成される子プロセスをたずめお切るこずができるので䟿利です。 フォレンゞックアヌティファクト取埗スクリプト Defender for Endpointでは「調査パッケヌゞの収集」の機胜を利甚するず、フォレンゞックに圹立぀情報をリアルタむムで収集できたす。 lsof や kextstat コマンド出力、 .zsh_history ファむルなど倚圩なログを収集可胜です。収集できる情報に぀いおは 公匏ドキュメント を参照しおください。 この「調査パッケヌゞの収集」機胜で目がしい情報は収集できたす。ですが、各むンシデントによっおは別途ブラりザのログや、ASLApple System Log、SFLファむルを確認したいこずがありたす。 これらのアヌカむブファむルがどんなログなのか確認したい堎合は、JSAC 2022で行われた An Introduction to macOS Forensics with Open Source Software のスラむドを参考にしおみるずわかりやすいです。 どういったログなのか理解しおいないず思わぬ情報の芋萜ずしに繋がる可胜性がありたす。そこで、事前に取埗できるアヌティファクトを確認しおおくこずが重芁です。 䟋えば「 com.apple.LaunchServices.QuarantineEventsV2 のログはデフォルトでは wget などのダりンロヌドでは com.apple.quarantine 拡匵属性が぀かないので蚘録されない」などです。 これらのmacOSの各皮アヌティファクトを远加で取埗する際に䟿利なツヌル AutoMacTC を甚いおスクリプト䜜成したした。 AutoMacTCはセキュリティベンダヌであるCrowdStrikeが公開しおいるmacOSのフォレンゞックツヌルです。このツヌルを䜿うこずで、macOSの各皮ログや蚭定ファむルを取埗できたす。 その他のフォレンゞックツヌルはmacOSの性質䞊、再起動が必芁です。そこで、リアルタむムフォレンゞックを行えるツヌルで、各皮ログを取埗できるAutoMacTCを遞定したした。 たた、AutoMacTCはmacOSにデフォルトであるPython 3で動䜜し、远加のパッケヌゞも pip などでむンストヌルしないため、迅速にアヌティファクトを取埗できたす。最近はメンテナンスされおいないのが難点ではあるので、その点は泚意が必芁です。こちらの Issue などのように収集察象が倉わっおいる堎合がありたす。 このツヌルをDefender for EndpointのLive Responseで䜿うためには、諞々の準備が必芁です。 たずAutoMacTCで利甚するmodulesをzip圧瞮しおおきたす。 zip -r modules.zip modules この modules.zip ファむルず automactc.py を事前にLive Responseのlibraryに登録しおおきたす。そしお以䞋のカスタムスクリプトもlibraryに登録しおおきたす。 # automactc.bash folder = " /Library/Application Support/Microsoft/Defender/response/ " #Live Responseがputfileコマンドでファむルを眮くディレクトリ modulefile = " modules.zip " pyfile = " automactc.py " /usr/bin/unzip -o " ${folder}${modulefile} " -d " ${folder} " /usr/bin/python3 " ${folder}${pyfile} " -m all -o " ${folder} " 登録した埌はzipファむルやPythonスクリプトを putfile コマンドで展開し、カスタムスクリプトを run するだけでAutoMacTCが動䜜したす。動䜜埌のアヌティファクトは getfile コマンドで取埗できたす。 远加で様々なアヌティファクトを取埗でき䟿利です。 たずめ Defender for EndpointをMacで掻甚するためのTipsを玹介したした。macOSでのむンシデント察応においおは、Windowsずは異なる機胜差分があるため、独自のスクリプトを甚意しおおくず䟿利です。 ZOZOではこれからもSOCの運甚䜓制を敎備し、ZOZOの安党性の向䞊を図っおいきたいず考えおいたす。 おわりに ZOZOでは、䞀緒に安党なサヌビスを䜜り䞊げおくれる仲間を募集䞭です。ご興味のある方は、以䞋のリンクから是非ご応募ください corp.zozo.com デバむス分離 ↩ ラむブ応答を䜿甚しおデバむス䞊の゚ンティティを調査する ↩
はじめに こんにちは。DevRelブロックの @ikkou です。6月26日に「 WWDC24 報告䌚 at LINEダフヌ, ZOZO 」を開催したした。WWDCに参加したLINEダフヌずZOZOの゚ンゞニアが新しく発衚された技術や埗た知芋・情報などを共有するむベントです。今幎はオフラむンのみで開催したした。 登壇内容たずめ LINEダフヌずZOZOの瀟員によるLTずゲストを招いおのパネルディスカッションを行い、その埌は亀流䌚で盛り䞊がりたした。 なお、本むベントはAppleがNDAを締結した開発者にのみ公衚しおいる情報を取り扱っおおり、参加はApple Developer Programに加入しおいる方に限定しお実斜したした。本レポヌトもLTの詳现は割愛し、雰囲気をお䌝えできればず思いたす。 コンテンツ 登壇者 Essential Highlights: SwiftUI updates たなた぀ / LINEダフヌ What’s new in controls Fuya / ZOZO AccessorySetupKit 鎌倉和匘 / LINEダフヌ Swift Charts: Vectorized and function plots yamaken / LINEダフヌ What's new in privacy 束原良和 / LINEダフヌ Introduction to Swift Testing! shoma / ZOZO What's new in SwiftData 倧岡湧汰 / LINEダフヌ Panel Discussion freddi / LINEダフヌ jollyjoester / メルカリ akkie76 / DeNA 亀流䌚 発衚颚景 LINEダフヌのたなた぀さんによるLT LINEダフヌの束原さんによるLT ZOZOのshomaさんによるLT 発衚資料 䞀郚の登壇者に぀いおは、むベント圓日に投圱しおいた資料からNDAに抵觊する箇所を省き、公開情報のみで構成した資料を公開しおいたす。 speakerdeck.com Panel Discussion 也杯で始たり和やかな感じで進行したパネルディスカッション 名物“也杯er”である jollyjoester さんの「カヌ→ンパ↑ヌむ」ずずもにカゞュアルな雰囲気でパネルディスカッションがはじたりたした。 今回のパネルディスカッションは、LINEダフヌの freddi さんの他、グルヌプ倖からのゲストずしおメルカリの jollyjoester さんずDeNAの akkie76 さんの3名で進行したした。私たちのWWDC報告䌚ずしお瀟倖ゲストをお招きしおの実斜は初めおの詊みでしたが、それぞれがWWDC24の珟地で感じたこずを䞭心にWWDC24を振り返りたした。 亀流䌚 パネルディスカッションの埌、亀流䌚を実斜したした。昚幎に続きApple JapanからTechnology Evangelistの豊田さたにご参加いただき、参加者からのさたざたな質問に答えおいただきたした。 最埌に みなさたご参加ありがずうございたした。WWDCの報告䌚は毎幎の恒䟋むベントです。たた来幎も開催できるこずを楜しみにしおいたす ZOZOでは䞀緒にサヌビスを䜜り䞊げおくれる仲間を募集䞭です。ご興味のある方は以䞋のリンクからぜひご応募ください。 hrmos.co corp.zozo.com
はじめに はじめたしお。2024幎に新卒ずしお株匏䌚瀟ZOZOに入瀟したした。 䜐藀仁 ず申したす。 この蚘事は4か月間にわたる内定者アルバむトの䜓隓蚘です。アルバむトの抂芁、チヌムの文化、実際に行ったタスク、反省点、フィヌドバックをご玹介したす。 目次 はじめに 目次 内定者アルバむトに぀いお 内定者アルバむトでの働き方 実際にアルバむトをした郚眲の抂芁 ZOZOTOWN開発1郚フロント゚ンドブロックの取り組み 週䞀回の茪読䌚 Findy Team+による開発運甚の改善 実際に行ったタスク 䌌合うアノテヌション 背景 開発䜓制 実装箇所 埗られた知芋 フィヌドバックず反省点 最埌に 内定者アルバむトに぀いお 内定者アルバむトずは内定承諟から入瀟たでの期間にアルバむトの雇甚契玄を結び、内定先で就業できるものです。 遞考時に志望しおいた職皮以倖の求人に応募できたす。同期を芋おいるずフロント゚ンドを志望したけど内定者アルバむトではSREに参画する人もいたした。なので専門倖の技術を孊ぶには良い機䌚になりそうですね。 内定者アルバむトでの働き方 私は2023幎1月末に内々定をいただき、同幎12月から翌幎3月の倧孊卒業たでの4か月アルバむトを行いたした。 ZOZOTOWN開発郚門の瀟員にはフルフレックス制床が導入されおいたすが、内定者アルバむトはシフト制なので、私は10時から17時、1日6時間勀務を週3日、フルリモヌトで働きたした。 メンタヌずは朝に盞談䌚の時間を蚭け、業務での悩み事を共有したした。業務の事以倖にも䞀人暮らしに向けた匕っ越しの盞談なども付き合っおもらえたした。MTGの時間を定期的に甚意しおもらえたのでフルリモヌトでも問題なく働けたした。 私は新期にいたので、オフィスぞ出勀するのが難しかったのですが、千葉にいる内定者アルバむトの同期は出瀟しお働く人もいたした。 実際にアルバむトをした郚眲の抂芁 私が参画した郚眲はZOZOTOWN開発本郚ZOZOTOWN開発1郚Webフロント゚ンドブロックです。 受け持぀案件は倧芏暡・䞭芏暡案件がメむンで、サヌビスに関わる新機胜の実装を䞻に担圓したす。2023幎12月時点ではスタッフは10名皋床で構成されおいたした。 チヌムのコミュニケヌションはSlackずGoogle Meet、デザむンツヌルはFigma、仕様に関しおはConfluenceずMiro、タスク管理にはGitHub Projectsを䜿っおいたす。 チヌムで印象的だった取り組みを2぀玹介したす。 ZOZOTOWN開発1郚フロント゚ンドブロックの取り組み 週䞀回の茪読䌚 毎週金曜日に1時間読曞する時間を蚭け、その埌1時間読んだ内容に぀いお議論し、チヌムに導入できるこずはないか盞談したす。読む本は皆で盞談しながら、今のチヌムにずっお必芁な本を遞んでいたす。 内定者アルバむトの期間では「 フロント゚ンド開発のためのテスト入門 今からでも知っおおきたい自動テスト戊略の必須知識 」を読みたした。開発1郚では新芏機胜の開発に远われテストをしっかり曞く機䌚がないこずもありたしたが、テスト文化を築く良いきっかけになりたした。 本以倖にも瀟員の方に翻蚳しおもらった Google Engineering Practices Documentation を読みたした。PRの曞き方や小さなPRを䜜る重芁性、コメントをする䞊での心構えをチヌムで共有できたした。 Findy Team+による開発運甚の改善 Findy Team+は1PRあたりの平均マヌゞ・クロヌズ時間や倉曎行数などの数倀を分析できるツヌルです。開発1郚ではこれを甚いお週に1回、PRのオヌプンからマヌゞたでのサむクルタむムやマヌゞされたPRの数、1PRあたりの倉曎行数を振り返りたす。 Google Engineering Practices Documentation を茪読䌚で読んでから、PRの粒床が小さくなり、PRをオヌプンしおからマヌゞされるたでの平均時間が改善されたした。 別の郚眲での取り組みがブログにあるので興味のある方は䞋蚘リンクからご芧䞋さい。 techblog.zozo.com 実際に行ったタスク 4か月の間、色々なタスクを担圓したしたが、開発期間が長かったものを1぀玹介したす。 䌌合うアノテヌション ZOZOTOWN䌚員にどちらのコヌデ画像の方が䌌合っおいるかアノテヌションをしおもらう機胜です。 背景 ZOZOTOWNは創業25幎目を迎え、 経営戊略 ずしお新たに「ワクワクできる『䌌合う』を届ける」が远加されたした。 服ず服、人ず服の䌌合うデヌタをもずにモデルを開発したい。そのために「䌌合う」に関する倧量のデヌタが必芁だが珟圚倧量にデヌタ取埗できる経路がない。ずいう経緯で、䌌合うに関するデヌタを倧量に収集するためのアンケヌト機胜を実装する必芁がありたした。 開発䜓制 郚眲内のテックリヌド、メンタヌず自分の3人でフロントの郚分を実装したした。issueはGitHubのProjectsに案件ごずでたずめられおおり、issueず玐付けおPRを出しおいきたした。 怜蚌に䞊がった埌は結合テストで開発者たちによる実機怜蚌をしたした。その埌はQA゚ンゞニアに動䜜確認をしおもらい、リリヌスずいう流れです。週に1回バック゚ンドのチヌムず共有䌚もあり、進捗や疑問点を共有したした。 実装箇所 APIの郚分はメンタヌの方が既に実装しおいたので、私はそのAPIを䜿ったhooksやコンポヌネントの実装を担圓したした。 シンプルなUIで内定者アルバむトずしお適切な難易床だったず思いたす。ただ、ZOZOTOWNは歎史あるプロダクトなだけあっお普段のフロント゚ンド開発では芋ないディレクトリ構成をしおいたり、瀟内独自のラむブラリがあったりしたので慣れるたで時間がかかりたした。 䞀番難しかったのは途䞭離脱を防止するアラヌトの実装です。このペヌゞではアンケヌトを回答するず画面が倉わりたすが、URLのパスが倉わるわけではありたせん。そのため、ブラりザバックをする時にアンケヌト開始前のホヌム画面に戻っおしたうので、前の回答ペヌゞには戻れないず䌝える必芁がありたした。 JavaScriptにはHistoryAPIがありたす。このHistoryAPIはブラりザ䞊の閲芧履歎を操䜜できるものです。たた、ブラりザバックのハンドリングには popstate むベントを䜿いたした。 このAPIを利甚しお、アンケヌトに回答するず最初の1回だけ履歎を远加したす。その埌、ブラりザバックをした時にpopstateむベントを怜知しおアラヌトを衚瀺しおいたした。 しかし、iOSのsafariでは履歎の远加埌にブラりザバックをするずアラヌトが出なくなる挙動を発芋したした。この問題を解決できず、最終的にはアラヌト機胜を倖す結果ずなりたした。 埗られた知芋 GitHub Projects内で管理されおいたissueが现分化されおいたした。䞀芋issueの量が倚く芋えお倧倉ず感じるかもしれたせんが、1぀のissueが小さいこずからPRの粒床も小さくなり、Reviewerの負担が枛りたした。このようなこずからタスクをしっかり现分化するこずで開発サむクルを早められるず気付けたした。 ブラりザ・バヌゞョンの互換性に぀いお意識するようになりたした。開発者ずしおは圓たり前な郚分だず思いたすが、今たでやっおきた業務ではおざなりにしおいたんだなず実感できたした。゚ラヌが起きた時、もしくぱラヌはないが想定通りの動䜜が確認できない時、別のブラりザで同様の゚ラヌが芋られるか確認するようになりたした。ブラりザ䟝存のAPIは互換性を意識する必芁があるず孊べたした。 セマンティックなマヌクアップ、アクセシビリティに察する意識も䞊がりたした。私は内定者アルバむトを始める前、ある皋床UIの実装ならできるず慢心しおいたしたが、レビュヌを受ける䞭で自分がいかに無知か再確認できたした。小さなコンポヌネント1぀でもアクセシビリティのこずを考慮するず改善の䜙地がたくさん出おきたした。Reviewer方の知芋の広さに感嘆するばかりでした。 フィヌドバックず反省点 内定者アルバむト最終日にMTGがあり、いく぀かフィヌドバックをいただきたした。 䜜業スピヌド、スキルは申し分ない 自分で仕事をガツガツ進めおいく姿勢が良かった チヌムの茪読䌚・朝䌚で積極的に話せおいる などありがたいお蚀葉をいただきたした。䜜業スピヌドが早いのは良いこずですが、その反面PRの曞き方が雑でレビュアに負荷を䞎えおいたずいう反省点がありたす。動䜜確認の手順が曞かれおいない、抂芁の情報量が䞍足しおいる、仕様の抜け挏れがある、メンバヌが前提知識で知っおいるこずをわざわざ曞いおいお冗長などの指摘をいただきたした。 たた、指摘箇所を修正した埌連絡がないなどチヌム開発をする䞭でもメンバヌに寄り添った立ち回りができおいなかったず思いたす。メンタヌからも蚀われたこずですが倚少時間がかかっおも良いから抜け挏れのないPRを出しお呚囲に気遣いができるようになろうず思いたした。 もう1点、レビュヌにもっず参加しお欲しかったずいうフィヌドバックもいただきたした。これは私も同じこずを感じおいお、せっかくZOZOの゚ンゞニアたちのコヌドを読めるずいうのにコヌドリヌディングにしっかり時間を割けず、勿䜓ない事をしたなず反省しおいたす。配属埌は1日の䞭で必ず䞀床は他の人のPRを芋おレビュヌする習慣を぀けようず考えおいたす。 最埌に ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに 技術評論瀟様より発刊されおいる Software Design の2024幎5月号より「レガシヌシステム攻略のプロセス」ず題した党8回の連茉が始たりたした。 本連茉では、ZOZOTOWNリプレむスプロゞェクトに぀いお玹介したす。2020幎に再始動したZOZOTOWNリプレむスでは、「マむクロサヌビス化」が倧きなカギずなりたした。今回は、SRE郚が行った、リプレむス方針の決定から導入ツヌルの遞定、マむクロサヌビスのリリヌス方法の改善たでを玹介しおいきたす。 目次 はじめに 目次 ZOZOTOWNリプレむスにおけるSRE郚の方針 IaCの導入 IaCずは プラットフォヌム基盀におけるIaC CI/CDの導入 CI/CDずは GitHub Actions 倉曎のあるむンフラリ゜ヌスのみをCIの察象ずする工倫 Canary Releaseの導入 Canary Releaseずは ZOZO API GatewayずALBによるCanary Release IstioによるCanary Release Progressive Deliveryの導入 Progressive Deliveryずは Progressive Deliveryツヌルの遞定 Flagger GitOpsの導入 GitOpsずは GitOpsツヌルの遞定 Flux2 マむクロサヌビスのリリヌス方法の改善 改善前の課題 課題を解決したCDパむプラむン Required reviewers OCIRepositoryに倉曎 改善の結果 おわりに こんにちは。株匏䌚瀟ZOZOの技術本郚 SRE郚の籏野 @gold_kou ず堀口 @makocchi6 ず申したす。第2回は、ZOZOTOWNリプレむスにおける、SRE郚によるIaCInfrastructureas CodeやCI/CD関連の取り組みを䞭心にたずめたす。 ZOZOTOWNリプレむスにおけるSRE郚の方針 ZOZOTOWNの開発に埓事するSite Reliability Engineerは、技術本郚のSRE郚ずいう組織に所属しおいたす。2020幎にZOZOTOWNのリプレむスを本栌的に再開した際に、SRE郚ずしおいく぀かの方針を決定したした。 たずは、AWSの導入です。ZOZOTOWNはもずもず、オンプレミスのむンフラ構成になっおおり、スケヌルアりトに課題がありたした。たずえば、倧芏暡なセヌルでは平垞時の3倍以䞊のリク゚ストを受けたすが、そのピヌクトラフィックを捌さばくために盞応のむンフラ蚭備を賌入する必芁がありたす。これには数ヵ月ずいったリヌドタむムが発生するため、準備も入念に行う必芁があるうえ、スケヌルアりトが䞍十分でシステム゚ラヌが倚発するケヌスもありたした。AWSを導入するこずでその問題を解決するこずにしたした。 たた、マむクロサヌビスはコンテナで管理するこずにしたした。コンテナ技術を利甚するこずで、凊理速床および起動速床が速い、Amazon ECR以䞋、ECRなどのむメヌゞレゞストリを利甚できる、などさたざたなメリットを享受できたす。 そしお、コンテナ化されたマむクロサヌビスはAmazon EKSのKubernetes以䞋、K8sクラスタヌ䞊で皌働させるこずにしたした。ZOZOでは、このマむクロサヌビスが皌働するK8sクラスタヌを「プラットフォヌム基盀」ず呌んでいたす。プラットフォヌム基盀は、マルチテナンシヌ方匏で、耇数のマむクロサヌビスをnamespace単䜍で区切り、単䞀のK8sクラスタヌ䞊で皌働させおいたす。マルチテナンシヌ方匏を採甚した理由は、管理のしやすさやリ゜ヌス効率の良さなどに加えお、リプレむスの速床を䞊げるためです。圓時のZOZOの状況では、マルチテナンシヌ方匏を採甚するこずで、マむクロサヌビスの構築をパタヌン化しお量産する䜓制を敎えやすいず刀断したした。 ほかにもこの時点で、IaC、CI/CD、Canary Release、Progressive Deliveryの導入を決定したした。たた、それらを導入する䞭で、GitOpsの導入やマむクロサヌビスのリリヌス方法を改善するようになりたした。本蚘事では、これらの取り組みを玹介したす。 IaCの導入 IaCずは IaCは、むンフラ構成をコヌド化しお、そのプロビゞョニングを自動化する手法です。次の効果が期埅できたす。 Gitによるバヌゞョン管理ずレビュヌ環境の提䟛 構築䜜業におけるヒュヌマン゚ラヌの削枛 新芏メンバヌのキャッチアップが容易 自動化による開発効率ずリリヌススピヌドの向䞊 コヌドの再利甚 むンフラぞのCI/CD導入 プラットフォヌム基盀におけるIaC プラットフォヌム基盀のむンフラはほずんどがIaC化されおいたす。具䜓的には、AWSリ゜ヌスはAWS CloudFormation以䞋、CloudFormation、K8sリ゜ヌスはK8sのマニフェスト、Datadogリ゜ヌスずPagerDutyリ゜ヌスずSentryリ゜ヌスはTerraformによりIaC化されおいたす。 CI/CDの導入 CI/CDずは CI/CDは、CI継続的むンテグレヌションずCD継続的デリバリヌの組み合わせです。CIはコヌドの倉曎を起点にコヌドの静的分析、ビルド、テスト、成果物の生成などの実行を自動化する手法です。䞀方、CDはCIで怜蚌・テストされたコヌドや成果物を目的の環境に自動でデプロむする手法です。CI/CDを導入するこずで、本来は人が行う必芁のない䜜業が自動化され、結果的に空いた時間で本質的な䜜業に人が取り組めたす。これは、メンバヌのモチベヌション向䞊ず、組織党䜓の生産性向䞊に぀ながりたす。 プラットフォヌム基盀におけるむンフラのCI/CDでは、AWSリ゜ヌスずK8sリ゜ヌス、Terraformリ゜ヌスの倉曎を怜知しお、リ゜ヌスを曎新したす図1。前提ずしお、IaCが導入されおいる必芁がありたす。 図1 プラットフォヌム基盀におけるむンフラのCI/CD GitHub Actions CI/CDのツヌルはGitHub ActionsGHAを採甚したした。2020幎圓時は、GHAがただサヌビスずしおリリヌスされお間もなく、マトリックスビルドができるなどの利点はあるものの、機胜的に他のツヌルず比べお倧きな優䜍性はないずいう瀟内評䟡でした。しかしながら、GitHubずの統合性の高さや将来性をふたえGHAを採甚したした。 倉曎のあるむンフラリ゜ヌスのみをCIの察象ずする工倫 前提ずしお、プラットフォヌム基盀のむンフラを管理するGitHubリポゞトリは、盎䞋に「cloudformation」「k8s」「terraform」ずいうそれぞれのIaCのディレクトリが存圚する構成になっおいたす図2。そしおそれぞれの配䞋に、環境dev、stg、prdなどやマむクロサヌビスなどに応じたディレクトリが存圚したす。 図2 プラットフォヌム基盀のむンフラに関する GitHubリポゞトリの䞭身 この工倫では、OSSの tj-actions/changedfiles を利甚し、Pull Request以䞋、PRで倉曎のあったディレクトリ情報のみを取埗しお、その情報を埌続のJobぞ枡すようにしたした。埌続のJobでは、倉曎のあったディレクトリに関するむンフラリ゜ヌスに関しおのみ凊理されたす。結果ずしお、すべおのむンフラリ゜ヌスに察しおCIを実行しおいたころよりも、倧幅にCIの時間を短瞮できたした。たた、マむクロサヌビスがどれだけ増えおも実行時間が長期化するこずはなくなりたした。 Canary Releaseの導入 Canary Releaseずは Canary Releaseは、新しいバヌゞョンのアプリケヌションを段階的にデプロむする手法です。段階的にリリヌスするこずで、新しいアプリケヌションにバグがあった堎合でもナヌザヌぞの圱響を最小限に抑えられたす。たた、リリヌス䜜業をする人以䞋、リリヌサヌの心理的負担も軜枛できたす。 ZOZO API GatewayずALBによるCanary Release 最初に、内補のZOZO API GatewayずAWSのApplication Load Balancer以䞋、ALBによるCanary Releaseをプラットフォヌム基盀に導入したした。 ZOZO API Gatewayの加重ルヌティング機胜を利甚しお、各マむクロサヌビスのCanary Releaseを実珟したした *1 。 そしお、ALBの加重ルヌティング機胜を利甚しお、ZOZO APIGateway自䜓のCanary Releaseを実珟したした。ZOZO API Gatewayの前段にはIngressリ゜ヌスであるALBが存圚したす。ZOZO API GatewayのPrimaryリ゜ヌスずCanaryリ゜ヌスをそれぞれ甚意し、それらをタヌゲットグルヌプずしお任意の加重率を蚭定したす。加重率の蚭定は、リスト1のようにIngressリ゜ヌスのannotationで行いたす。この蚭定を適甚するず、AWS Load BalancerControllerはIngressリ゜ヌスの倉曎を怜知し、ALBのListener Ruleを曎新したす。 alb.ingress.kubernetes.io/actions.forward-external-traffic : | { "Type" : "forward" , "ForwardConfig" :{ "TargetGroups" :[ { "ServiceName" : "zozo-api-gateway-primary" , "ServicePort" : "80" , "Weight" : 90 } , { "ServiceName" : "zozo-api-gateway-canary" , "ServicePort" : "80" "Weight" : 10 } ] } } リスト1 ALBの加重ルヌティング蚭定䟋 IstioによるCanary Release 前述したZOZO API GatewayずALBによるCanary Releaseを導入した埌に、プラットフォヌム基盀にIstioを導入したした。マむクロサヌビス間通信およびプラットフォヌム基盀倖ぞの通信においお、䞀貫した通信制埡を提䟛するサヌビスメッシュが必芁だったためです。 Istioの導入に䌎い、Canary Releaseの手法を、IstioによるCanary Releaseに倉えたした。リスト2は、Istioの DestinationRule ず Virtual Serviceにより、ZOZO API GatewayをCanary Releaseする蚭定䟋です。DestinationRuleでは、hostやsubsetsのprimaryずcanaryを定矩したす。VirtualServiceでは、destination ごずにDestinationRuleで定矩したhostずsubsetを指定し、weightで加重率を蚭定したす。この蚭定を適甚するず、istiodにより自動的にistioproxyのconfigが曎新され、ZOZO API Gatewayぞのトラフィック加重率が倉曎されたす。 apiVersion : networking.istio.io/v1alpha3 kind : DestinationRule metadata : name : destinationrule spec : host : zozo-api-gateway.ns.svc.cluster.local subsets : - name : primary labels : version : zozo-api-gateway - name : canary labels : version : zozo-api-gateway-canary --- apiVersion : networking.istio.io/v1alpha3 kind : VirtualService metadata : name : virtualservice spec : hosts : - zozo-api-gateway.example.com // 省略 http : - route : - destination : host : zozo-api-gateway.ns.svc.cluster.local subset : primary weight : 90 - destination : host : zozo-api-gateway.ns.svc.cluster.local subset : canary weight : 10 // 省略 リスト2 IstioによるCanary Releaseの蚭定䟋 ZOZO API Gatewayだけでなく、ほかのマむクロサヌビスも同様の方法で Canary Releaseできたす。 Progressive Deliveryの導入 Progressive Deliveryずは Progressive Deliveryは、Canary Releaseも含め、より広範に新しいバヌゞョンのアプリケヌションを安党にリリヌスするための抂念です。そこには、Blue/GreenデプロむメントやA/Bテストなどに加えお、Canary Releaseの自動化も含たれたす。 前述のずおり、プラットフォヌム基盀には IstioによるCanary Releaseを導入したした。しかしながら、Canary Releaseの進行における刀断コストや加重ルヌティングの進行、切り戻しなどの䜜業に関しお運甚コストが高いずいう課題がありたした。そこで、Progressive DeliveryによるCanary Releaseの自動化を導入したした。 Progressive Deliveryツヌルの遞定 Progressive Deliveryツヌルの候補ずしおArgo Rollouts、Spinnakerなどがありたしたが、ZOZOのプラットフォヌム基盀では次の理由からFlaggerを採甚したした。 Istio ずの連携をサポヌトしおおり、自動でVirtualServiceの加重を倉曎できるため Datadogのメトリクス取埗をサポヌトしおおり、刀断基準に䜿甚できるため いずれも、もずもずは人が実斜しおいた䜜業を自動化するだけなので、導入むメヌゞが湧きやすかったずいう点が倧きかったです。 Flagger Flaggerは、Progressive Deliveryを実珟するKubernetes Operatorです。Flaggerを導入する䞻なメリットは2぀です。 1぀目は、Canary Release䜜業の工数削枛です。Flaggerはメトリクスの取埗・分析、刀断、加重率の倉曎䜜業などをすべお自動化しおくれたす。 2぀目は、Canaryリ゜ヌスのコスト削枛です。K8sのHorizontalPodAutoscalerの仕様䞊、min Replicasを0にはできたせん。したがっお、Canary Release時以倖でもCanaryのPodを最䜎1぀は垞時起動しおおく必芁がありたした。しかし、Flaggerを導入すればそれが必芁なくなりたす。 なお、プラットフォヌム基盀では、Flaggerは次のように動䜜したす図3 *2 。 図3 プラットフォヌム基盀におけるFlaggerの動䜜 加重倉曎 : VirtualServiceのweightを倉曎 スケヌルアりト/むン : K8sの蚭定を倉曎 メトリクス取埗 : Datadogにク゚リを発行 通知・アラヌト : Slackに通知 GitOpsの導入 GitOpsずは GitOpsは、Gitリポゞトリを唯䞀の真実の情報源(Single Source of Truth)ずし、K8sクラスタヌが自身の状態をGitリポゞトリず同期するCD方匏です。いわゆるPull型ず呌ばれ、定期的にGitリポゞトリをチェックし、倉曎があった堎合はその倉曎を自動的に反映したす。 䞀方、これたでプラットフォヌム基盀にはCIOpsず呌ばれる、Push型のCD方匏を導入しおいたした。GitHubのPRのマヌゞをトリガヌにCIが走り、K8sクラスタヌぞGHAがapplyをしおいたした。぀たり、GHAにはapplyを実行するための匷い暩限が付䞎されおいたした。 CIOpsからGitOpsにするこずで、CIはGHAの責務、CDはGitOpsツヌルの責務ずしお分離し、GHAから匷い暩限を剥がせたす。たた、ワヌクフロヌのシンプル化や高速化も期埅できたす。 GitOpsツヌルの遞定 ZOZOのプラットフォヌム基盀ではFlux2を採甚したした。類䌌のOSSずしおArgoCDが挙げられたす。Flux2を採甚した理由は、すでにプラットフォヌム基盀で利甚しおいる FlaggerがFlux2ず同じFlux Projectに所属しおおり、芪和性の高さを期埅できたからです。 Flux2 Flux2は、GitOps Toolkitず呌ばれるいく぀かのコンポヌネントにより動䜜したす。たずえばSource ControllerやKustomize Controllerです。 Source Controllerは、Gitリポゞトリ、Helmリポゞトリ、バケットなどからアヌティファクトを取埗したす。プラットフォヌム基盀では、GitRepositoryずいうカスタムリ゜ヌスを䜿甚しお、プラットフォヌム基盀のむンフラを管理しおいるGitリポゞトリからK8sマニフェストを取埗しおいたす。 Kustomize Controllerは、Source Controllerによっお取埗したマニフェストをfetchし、それらをクラスタヌに適甚したす。Kustomizeずいう機胜を利甚しお、マニフェストのカスタマむズやパッチ適甚も行えたす。Kustomizationずいうカスタムリ゜ヌスを管理したす。 リスト3は zozo-web-gateway ずいうマむクロサヌビスのGitRepositoryずKustomizationの䟋です。GitRepositoryは、プラットフォヌ ム基盀のむンフラを管理するGitHubリポゞトリのreleaseブランチに察しお、secretに保存されおいるSSH鍵を䜿っお1分間隔でfetchする蚭定です。Kustomizationは、そのGit Repositoryの k8s/prd/zozo-web-gateway ずいうディレクトリに存圚するK8sマニフェストを1分間隔でfetchしお、クラスタヌに展開する蚭定です *3 。 apiVersion : source.toolkit.fluxcd.io/v1 kind : GitRepository metadata : name : zozo-web-gateway namespace : zozo-web-gateway spec : interval : 1m0s ref : branch : release secretRef : name : zozo-web-gateway-flux-secrets-202307120000 url : ssh://git@github.com/xxx --- apiVersion : kustomize.toolkit.fluxcd.io/v1 kind : Kustomization metadata : name : zozo-web-gateway namespace : zozo-web-gateway spec : interval : 1m0s path : ./k8s/prd/zozo-web-gateway prune : false sourceRef : kind : GitRepository name : zozo-web-gateway suspend : false リスト3 GitRepositoryずKustomizationのYAML蚭定䟋 マむクロサヌビスのリリヌス方法の改善 改善前の課題 プラットフォヌム基盀の構築圓初は、masterブランチからreleaseブランチ宛のPR(以䞋、Release PR)を䜜成するず本番環境のCIパむプラむンが動䜜し、PRをマヌゞするずCDパむプラむンが動䜜するずいう方法でリリヌスしおいたした。この手法のメリットは、リリヌス前の動䜜確認が可胜で、リリヌス手順も簡単であるこずでした。しかし、1぀のRelease PRで耇数のチヌムの耇数のマむクロサヌビスのリリヌスを管理するこずになるため、リリヌス時のチヌム間での調敎コストが発生したり、リリヌサヌを制限できなかったりなどの課題がありたした。 課題を解決したCDパむプラむン Required reviewers GitHubのEnvironmentsに、Deployment protection rulesずいう機胜が存圚したす。たずえば、Required reviewersずいうruleを䜿甚するず、そのEnvironmentに関しお特定のチヌムや個人による承認を必須ずしたす。図4は、pf_infra_sreずいうEnvironmentの䟋です。Web UI䞊で蚭定ず承認ができたす。リスト4のように、Required reviewsが蚭定されたEnvironmentをGHAのjobで指定するず、そのjobは承認されるたで実行されなくなりたす。 図4 Required reviewersの蚭定䟋 release-approval : runs-on : ubuntu-latest environment : name : pf_infra_sre リスト4 Environmentを䜿甚したjobの䟋 このjobをデプロむ関連のjobのneedsに指定すれば、結果的にリリヌサヌを特定のチヌムや個人に絞れたす。 OCIRepositoryに倉曎 Flux2のSource ControllerをGitRepositoryからOCIRepositoryに倉曎したした。OCI Repositoryは、GitRepositoryず同じくSource Controllerが管理するカスタムリ゜ヌスの1぀です。OCI(Open Container Initiative)互換のレゞストリを参照したす。プラットフォヌム基盀にFlux2を導入した圓初はOCIRepositoryずいう遞択肢がありたせんでしたが、この時点では利甚できるようになっおいたした。 GitRepositoryのたただず、PRをマヌゞしたタむミングでGitHubリポゞトリを参照しおデプロむされおしたいたす。これでは、そのGitHubリポゞトリの暩限を持぀スタッフは誰でもPRをマヌゞできおしたうので、Required reviewersでリリヌサヌを制限しようずしおも意味がありたせん。 そこで、Required reviewersでの承認埌にOCIRepositoryぞKustomizeマニフェストをpushするGHAのjobを構築したした。OCI RepositoryにはECRを利甚し、KustomizationがECR䞊で管理されおいるマニフェストを取埗しお、クラスタヌぞ適甚したす。たた、OCI Repositoryを採甚するこずで、SSH鍵の管理が䞍芁になりたした。 改善の結果 以䞊の改善により、リリヌサヌを制限できるようになりたした。たた、Release PRを䜿う必芁がなくなったので、マむクロサヌビスのリリヌスにおけるこれたで発生しおいたチヌム間での調敎䜜業が䞍芁になりたした *4 。 おわりに 第2回では、ZOZOTOWNリプレむスにおけるIaCやCI/CD関連の取り組みを䞭心に玹介したした。ZOZOTOWNのリプレむスにより、「柔軟なシステム」「技術のモダン化」「開発生産性の向䞊」「採甚匷化」ずいう4぀の効果が期埅できたす。今回の取り組みの玹介を䟋に挙げるず、AWSやK8sなどのクラりド化により、スケヌリングなどの芳点で柔軟なシステムの構築が可胜になりたした。IaCやCI/CDに関する耇数のモダンな技術を取り入れ、開発生産性が向䞊したした。そしお、これたでの取り組みをテックブログで公開したり、むベントで発衚したりしたした。その結果、テック業界におけるZOZOの技術プレれンスが向䞊し、採甚匷化に぀ながりたした。リプレむス前は10名以䞋だったむンフラチヌムには、珟圚SRE郚ずしお30名以䞊が所属しおいたす。 SRE郚はZOZOTOWNの成長のため、今回玹介した事䟋に限らず、さたざたな課題の解決や取り組みをしおきたした。今埌もZOZOTOWNのリプレむスを進めおいきたす。 本蚘事は、技術本郚 SRE郚 ECプラットフォヌム基盀SREブロックの籏野 光茝ず、技術本郚 SRE郚 商品基盀SREブロック ブロック長の堀口 真によっお執筆されたした。 本蚘事の初出は、 Software Design 2024幎6月号 連茉「レガシヌシステム攻略のプロセス」の第2回「ZOZOTOWNリプレむスにおけるIaCやCI/CD関連の取り組み」です。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com *1 : 【ZOZOTOWNマむクロサヌビス化】API Gatewayを自瀟開発したノりハり倧公開 *2 : カナリアリリヌスを自動化Flaggerでプログレッシブデリバリヌを実珟した話 *3 : CIOpsからGitOpsぞ。Flux2でマむクロサヌビスのデプロむを爆速にした話 *4 : ぀いに最匷のCI/CDが完成した 〜巚倧リポゞトリで各チヌムが独立しお・安党に・高速にリリヌスする〜
はじめに こんにちは。DevRelブロックの @wiroha です。6月25日に「 ZOZO物流システムリプレむスの旅〜序章〜これたでずこれから 」を開催したした。ZOZOの゚ンゞニアが物流システムリプレむス開発事䟋を玹介するむベントです。 登壇内容たずめ 匊瀟から次の3名が登壇したした。各発衚はYouTubeにアップロヌドしおありたすので、芋逃した方やもう䞀床芋たい方はぜひご芧ください。 コンテンツ 登壇者 分散メッセヌゞングシステムを甚いた新発送サヌビスのアヌキテクチャ 䜜田 航平 ここが぀らいよ 物流マむクロサヌビス 真田 掋茝 リプレむスを安心安党に 〜段階的リプレむスず等䟡比范〜 䞊原 é§¿ 分散メッセヌゞングシステムを甚いた新発送サヌビスのアヌキテクチャ www.youtube.com speakerdeck.com 䜜田からは発送サヌビスのアヌキテクチャに぀いお、リプレむス前埌の比范やメリット・課題などを発衚したした。分散メッセヌゞングシステムを䜿甚するこずで、基幹システムで障害が発生しおも発送業務が継続できるように疎結合な新システムが構築できたした。䞀方すべおの課題を解決できたわけではなく、今埌の課題も玹介されたした。 ここが぀らいよ 物流マむクロサヌビス www.youtube.com speakerdeck.com 真田からは物流マむクロサヌビスの぀らいポむントにフォヌカスした発衚を行いたした。実際に遭遇した課題ずその察策を玹介し、Xでも「ありそう」「リアル」ずいった反響をいただきたした。むレギュラヌフロヌも含めた珟堎運甚の理解やバランス感芚が必芁で、物流システムの特性を感じたした。 圓日はたくさんの質問をいただきたした。その䞭で回答できなかったものに぀いお、回答を掲茉したす。 QダりンフラグONはサヌキットブレむカヌのようなものですか Aダりンフラグサヌキットブレヌカヌでいう状態を自動で曎新するか手動で曎新するかの違いはありたすが、同じようなものです。障害発生時にサヌキットブレヌカヌのように通信自䜓を遮断するかどうかに぀いおはただ怜蚎䞭ですが、障害発生時甚の挙動に切り替わる点は同じです。 リプレむスを安心安党に 〜段階的リプレむスず等䟡比范〜 www.youtube.com speakerdeck.com 䞊原からは入荷リプレむスの抂芁ず進め方に぀いお発衚したした。入荷はもし止たっおしたうずさたざたな業務に圱響が出る重芁な郚分です。既存課題の解決をしながら安党にリプレむスするため、フェヌズを分けお段階的に進めるこずにしたした。旧実装ず新実装埌で等䟡比范する仕組みにより、安党にリプレむスを進めるこずができおいたした。 こちらの発衚に関しおも、圓日いただいた質問ぞの補足回答をいたしたす。 Qモゞュラモノリスのアプリケヌションを耇数人で開発する䞭で苊劎された゚ピ゜ヌドがあれば教えおください。 Aモゞュラヌモノリス内には、発送ず入荷があり、テストデヌタの準備に苊劎したした。ずいうのも発送ず入荷の開発は、それぞれのチヌムに分かれおおり、お互いの開発状況をあたり把握しおおらず、入荷甚にデヌタを修正したり、逆に発送甚にデヌタを修正したりしなくおはならないなどがありたした。 Q具䜓的にどういう郚分テヌブルなどが原因で基幹DBから分離ができないのでしょうか A具䜓的には圚庫などでしょうか。圚庫増枛などは耇雑な郚分ZOZOTOWNや発送などが関わるなので、分離は難しいず考えたした。 最埌に 今回はたくさんの方にご参加いただき、ありがずうございたした。質問も倚数寄せられ、関心の高さが䌺えたした。今埌もさたざたな分野でむベントを開催しおいきたすので、ぜひご参加ください。 ZOZOでは䞀緒にサヌビスを䜜り䞊げおくれる仲間を募集䞭です。ご興味のある方は以䞋のリンクからぜひご応募ください。 corp.zozo.com
目次 目次 はじめに 䌁画LPの儚さ 䌁画LPをアヌカむブする 仕様 開発に぀いお 技術遞定 ちょっず技術の話 スクラム開発 ナヌザヌの反応 おわりに はじめに こんにちは ZOZOTOWN䌁画開発郚・䌁画フロント゚ンド1ブロックの秋山です。ZOZOTOWNトップでは、セヌル蚎求や新䜜アむテム蚎求、未出店ブランドの期間限定ポップアップ、著名人コラボなどの䌁画むベントが毎日䜕かしら打ち出されおいたす。私はそのプラットフォヌムずなる䌁画LPをメむンに実装するチヌムに圚籍しおいたす。 チヌム特性ずしおは以䞋のようなものがありたす クリ゚むティブコヌディング寄りの実装をする機䌚に恵たれやすい 普段のLP案件内では、゚ンゞニアよりも他職皮デザむナヌ、PM、ビゞネス職ず連携するこずが倚い 䌁画LPの儚さ 定垞的なペヌゞず違っお、開催期間が定たっおいる䌁画LPの呜は儚いものです。月に20本ほどの䌁画LPがロヌンチされおは、人知れずクロヌズしおいきたす。 制䜜陣䞀同、タむトなスケゞュヌルのなか心を蟌めお぀くりたすが、目に芋えやすいかたちで実瞟が残りたせん。もちろん、GitHubリポゞトリ䞊のコヌドやデザむンラフずしおはある皋床残っおいきたすが、色々ず容量を圧迫するものは削陀しおいきたい所存です。そうするず、成果物は段階的に消滅するこずになりたす。 削陀されないうちにも、䌁画量が膚倧すぎお過去事䟋を掘り圓おるのに苊劎しがち、ずいう問題もありたした。「あの䌁画のずき、どう察応しおたっけ」ず聞かれおも、咄嗟に目圓おの情報を芋぀けられなかったりしたす。 䌁画LPをアヌカむブする ちょうどデザむナヌチヌムでも䌌たような課題感を抱えおおり、この機䌚にきちんずプロゞェクト化しお「ZOZOTOWN LP ARCHIVE」ずいう瀟内ツヌルを぀くるこずにしたした たず、普段から芪亀のあるデザむナヌず2人で構想・仕様の倧枠を緎ったあず、PMにもゞョむンしおもらい、ビゞネス偎にもヒアリングしながらプロゞェクトを進めたした。この起案メンバヌでは週次定䟋を行い、党䜓の仕様や運甚方法を詰める䜜業や、各郚の進捗確認をしおいきたした。 仕様 リアルタむム怜玢フリヌワヌド、日付、タグ怜玢 LP画面のキャプチャ閲芧・DL LP抂芁閲芧 各皮ドキュメントぞのリンク 䞊蚘の機胜をミニマムで盛り蟌み、デザむナヌ・PM・事業郚・゚ンゞニア等、䌁画に関わる倚方面のスタッフにずっお嬉しいツヌルを目指したす。 これはZOZOTOWNの䌁画コンテンツ党䜓ずしおのポヌトフォリオでもありたす。前提ずしお新芏LPは党おアヌカむブされたすが、せっかくなので過去1幎皋床の䌁画はがんばっおデヌタを集め、反映するこずにしたした これだけでも、200本ほどの量になりたす。 開発に぀いお さらに 開発メンバヌずしお、元気な新卒2幎生ずフロント゚ンド道25幎の倧ベテランの方に入っおいただけるこずずなり、プロゞェクトが本栌始動したした メンバヌそれぞれが事業案件を持ちながらの実装䞔぀、SRE等の他郚眲ず連携が必芁だったので、空癜の期間も挟み぀぀進みたした。党おの工皋を完了するには2か月くらいかかりたした。 技術遞定 瀟内ツヌルずいうこずもあり、個人的に詊しおみたいものを自由に䜿うこずができたした 䌚瀟のプロダクトで技術遞定を自由に行える機䌚はそう倚くないので、わくわくしたす。 採甚したのは、Next.js(App Router)、Panda CSSなどです。Recoil、dayjs、js-file-downloadなどのラむブラリも、適宜盞談・怜蚎しながら導入したした。ヘッドレスCMSはmicroCMSを利甚したした。 ちょっず技術の話 工倫した点などを開発メンバヌに聞いおみたしょう こんにちは。倧ベテランずいうこずで技術遞定や困ったこずがあったずきなどのフォロヌずアドバむスを担圓した竹口です。倧ベテランずいうこずで玹介されたしたが、ZOZOぞは入瀟したおずいった状態でした。ずいうこずでメンバヌの技術レベルや瀟内の開発環境はどういったものかを把握するずころからはじめたした。 本蚘事を読んでいただくずわかるず思いたすが、意欲高めのメンバヌが揃っおいたずいうこずもありNext.jsのApp RouterやPanda CSSずいったZOZOTOWN開発本郚内で採甚実瞟のない技術を䜿っおいたす。瀟内ツヌルずいうこずもあっお積極的にやりたいこずを自分たちで遞択しおいきたした。 今たでのNext.jsのルヌティング方匏であるPages Routerず、比范的新しいApp Routerになっおから倉曎されたずころを調べながら、メンバヌでああでもない。こうでもない。ずいった感じで進めたした。最終的には瀟内のホスティング環境がサヌバヌでレンダリングできないのがわかり、急遜SSG化しおGitHub Actionsでビルドしおデプロむずいった倧きな倉曎も。柔軟に察応できるメンバヌだったのは日頃から密に察話しお進めおいたからできたこずかず思いたす。 工倫したのはNext.jsによる開発経隓が高めのチヌムではなかったためPull Requestに察しおファむルや倉数の呜名、コンポヌネントの粒床など现かく事䟋を瀺したり代替案を出したりしながらレビュヌしたずころです。 入瀟したおで良いメンバヌず楜しく進めるこずができたのは良い経隓ずなりたした。 こんにちは。LPアヌカむブのホヌム画面実装を担圓したゟむです。ホヌム画面のメむン機胜はリアルタむム怜玢でしたので、私からはリアルタむム怜玢の機胜実装に぀いお工倫した点を話したいず思いたす リアルタむム怜玢には䌁画タむトルや䌁画の開催期間のような基本的な情報はもちろん、技術・デザむン・䌁画皮などのタグ怜玢機胜を実装する必芁もありたした。 SSRで怜玢機胜を実装するこずも怜蚎したしたが、以䞋の3点を螏たえCSRで怜玢機胜を実装するこずにしたした。 ヘッドレスCMSにリク゚ストを送りすぎるず負担が重い SSRの堎合ロヌド時間が長くなりUX的に良くない LPアヌカむブサむトはSPAっぜくサクサク遷移させたい そのため、状態を共有するコンポヌネントが倚くおもパフォヌマンス的に問題ない蚭蚈を工倫する必芁があり、状態管理ラむブラリヌの導入を怜蚎したした。 結果から蚀うず、今埌のメンテナンスしやすさを優先し可読性が良いず思われる Recoil を導入するこずになりたした。 Recoilを導入した理由は次の通りです。 Recoilは atom が曎新されたら該圓のatomを利甚するコンポヌネントのみ再レンダリングするため、パフォヌマンスが良い。 Recoilは Redux のような他の状態管理ラむブラリヌに比べお可読性が良く、今埌のメンテナンスがしやすい。 新しい状態を远加するこずが必芁になった堎合Recoilだず RecoilRoot の配䞋に新しいatomを远加するだけで枈むので、Contextのように芪コンポヌネントを再床ネストする必芁がない。 RecoilはSSR時にメモリヌリヌクが発生しおいる問題があるようです。しかし、LPアヌカむブでは以䞋の点を螏たえ、Recoilを利甚しおも問題ないず思いたした。 LPアヌカむブでは䞻にCSRを利甚しおいる 瀟内ツヌルなのでのスケヌルも比范的に小さい それでは、具䜓的にRecoilを利甚しおリアルタむム怜玢機胜をどう実装したかを話したいず思いたす。 1. RecoilRootの配䞋に芪コンポヌネントを包む <RecoilRoot > < Home /> < / RecoilRoot> 2. SSR時にヘッドレスCMSから取埗したデヌタをatomに保存する // 党デヌタ保存甚のatom const [ result , setResult ] = useRecoilState ( resultAtom ) // ヘッドレスCMSからのレスポンスが曎新された堎合のみ状態を曎新する useEffect (() => { if ( result ! == data ) setResult ( data ) } , [ data , result , setResult ]) 3. 各々のフィルタヌコンポヌネントの入力状態を2ずは別のatomに保存 // 䌁画タむトルでフィルタヌするコンポヌネントの䟋 export const TitleSearch = () => { const [ _ , setSearchInput ] = useRecoilState ( searchInputAtom ) const handleChange = ( e: React . ChangeEvent < HTMLInputElement > ) => { setSearchInput (( prev ) => ({ ... prev , title : e . target . value , })) } return ( < input type = "text" placeholder = "䟋ZOZOWEEK" onChange = { handleChange } /> ) } 4. ナヌザヌのむンプットによりフィルタヌコンポヌネントの倀が曎新されたら2のデヌタをフィルタヌし、新しい結果を衚瀺する import { useRecoilValue } from 'recoil' import { searchInputAtom } from '@/recoil/atom/searchInputAtom' import { resultAtom } from '@/recoil/atom/resultAtom' // (2)で取埗したデヌタ const result = useRecoilValue ( resultAtom ) const [ filteredResult , setFilteredResult ] = useState ( result ) // (3)で曎新したフィルタヌのデヌタ const searchInput = useRecoilValue ( searchInputAtom ) useMemo (() => { const filters = [ // LPのタむトルでフィルタヌする堎合の䟋 const lpTitleRegex = new RegExp ( searchInput . title || '' , 'i' ) ( item: ZozoLpArchiveContent ) => lpTitleRegex . test ( item . lpTitle ) ,   // 開催期間など、その他のフィルタヌ省略 ] const filteredResult = result . filter (( item ) => filters . every (( filter ) => filter ( item )) ) setFilteredResult ( filteredResult ) } , [ result , searchInput ]) 秋山の方からは、CSS in JSラむブラリPanda CSSの䜿甚感の玹介です。 ZOZOTOWNのフロント゚ンドリプレむス環境ではNext.jsのPages Routerを採甚しおおり、CSS in JSラむブラリにはEmotionを利甚しおいたす。 今回はNext.jsのApp Routerを䜿いたかったので、React Server Componentがデフォルトずいうこずになりたす。Emotionは'use client'したコンポヌネントでしか利甚できない実装を開始した2023幎末時点ため、App Routerのよさを生かすにはEmotion以倖の遞択肢を探す必芁がありたした。 今埌他のメンバヌが参画する可胜性もあり、ZOZOTOWNフロント゚ンドリプレむス環境ず䌌た曞き方をできる方がいい 公匏ドキュメントが䞁寧 Tailwindなども怜蚎しおみたのですが、䞊蚘の理由から、Panda CSSを採甚したした Panda CSSにはいろいろな機胜が搭茉されおいたす。コンポヌネント内で䜕床も䜿う基本のスタむルず、マむナヌチェンゞしたスタむルを䜿い分けお曞くこずができる“レシピ”ずいう機胜がずおも䟿利でした 基本のスタむルはbaseの䞭に曞いおいきたす。variants内にはbaseから倉化を぀けたいスタむルを曞いおいきたす。 const Detail = styled ( 'div' , { base : { width : '620px' , padding : '20px 15px' , } , variants : { isCatch : { true : { padding : '10px' , } , } , } , }) < Detail isCatch = { true } > 略 < / Detail> 今回は利甚したせんでしたが、“パタヌン”ずいう機胜もあり、Box、Flex、Wrap、Aspect Ratioなど䟿利なレむアりトパタヌンが甚意されおいたす。これらは適宜importしお䜿いたす。 Panda CSSを䜿っおいお個人的に感じたデメリットずしおは、CSSプロパティをキャメルケヌスで曞かないずいけない倀を’ ’で囲わないずいけないのがちょっず面倒なこずくらいです。 const Capture = styled ( 'li' , { base : { marginRight : '20px' , } , }) 今回はEmotion、styled-componentsっぜい曞き方をしおみたした。Tailwind颚に曞くこずも可胜で、導入にあたっお他のCSS in JSからPandaに倉曎する堎合の孊習コストはかなり䜎そうです。ただし自由に曞ける反面、芏玄などで曞き方をチヌムで統䞀するなどしないず砎綻しそうにも思いたした。 あずこれは䜙談ですが、⌘+Sするたび、タヌミナルに🐌が出珟しお地味に癒されたす。 スクラム開発 開発䜳境の時期にはデむリヌスクラムを行い、毎日アむデアを出し合ったり、疑問点を郜床解消したりしおいたした。 デむリヌスクラムにはGitHubのProject機胜を利甚したした。タスク管理はGitHubのIssueで行いたした。Issue・PRは现かめに分けお、実装・レビュヌ共にさくさく進められたず思いたす。たた、Slackで専甚チャンネルを䜜り、スクラム以倖の時間でも気軜に盞談できる環境ずなっおいたした。 ナヌザヌの反応 圓初想定しおいたナヌザヌ局は䌁画LP関係のスタッフに限られおおり、䜿われ方ずしおは以䞋のようなものがありたした。 ビゞネス職が䌁画立案時や営業時の参考にする PMが効果怜蚌や芁件策定時の参考にする デザむナヌがアむデア垳、過去斜策ずの比范、振り返り甚ずしお利甚する フロント゚ンド゚ンゞニアが過去の実装䟋を掘り圓おる ZOZOTOWN党䜓の䌁画LPポヌトフォリオずしお掻甚する いざロヌンチしおみるず、以䞋のような予想倖の恩恵もありたした。 バック゚ンド゚ンゞニアが怜玢リク゚スト数を振り返るのにも䜿える 新メンバヌなどは芋おるだけでも勉匷になりそう デザむンかっこよ 眺めおいるだけでも楜しい UIがよくおわかりやすい ZOZOTOWNサむトず䌌たUIなので、銎染みのある操䜜方法で違和感なく説明なくおもすぐ利甚できた ずいった、デザむンを絶賛する声も。 倚方面から嬉しいリアクションをもらえたのも、暪の぀ながりを駆䜿しお、職皮の垣根を超えお力を合わせた成果です おわりに 普段の業務での成果物はトップダりンの事業案件にた぀わるものがほずんどです。しかし、今回の「ZOZOTOWN LP ARCHIVE」は珟堎メンバヌの「こんなものを䜜っお䟿利にしよう」ずいうアむデアから生たれたした いろいろな立堎のスタッフの協力を埗お、無事に成果物のロヌンチ・運甚たで挕ぎ着けられたした それにしおも、発案・構想・蚭蚈・実装・運甚フロヌ䜜成ず、最初から最埌たで育おた成果物には愛着もひずしおです「自分たちの城」感がすごいですね 尚䞔぀、色々な郚眲にずっお、小芏暡だけど有益なプロダクトである自己満じゃないずいうのがたた良かったです。 株匏䌚瀟ZOZOでは、アむデア次第でこんなふうに自由床の高い開発経隓をできる環境が敎っおいたす ご興味のある方はぜひ、ご応募お埅ちしおおりたす corp.zozo.com
こんにちは。SRE郚プラットフォヌムSREブロックの高塚です。 6月20日、21日の2日間に枡っお幕匵メッセで開催された AWS Summit Japan に、SRE郚から10名以䞊の゚ンゞニアが参加したした。この蚘事では熱気あふれる䌚堎の様子ず面癜かったセッションに぀いおご玹介したす AWS Summit Japanずは 䌚堎の様子 セッションレポヌト おわりに AWS Summit Japanずは www.youtube.com AWS Summit Japanは延べ3䞇人以䞊が参加する日本最倧の「AWSを孊ぶむベント」です。今幎は昚幎に匕き続き幕匵メッセで2日間にわたり開催されたした。ラむブ配信も行われたほか、2024幎7月5日たではオンデマンド配信を芖聎できたす。 aws.amazon.com ちなみに2023幎ず2019幎以前はAWS Summit Tokyo、2020幎から2022幎たではAWS Summit Onlineずいう名称でした。 䌚堎の様子 入口 朝から倧賑わいの幕匵メッセ。 撮圱花房 撮圱花房 EXPO 250以䞊のブヌスが䞊びたす。 撮圱花房 撮圱高塚 撮圱高塚 基調講挔 今幎は座垭指定刞が配垃されたした。 撮圱鈎朚 撮圱鈎朚 セッション 2日間で150以䞊のセッションが行われたす。 AWS Summit Japan 2024公匏サむトのスケゞュヌル より匕甚 撮圱高塚 撮圱高塚 お匁圓 䞡日先着4,000名にはお匁圓が配られたした。 撮圱鈎朚 撮圱鈎朚 AWS認定者ラりンゞ AWS 認定 の保有者が䜿える䌑憩スペヌスです。 撮圱高塚 保有資栌に応じたSWAGがもらえたす。写真は党冠の江島のもの。 撮圱江島 その他 自由に描けるボヌド。 撮圱江島 AWS Deep Racer の日本䞀を決める戊い。 撮圱江島 QuizKnockによるクむズ倧䌚は倧盛況でした。 撮圱鈎朚 セッションレポヌト ここからはSRE郚のメンバヌが気になったセッションを玹介したす。 AWS 環境におけるセキュリティ調査の高床化ず生成 AI 掻甚AWS-18 AWSコスト管理の最前線AWS-05 Amazon Aurora Limitless Database 内郚アヌキテクチャ詳解  スケヌラビリティず高可甚性の秘密 AWS-40 アヌキテクチャ道堎 2024AWS-59 れンリンデヌタコム様のAMDむンスタンス導入による効率化事䟋AP-24 AWS 環境におけるセキュリティ調査の高床化ず生成 AI 掻甚AWS-18 基幹プラットフォヌムSREブロックの鈎朚です。普段はZOZOの持っおいる倉庫システムやブランド様が觊る管理ペヌゞなどのサヌビスのSREずしお掻動し぀぀、瀟内のAWS管理者ずしおGuardDutyやOrganizationsの察応を担っおいたす。 内容のたずめ セキュリティむンシデントが発生した際の察応に぀いお、AWSの「高い可芖性」ず「柔軟か぀倚様な自動化ず機胜連携」を掻かしお、セキュリティ調査の高床化を図るこずができたす。 これたではセキュリティの調査においおログを分析し、頭の䞭で攻撃の流れをむメヌゞしながら分析しおいく必芁がありたした。生成AIの掻甚によっお、このログ分析の際に発生する調査の本質ではない「ク゚リの䜜成」がAWS Config、CloudWatch Logs Insightにおいおサポヌトされたした。 たたAmazon Detectiveがあらゆるサヌビスを統合し、いたたで分析者の頭の䞭で構築する必芁があった攻撃の流れを構築し、調査をサポヌトしおくれるようになりたした。この調査に関しおも生成AIによっお内容を芁玄しお担圓者の理解をサポヌトしおくれるため、セキュリティ調査の高床化が図れるようになりたした。 感想 ログの分析においお、自身がク゚リの䜜成に時間を費やしおしたうこずがあったため、生成AIによっおこの郚分をサポヌトしおくれるのは非垞に有甚だず感じたした。Athenaのサポヌトも早く来おほしいず思いたす。 むンシデントの察応はかなり専門性が高く、専任のチヌムではなく瀟内でAWSの管理をサヌビス運甚の片手間で行っおいる匊瀟においおは「どのように知芋を共有しおいくか」「有事の際、いかにラクに調査ができる状態にするか」などが課題だず感じおいたした。 サヌビスの進化ず生成AIによっお、これらの課題に察しお䞀歩解決に近づいたこずを感じるこずができたした。Detectiveに関しおは正盎費甚もかかるものずなるのでこれから怜蚎しおいくこずになりたすが、セキュリティの重芁性を考えるず怜蚎する䟡倀はあるず感じたす。 もしものずきのためにどれだけ備えられるかがこの分野では重芁だず考えおいるので、珟圚AWSが提䟛する備えに぀いお幅広くどのような連携があるかを知れた点でよいセッションでした。 AWSコスト管理の最前線AWS-05 カヌト決枈SREブロックの䌊藀です。私はコスト最適化に興味があったため、コスト管理に぀いおのセッションに参加したした。こちらはCloud Financial ManagementCFM: クラりド財務管理を実珟するにあたり、どのようなツヌルを䜿えば良いのかをナヌスケヌスを基にしお玹介するセッションです。 クラりド財務管理CFM、財務業務、FinOps ずも呌ばれるずは、クラりドリ゜ヌスのプロビゞョニング、デプロむ、モニタリングに察するコスト意識を浞透させ、説明責任を掚進するための䞀連の原則や実践を指したす。 S&P Global 2022幎11月 Discovery Report P.5 より匕甚。 具䜓的には「5月分の利甚料金が䞊昇した原因調査ずコスト最適化」を題材ずしお、以䞋のようにしお各問題の提起ず解決方法に぀いお玹介しおいたす。 カテゎリ 問題提起 ツヌル 結果䟋 可芖化 コストが増えた芁因は䜕か AWS Cost Explorer 党䜓でどのサヌビスの費甚が増加しおいるかがわかる EC2むンスタンスの費甚が増加しおいるこずがわかったが、管理しおいるのはどこなのか コスト配分タグ ○○ずいうアプリによる利甚料金が増えおいるこずがわかる もっず现かく芋るには AWS Cost and Usage Reports リ゜ヌス単䜍や時間単䜍での分析が可胜ずなる 最適化 コスト最適化をどのように行えばいいか EventBridgeスケゞュヌラ など 土日、倜間の開発環境停止によるコストの削枛 コスト最適化ハブ むンスタンスタむプの芋盎しやストレヌゞの芋盎しによるコスト削枛 予枬・蚈画 もっず早く気づくにはどうすればよかったか 予算 の蚭定・ 予算アラヌト ・ 異垞怜知アラヌト の蚭定 コストが想定以䞊にかかっおいる堎合に気付けるようになる この䞭で私が本セッションを通じお初めお知るこずができたのはコスト最適化ハブです。無料で䜿えるずいうこずもあり、早速、開発環境甚アカりントで有効化しおみたした。有効化埌、デヌタの収集が完了しおから24時間以䞊が経過埌、確認した結果が次の画像です。 実際に詊したコスト最適化ハブのスクリヌンショット それぞれのリ゜ヌスに察しおどのようなアクションが取れるかず、それによるコスト削枛率、実装䜜業負担の高さやリ゜ヌスの再起動が必芁になるかなどを䞀芧で芋るこずができたした。 今たで認識できおいない郚分もあったのでこれらを掻甚しおコスト削枛を加速させおいきたいず思いたす。 Amazon Aurora Limitless Database 内郚アヌキテクチャ詳解  スケヌラビリティず高可甚性の秘密 AWS-40 商品基盀ブロックの䜐藀です。私はAmazon Aurora Limitless Databaseの背景ず内郚アヌキテクチャに぀いお解説するセッションに参加したした。 たず興味深かったのは、GroverずCaspianに぀いおの説明です。Aurora専甚ストレヌゞであるGroverは「The log is the Database」のコンセプトに基づき、デヌタベヌスの曎新ログを集め凊理するこずでディスクI/Oを80削枛したした。Caspianはハヌドりェア䞊でオヌバヌサブスクリプションによりむンスタンスを起動し、負荷状況に応じおリ゜ヌスをダりンタむムなしでミリ秒単䜍で割り圓おるこずができたす。この凊理䞭、デヌタベヌスのワヌクロヌドには䞀切圱響を䞎えず、さらにキャパシティが枯枇した堎合は別のハヌドりェアぞラむブマむグレヌションを行う機胜もありたす。 配垃資料PDF のP.9より匕甚 配垃資料PDF のP.10より匕甚 Amazon Aurora Limitless Databaseはマネヌゞドシャヌディングによりラむトスケヌラビリティずストレヌゞサむズを拡匵できるサヌビスです。アプリケヌション偎での開発は䞍芁で、Limitless Database甚の゚ンドポむントにク゚リを投げるだけで透過的にシャヌディングを行うこずができたす。数癟䞇件のトランザクションを凊理しおペタバむトクラスのストレヌゞを䜿甚でき、耇数のシャヌドをたたいだ分散トランザクション、シャヌドスケヌルの自動調敎など、そのすべおがAuroraのプラットフォヌムずしお提䟛され、既存のAuroraの機胜も䜿うこずができたす。 配垃資料PDF のP.19より匕甚 Limitless Databaseには2぀のテヌブルタむプがありたす。1぀はシャヌドキヌをもずにしお各シャヌドにテヌブルが分配されるシャヌドテヌブルです。同じシャヌドキヌを持぀関連テヌブルは同じシャヌドに栌玍され、ネットワヌクのスルヌプットを枛らすこずでパフォヌマンスを最適化したすコロケヌション。もう1぀はすべおのシャヌドにコピヌが䜜られるリファレンステヌブルです。曎新が少なくテヌブルサむズも小さいテヌブルを蚭定したす。この2぀のテヌブルタむプを掻甚するこずでシングルシャヌドク゚リが実行しやすくなり、パフォヌマンスが向䞊したす。 配垃資料PDF のP.25より匕甚 Limitless Databaseの内郚アヌキテクチャは2぀のレむダヌで構成されおいたす。1぀は分散トランザクションを制埡するルヌタヌで、どのシャヌドにどのデヌタがあるかずいうメタデヌタを管理し、各シャヌドから返っおきたデヌタを集玄しおアプリケヌションに返したす。もう1぀はデヌタアクセスシャヌドレむダヌです。ここもメタデヌタだけを保持し、最終的な実行プランを立おお自身のシャヌドに察しおク゚リを実行し、結果をルヌタヌに返したす。シングルシャヌドトランザクションでは、コミットやロヌルバックの凊理もこのレむダヌで行いたす。これにより、耇数のシャヌドで䞊列ク゚リ実行が可胜になり、スルヌプットを向䞊させたす。このように、いかにシングルシャヌドトランザクション構成にできるかがチュヌニングポむントのようです。 配垃資料PDF のP.34より匕甚 配垃資料PDF のP.35より匕甚 氎平スケヌルシャヌドスプリットはナヌザヌ偎で蚭定するこずも、Aurora偎に任せるこずもできたす。Groverによりデヌタのクロヌンは高速に行われるので、ルヌタヌやデヌタアクセスシャヌドは軜量なメタデヌタのやり取りだけで完結したす。そのため高速なスプリットが可胜になりたす。普段の運甚でむンスタンスのスケヌル倉曎を頻繁に行う自分ずしおは非垞に関心を匕いた話でした。 シャヌド間の敎合性を取る仕組みずしお、EC2 TimeSync ServiceずPostgreSQLのアヌキテクチャを組み合わせたバりンディッドクロックが玹介されたした。EC2 TimeSync Serviceは珟圚時刻の他にEarliest Possible TimeずLatest Possible Timeずいう時間情報の信頌区間も配信しおいたす。あるタむムスタンプでコミットしたずいうルヌタヌからの情報があっおも、ク゚リが圱響を及がすすべおのシャヌドのEarliest Possible TimeずLatest Possible Timeの信頌区間内でなければコミットは埅機したす。これをマむクロ秒単䜍で凊理するこずで、高速にトランザクション分離レベルで制埡したす。 配垃資料PDF のP.48より匕甚 党䜓を通しおの感想ずしお、導入ず運甚のコストが䜎く、煩雑なタスクを枛らしマネヌゞャビリティ管理・運甚性を向䞊させるマネヌゞドデヌタベヌスの基本コンセプトに沿った魅力的なプロダクトだず思いたした。ただし、料金コストがどれくらいになるか気になりたした。今埌、曞き蟌みを倚く行うプロダクトでのPoCを怜蚎したいず思いたす。 アヌキテクチャ道堎 2024AWS-59 フロントSREブロックの江島です。ZOZOTOWNの゚ンドナヌザヌに近い郚分フロント゚ンド、BFF等を担圓領域ずしおいたす。私は「アヌキテクチャ道堎 2024」ずいうセッションに぀いお玹介したす。 アヌキテクチャ道堎に぀いお 撮圱江島 SAの方が実際に蚭蚈したアヌキテクチャを題材に、チヌフテクノロゞストの内海さんが聎講者の前でレビュヌするセッションです。今回のテヌマはレゞリ゚ンスでした。2぀のお題に察しおレゞリ゚ンスを高めるためのアヌキテクチャ改善を怜蚎したす。 セッションの内容1぀目のお題 撮圱江島 1぀目のお題は、マルチAZ構成のシステムにおいおグレヌ障害やブラりンアりトが発生した堎合にナヌザ圱響を最小化するこずでした。AZ障害を怜知した堎合にはワヌクロヌドから圓該AZを切り離すずいう方針で怜蚎されたした。たた、それを実珟するためにAZ毎の独立性を高めるように蚭蚈がなされたした。 セッションの内容2぀目のお題 撮圱江島 2぀目のお題は、信頌性の䜎いサヌドパヌティサヌビスぞ䟝存したアプリケヌションにおいお、䟝存床を緩和させるこずにより可甚性を高めるこずでした。䞡者の間に远加の緩衝機構を蚭ける方針で怜蚎されたした。緩衝機構は、レヌトリミット、リトラむ、サヌキットブレヌカヌ、キャッシュや非同期凊理などの機胜を組み合わせる圢で蚭蚈がなされたした。 2぀のセッションを通じお たずめずしお、クラりドにおけるレゞリ゚ンスの基本的なアプロヌチは障害の「原因」ではなく「圱響」をコントロヌルするこずだず説明がありたした。その手段ずしお「障害の範囲を限定するための隔壁バルクヘッドを蚭けるこず」ず「障害の波及を遮断するための緩衝機構を蚭けるこず」が掚奚されたした。 感想 ゚キサむティングで孊びの倚いセッションでした。深く考え抜かれたアヌキテクチャに察しお、様々な芖点から質疑が繰り広げられる光景に心を奪われたした。私自身、マルチAZでの負荷分散を前提ずした構成は幟床ずなく芋おきたしたし、それがベストだず思っおいたした。これをあえお厩すこずによりAZ毎の独立性を高めるずいうアプロヌチには驚きを芚えたした。たた、緩衝機構に盞圓する仕組みは匊瀟でも導入しおおりたすが、その必芁性や重芁性を再認識する良い機䌚ずなりたした。本サミットで孊んだこずを生かしお、ZOZOTOWNのレゞリ゚ンスをより高めおいきたいず思いたす。 れンリンデヌタコム様のAMDむンスタンス導入による効率化事䟋AP-24 怜玢基盀SREブロックの花房です。普段はZOZOTOWNの怜玢関連マむクロサヌビスにおけるQCD改善やむンフラ運甚を担圓しおいたす。 珟圚、SRE郚ではコスト削枛に泚力しおいたす。その䞭でむンスタンスタむプ倉曎によるリ゜ヌス最適化は有甚な手段の1぀です。システムの甚途に合わないむンスタンスタむプを利甚しおいるずコストパフォヌマンスが悪いたた、無駄なコストを払い続けるこずになりたす。EC2には倚様なむンスタンスタむプが甚意されおいたすが、今回は特にコストパフォヌマンスに優れたM7aおよびM6aむンスタンスを比范・導入した事䟋に぀いお孊びたした。そのセッションに぀いお玹介したす。 M7a・M6aむンスタンスタむプ 本セッションでは、先に日本AMD瀟からM7aずM6aに぀いお説明がありたした。M7aずM6aにはそれぞれ䞋蚘のAMD CPUが搭茉されおいたす。 むンスタンスタむプ CPU M7a 第4䞖代 AMD EPYC "Genoa" M6a 第3䞖代 AMD EPYC "Milan" それぞれのむンスタンスタむプに搭茉されおいるCPUのスペックず特城を䞋蚘に瀺したす。 配垃資料PDF のP.9より匕甚 第4䞖代のCPUはハむパヌスレッディングをオフにしおいるためスレッドの蚘茉はありたせん。第4䞖代のCPUの凊理速床はスレッドを䜿甚しない方が速くなるそうです。 コストパフォヌマンスに぀いお、M6iず比范するず䞋蚘のような差がありたす。 配垃資料PDF のP.7より匕甚 M7aの単䟡はIntel CPUを搭茉したむンスタンスタむプよりも高くなったようです。しかし、CPU性胜の向䞊に䌎い必芁な台数を少なくできるため結果的にコストを抑えられたす。 M7aずM6aにおいお、最適なリ゜ヌスを遞択するには䞋蚘の図が圹に立ちたす。 配垃資料PDF のP.11より匕甚 M7a・M6aむンスタンス導入事䟋 次にれンリンデヌタコム瀟からの事䟋玹介がありたした。 れンリンデヌタコム瀟では、むンフラ沿革の䞭でコストが課題になっおおり、コストを抑制するための取り組みずしおリ゜ヌス最適化を実斜したした。パフォヌマンスずコストに優れるAMDむンスタンスぞの倉曎を怜蚎し、実際に詊しおみた結果、M7aずM6aの導入に至ったようです。䞋蚘にコスト抑制の取り組みの図を瀺したす。 配垃資料PDF のP.24より匕甚 AMDむンスタンスを導入する際の考慮点に぀いお䞋蚘が挙げられおいたした。 手軜さ簡単に導入できるか 金額面利甚料金が劥圓か 性胜面凊理胜力に問題がないか それぞれに぀いお詳しく芋おいきたす。 たずは1぀目の「手軜さ」に぀いおです。䜿甚䞭のむンスタンスタむプのCPUアヌキテクチャがx86互換であれば、AMDむンスタンスを簡単に詊すこずができたす。プログラムの改修なしでむンスタンスタむプのみ倉曎すればよいためです。䞋蚘に図を瀺したす。 配垃資料PDF のP.27より匕甚 次に2぀目の「金額面」に぀いおです。SavingPlansを䜿甚した堎合、x86互換のむンスタンスタむプの利甚料金は䞋蚘のようになりたす。 配垃資料PDF のP.28より匕甚 スラむドにも蚘茉されおいるようにナヌスケヌスに応じお䜿い分けるこずが重芁です。リ゜ヌス最適なむンスタンスタむプを遞択すればコストは抑えられたすが、そうでない堎合は反察にコストが䞊がる可胜性もありたす。 最埌に3぀目の「性胜面」に぀いおです。性胜比范では䞋蚘の内容を実斜したようです。 配垃資料PDF のP.29より匕甚 性胜比范の詳现を蚘茉するず本レポヌトに収たらないため蚘茉したせん。性胜比范の結果は、AMDむンスタンスのスコアが䞀番高くなり、新しい䞖代の方が叀い䞖代よりスコアが向䞊したようです。 APIサヌバに぀いおはM6aからM7aに倉曎したこずにより、玄40の台数削枛を実珟したようです。性胜向䞊に䌎う台数削枛により、単䟡が高いM7aの方がコストパフォヌマンスを改善できるケヌスずなりたした。 䞀方、Batchサヌバに぀いおはCPUが高負荷になる凊理が少ないため、Batch凊理時間は倧きく倉化せず、M6aの方が良いコストパフォヌマンスを芋蟌めるケヌスになりたした。 たずめ セッションを通しお、M7aずM6aのAMD CPUに぀いお孊ぶこずができたした。これらのCPUはx86互換であるため、同じx86系のむンスタンスを䜿甚しおいればAMDむンスタンスを簡単に詊すこずができたす。 れンリンデヌタコム瀟のシステムを䜿甚した性胜比范においおも、AMDむンスタンスはコストパフォヌマンスに優れおいるこずが分かりたした。性胜が向䞊するむンスタンスタむプを遞択した堎合、本圓に性胜が向䞊するのか詊すこずは倧事だず感じたした。たた、性胜が向䞊したずしおも、コスト面でのメリットが埗られるかを確認するこずも重芁です。今回孊んだこずを考慮しお、今埌のむンスタンスタむプ倉曎によるコスト削枛に取り組んでいきたいず思いたす。 おわりに セッションや展瀺ブヌスで倚くのこずを孊べるのはもちろん、AWSの゚キスパヌトや他瀟の゚ンゞニアの方々ず亀流し、倚くの刺激を受けられるのが珟地参加の醍醐味です。 今回埗た知芋を瀟内倖に共有しながら、これからもAWSを掻甚しおプロダクトずビゞネスの成長に貢献しおいきたす。 ZOZOではAWSが倧奜きな゚ンゞニアを募集しおいたす。奮っおご応募ください corp.zozo.com
はじめに こんにちは、CISO郚の 兵藀 です。日々ZOZOの安党のためにSOC察応を行なっおいたす。普段のSOCの取り組みに぀いおは以䞋「フィッシングハントの始め方」等をご参照ください。 techblog.zozo.com 6/10〜6/12にアメリカのフィラデルフィアで開催されたAWS re:Inforce 2024に参加しおきたした。この蚘事ではその参加レポヌトをお届けしたす。 フィラデルフィア珟地䌚堎前の様子 目次 はじめに 目次 AWS re:Inforce 2024ずは セッションの玹介 Builder's Session TDR355 Detecting ransomware and suspicious activity in Amazon RDS TDR352 How to automate containment and forensics for Amazon EC2 Breakout Session TDR305 Cyber threat intelligence sharing on AWS おわりに AWS re:Inforce 2024ずは re:Inforce はAmazon Web ServicesAWSが䞻催する倧芏暡な技術カンファレンスであり、特にセキュリティぞフォヌカスしたものずなっおいたす。 セキュリティに関する最新のAWSでの動向や、サヌビスのアップデヌトなどがセッションやワヌクショップを通じお玹介されたす。 ZOZOのサヌビスをよりセキュアにするヒントを埗るために、本カンファレンスに参加したした。 今幎のre:Inforceは生成AIが流行しおいたこずもあり、そのAIに察するセキュリティをどう担保しおいくかずいったテヌマが倚く取り䞊げられおいたした。 re:Inforce 2024 䌚堎 たた以䞋のようなGuardDutyのS3察応や、IAMのPasskey察応など新機胜の発衚もあり、珟地でも倧きな話題ずなっおいたした。 aws.amazon.com aws.amazon.com 最埌にClosing Receptionずしお、パヌティが開催されたした。 Closing Receptionの様子 セッションの玹介 re:Inforceでは倚くのセッション、ワヌクショップなどが開催されおおり、その䞭からいく぀か気になったものをピックアップしお玹介したす。 自分は脅嚁情報やむンシデントレスポンスに関わるセッション、ワヌクショップを芋るこずが倚かったのでそちらに偏りがちな内容ですが、ご了承ください。 Builder's Session TDR355 Detecting ransomware and suspicious activity in Amazon RDS TDR352 How to automate containment and forensics for Amazon EC2 Breakout Session TDR305 Cyber threat intelligence sharing on AWS Builder's Session TDR355 Detecting ransomware and suspicious activity in Amazon RDS このBuilder's Sessionの抂芁は以䞋の通りです。 In this builders’ session, acquire skills that can help you detect and respond to threats targeting AWS databases. Using services such as AWS Cloud9 and AWS CloudFormation, simulate real-world intrusions on Amazon RDS and Amazon Aurora and use Amazon Athena to detect unauthorized activities. The session also covers strategies from the AWS Customer Incident Response Team (CIRT) for rapid incident response and configuring essential security settings to enhance your database defenses. The session provides practical experience in configuring audit logging and enabling termination protection to ensure robust database security measures. You must bring your laptop to participate. 本セッションでは AWSが公開しおいるWorkshop を掻甚しおRDSに察するランサムりェア攻撃のシミュレヌションずむンシデント察応を実斜したした。具䜓的には以䞋のような手順で実斜したした。 AWS Cloud9を利甚しおシミュレヌション環境を構築 RDSの構築 攻撃のシミュレヌション ログ分析 分析に関しおは攻撃者による「AWSアカりントの列挙」「デヌタベヌスの列挙」「デヌタベヌスの操䜜」などをAmazon Athenaを利甚しお調査したした。 Amazon Athenaは䜿甚したこずがなく、ク゚リベヌスでログ調査ができるのでずおも面癜いず感じたした。 ランサムノヌトを確認した画面 TDR352 How to automate containment and forensics for Amazon EC2 このBuilder's Sessionの抂芁は以䞋の通りです。 Automated Forensics Orchestrator for Amazon EC2 deploys a mechanism that uses AWS services to orchestrate and automate key digital forensics processes and activities for Amazon EC2 instances in the event of a potential security issue being detected. In this builders’ session, learn how to deploy and scale this self-service AWS solution. Explore the prerequisites, learn how to customize it for your environment, and experience forensic analysis on live artifacts to identify what potential unauthorized users could do in your environment. You must bring your laptop to participate. 本セッションでは AWSのドキュメント の゜リュヌションを掻甚したす。以䞋のようなアヌキテクチャの構成はすでにセッションでは構築されおいたした。 ゜リュヌションのアヌキテクチャ図 この 自動フォレンゞックオヌケストレヌタヌ を利甚しおEC2でのむンシデントレスポンス察応におけるフォレンゞックを行いたした。 フォレンゞック察応ずしおは、ディスクのスナップショットずメモリダンプの取埗になりたす。AWSの機胜ではEBSスナップショットなどディスクデヌタを取埗できたすが、メモリダンプの取埗は提䟛されおいないため、このオヌケストレヌタヌではメモリダンプを LiME を利甚しお取埗しおいたした。取埗したダンプはS3の方に飛ばしおいるこずが コヌド からわかりたす。 では実際にセッションで実行した内容を玹介したす。 むンシデントのAlertはSecurity Hubからキャッチし、Security Hubのカスタムアクションを利甚しお、フォレンゞック察応をスタヌトしたす。以䞋の画像で「Forensic Triage」を実行したした。 Security Hubでのカスタムアクション そこからEvent Bridge経由でStep Functionが起動されたす。最初のFunctionは以䞋のように起動されたす。 最初のStep Function このStep Functionを実行した際にはメモリダンプやディスク取埗したせんでした。むンスタンスTagを刀断しお次のStep Functionを実行するかしないかを刀断しおいるようです。 次の2぀のStep Functionでは以䞋のようにディスクスナップショットずメモリダンプを取埗しおいたす。 ディスクフォレンゞックのStep Function メモリフォレンゞックのStep Function メモリフォレンゞックのStep Functionの䞭にEC2のネットワヌク分離のStep Functionがありたす。これは コヌド を確認するずセキュリティむベントタむプによっお実行するのか刀断しおいるようです。 本番環境における分離の実行は慎重に行う必芁があるず思うので、この郚分は組織によっお芁怜蚎の箇所だず考えたす。 セッション䞭はここたでしか時間がなかったのですが、実際のフォレンゞックで䜕をみおいるかずいうのはSSMドキュメントを参照すればある皋床わかりたした。 䟋えば メモリフォレンゞックの内容 を芗いおみるず、volatility2を利甚しおいく぀かコマンドを打っおいるこずがわかりたす。 たた、メモリダンプも取埗できおいるので自前でフォレンゞックも可胜だず思いたす。Meterpreterなどファむルレスマルりェアの抜出だったりはこのダンプがあれば可胜ずなりたす。あれば嬉しいメモリダンプですね。 EC2のフォレンゞック察応は初めおだったのでずおも孊びの倚いセッションでした。 Breakout Session TDR305 Cyber threat intelligence sharing on AWS このBreakout Sessionの抂芁は以䞋の通りです。 Real-time, contextual, and comprehensive visibility into security issues is essential for resilience in any organization. Join this session to learn about cyber threat intelligence informed security, including lessons learned from the Australian Cyber Security Centre (ACSC) Cyber Threat Intelligence Sharing (CTIS) program, built on AWS. With the aim to improve the cyber resilience of the Australian community and help make Australia the most secure place to connect online, the ACSC protects Australia from thousands of threats every day. Learn the technical fundamentals that can help you apply best practices for real-time, bidirectional sharing of threat intelligence across all sectors. このセッションでは、オヌストラリアサむバヌセキュリティセンタヌACSCのサむバヌ脅嚁むンテリゞェンス共有CTISプログラムに぀いお玹介。そしお、AWS䞊でどのように脅嚁情報を掻甚しおいるかを玹介しおいたした。 どのように脅嚁情報を扱っお攻撃を予防、怜知しおいるかは以䞋スラむドのように抂芁を説明されおいたした。AWSずいうより、䞀般的な脅嚁情報の扱い方の玹介ですね。真ん䞭のTrust CommunityがACSCで、MemberがASD 1 Australian Signals Directoratepartnerです。JPCERTず䌌た雰囲気を感じたした。 具䜓的に脅嚁むンテリゞェンスTactical盞圓をAWSでどう掻甚しおいくかは以䞋のように説明されおいたした。 䞊蚘は脅嚁むンテリゞェンスをAWSのセキュリティサヌビスにどのように掻甚しおいるかを瀺すアヌキテクチャ図です。ただAWSは公開サヌビスで利甚しおいるこずが倚いず思うので、鮮床がむマむチな情報をそのたた投入するず過怜知が倚くなる懞念はありたす。 次は脅嚁むンテリゞェンスを利甚した脅嚁ハンティングずいったずころです。利甚する組織はこういった䜿い方が倚いのではないでしょうか これは脅嚁むンテリゞェンスをシェアする堎合です。 脅嚁むンテリゞェンスをAWSで掻甚しおいくヒントを埗たセッションで、ずおも参考になりたした。 おわりに 私自身、参加圓時はAWS初心者レベルでありビクビクしながら参加したre:Inforceでしたが、面癜く、孊びが倚いセッションばかりでいい経隓になりたした。 本カンファレンスの経隓を生かしお、瀟内でのセキュリティ匷化をより䞀局実斜しおいければず思いたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる仲間を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com ASD ↩
こんにちは、ブランド゜リュヌション開発本郚で WEAR by ZOZO のiOSアプリの開発を担圓しおいる新卒2幎目の山田 @gamegamega_329 です。 今幎もWWDCはオフラむンずオンラむンの同時開催ずなり、私は昚幎に匕き続き、2幎連続で珟地参加したした。昚幎の珟地レポヌトは䞋蚘の蚘事をご芧ください。 techblog.zozo.com 本蚘事では、珟地ならではのむベント内容や雰囲気などを䞭心に、可胜な範囲でご玹介したす。珟地参加の魅力や、実際に䜓隓した貎重な瞬間をお䌝えできればず思いたす。 WWDCずは スケゞュヌル Day 0 - 6月9日 Welcome Reception 今幎のノベルティ 受付を終えた埌 デベロッパヌずの亀流 Apple Design Awards Day 1 - 6月10日 Keynote Platforms State of the Union Discover Apple Park In-person Labs 提䟛されたご飯たち Day 2 - 6月11日 Evening Session Appleスタッフ&デベロッパヌずの亀流 その他 珟地での過ごしやすさ 日本の開発者たちずの亀流 珟地参加するなら甚意・準備しおおくず良いこず 最埌に 「WWDC24 報告䌚 at LINEダフヌ, ZOZO」を開催したす WWDCずは WWDCWorldwide Developers Conferenceは、Appleが毎幎開催しおいる開発者向けの重芁なカンファレンスです。このむベントでは、OSのアップデヌトや新しい開発ツヌルが発衚され、開発者にずっお倧倉有益な情報が提䟛されたす。昚幎に匕き続き、今幎もオフラむンずオンラむンのハむブリッド圢匏で開催されたした。 スケゞュヌル 日付 時間Pacific Time コンテンツ 堎所 6/9 3:00 PM ・Early Check-in ・Design Award Infinite Loop 6/10 8:00 AM ・Check-in Apple Park Visitor Center 10:00 AM ・Keynote Apple Park 1:30 PM ・Platforms State of the Union Apple Park 2:00 PM ・Discover Apple Park Apple Park Inner Ring 2:00 PM ・In-person labs Apple Park CaffÚ Macs 6/11 6:00 PM ・Evening Session Developer Center Day 0 - 6月9日 Welcome Reception 今幎もむベントの前日にInfinite LoopでWelcome Receptionが開催されたした。 Infinite Loopの入口に立぀筆者 このむベントでは、事前にチェックむンができるため、翌日の入堎がスムヌズになりたす。さらに、早めにむベントの雰囲気を楜しめるだけでなく、ノベルティも䞀足先にゲットできたす。 Infinite Loop内にあったWWDC24のオブゞェ 今幎のノベルティ 今幎のノベルティはピンバッゞ、バッグ、氎筒、レゞャヌシヌトでした。これから日本は暑くなるので、これらはBBQなどで倧いに掻躍しそうです。さらに、Apple Vision Proのピンバッゞを手に入れられ感動したした。垰囜したらバッグに぀けようず思いたす。 WWDC24のノベルティはピンバッゞ、バッグ、氎筒、レゞャヌシヌトの4皮類 受付を終えた埌 軜食やドリンクを楜しみながら、参加者同士での䌚話を楜しみたした。提䟛された食べ物や飲み物は、唐揚げ・春巻き・アむスクリヌム・コヌラなど倚岐にわたり、食べ攟題なので時間いっぱい楜しめたす。ただし、次の日の胃もたれや顔のむくみには泚意が必芁です。 軜食コヌナヌ ドリンクステヌション 暑さを和らげおくれたアむスクリヌム デベロッパヌずの亀流 アメリカ・むンド・䞭囜・韓囜・ブラゞルなど、倚くの囜籍のデベロッパヌやデザむナヌず亀流したした。特に私は個人でリリヌスしたアプリの話で盛り䞊がり、ヘルスケアアプリや倧孊案内アプリ、ゞェスチャヌ認識アプリなど、様々なアプリに぀いお語り合いたした。 珟地で出䌚ったデベロッパヌずの蚘念写真 私が開発した「腹筋ロヌラヌアプリ」を玹介するず、倚くの人が「Amazing」ず称賛しおくれたした。この日に話した倚くの人が個人でアプリをリリヌスしおいお、熱い想いを共有できたのは忘れられない思い出になりたした。 Apple Design Awards Infinite Loopの食堂内には、 Apple Design Awards のトロフィヌが展瀺されおいお、このトロフィヌには受賞者の名前が刻たれおいたした。サンプル品を手に取るず、芋た目よりも重量感があったので驚きたした。Welcome Receptionが終わった埌、衚地者のみで衚地匏が行われるずのこずでした。 Apple Design Awardsの受賞者に莈られるトロフィヌのサンプル 気づけば7:00 pmを過ぎ、気枩が䞋がっお矜織ものがないず寒いくらいになっおいたした。こうしおDay 0が終了したした。 Day 1 - 6月10日 開堎は8:00 amからですが、最前列を確保するために6:30 amから䞊び始めたした。グルヌプ䌚瀟であるLINEダフヌの゚ンゞニアをはじめずする日本のデベロッパヌたちず䞀緒に䞊びたした。早朝なので少し肌寒く感じたした。 埅ち時間には、ポンデリングのようなモチモチのドヌナツや、銙り高いコヌヒヌが提䟛されたした。おいしいスナックを楜しみながら、開堎を心埅ちにする時間はずおも充実しおいたした。 開堎するたでの埅ち時間にはドヌナツやコヌヒヌが提䟛された 昚幎は最前列に座っおいたしたが、今幎は最前列から3列目たでがEnterprise垭ずしお確保されおいたため、私の垭はそのすぐ埌ろの4列目ずなりたした。実質的には最前列に近い垭で、安心したした。 昚幎ず異なり前から3列目たではEnterprise垭だったので4列目に着垭 垭を取った埌、Keynoteが始たるたでの間に甚意されおいた朝食を楜しみたした。WWDCに参加するず、朝から倜たで食事が提䟛されたす。どんな食事が提䟛されたのかに぀いおは、最埌にご玹介したす。 Keynoteが始たるたでの時間は呚りを散策しお過ごしたした。OpenAI瀟のCEOであるサム・アルトマン氏にも遭遇したした。この日の最高気枩は34床で、Keynoteが始たる盎前には日差しが匷くなったため、サングラスをかけお埅機しおいたした。 Keynote www.youtube.com CEOのティム・クック氏ずSenior Vice Presidentのクレむグ・フェデリギ氏が壇䞊に立ち、短い時間トヌクしたした。その埌、Keynote本線のビデオが䌚堎内のスクリヌンで再生されたした。 CEOのティム・クック氏ずSenior Vice Presidentのクレむグ・フェデリギ氏 今回の目玉は、発衚前から噂されおいたAI「Apple Intelligence」でした。 www.apple.com 発衚の瞬間、䌚堎は拍手喝采で倧いに盛り䞊がりたした。このAIは独自のモデルであり、ChatGPTずの連携も可胜ですが、単独でも機胜するのが特城です。その他にも、コントロヌルのカスタマむズやMath Notesなど、様々な新機胜に胞を躍らせたした。 䌚堎が沞いたApple Intelligenceの発衚 このアップデヌトによっお、アプリ内だけでなく、Apple Intelligenceや他のアプリずの連携を含めお、どのように自瀟サヌビスを掻甚しおもらうかを考える必芁があるず感じたした。 Platforms State of the Union www.youtube.com Keynoteに続くPlatforms State of the Unionは、匷い日差しを避けるために別の垭から芳たした。 Platforms State of the Unionは宀内で芖聎 私が特に泚目したのはXcodeの新機胜「Swift Assist」でした。この発衚でも倧きな歓声が䞊がり、䌚堎は倧いに盛り䞊がりたした。GitHub Copilotが発衚されお以来、iOS゚ンゞニアたちはこの機胜を埅ち望んでいたこずでしょう。 他にも、 Swift Testing や SwiftDataのアップデヌト など、デベロッパヌにずっお魅力的な発衚が倚く、非垞にワクワクする内容でした。 Discover Apple Park セッションが終わった埌には、Appleの゚ンゞニアやデザむナヌに盎接質問できるラボの時間や、Apple Park内を自由に散策できる時間がありたした。私はすぐにApple Parkを散策するこずにしたした。その魅力的な芋どころをいく぀か玹介したす。 たず、目を匕くのは巚倧な虹のオブゞェです。たるで倢の䞭にいるかのようなこの堎所で、私はゞャンプしお蚘念写真を撮りたした。 巚倧な虹のオブゞェの前でゞャンプしお蚘念撮圱 次に蚪れたのは、たるで本物のような人工池です。波の音が心地よく流れおいお、最初は本物の池だず勘違いしおしたいたした。波の音も実はスピヌカヌが巧劙に配眮されおいお、そこから音が流れおいるずのこずでしたが、スピヌカヌの堎所は党く芋぀けられたせんでした。 本物の池だず勘違いした人工池 さらに、この探玢䞭にバナナチョコレヌト味のアむスクリヌムを配っおいお、思わず手に取っおしたいたした。暑い日にはぎったりのご耒矎でした。 たた、Download Stationでは、有線接続で最新のXcodeを高速ダりンロヌドできたした。開発者にずっおは嬉しい限りです。早速、私も最新のXcodeをその堎でむンストヌルしたした。 高速な回線が甚意されおいたDownload Station In-person Labs 散策を終えた埌は、Appleの瀟員に質問できる時間を存分に楜しみたした。 CaffÚ Macsでは、各゚リアに担圓者が配眮されおおり、その分野のスペシャリストに盎接質問できたす。オレンゞ゚リアは3階、玫゚リアは倖で行われおいたした。 In-person Labsの配眮図 スタッフの圹割は着おいるTシャツの色で分かりたす。詳现な技術に詳しい担圓者や、広範囲にわたっおメンバヌの圹割を把握しおいる案内スタッフなどがいたした。 Tシャツの色分けでスタッフの圹割がわかりやすくなっおいた 私は、セッションビデオで興味を持ったApple Intelligence、SwiftUI、Xcodeに関連する質問を投げかけたした。特に、どのような仕組みで動䜜しおいるのかや、開発チヌムの芏暡に぀いお詳しく聞きたした。 たた、予玄制のDesign Labもあり、自分のアプリをデザむナヌに芋せお盎接フィヌドバックや感想をもらえたす。现かなニュアンスなどの説明が難しかったので、翻蚳アプリを䜿っおやりずりしたしたが、スタッフは快く察応しおくれたした。 私は、自分が担圓しおいるリニュヌアルしたWEARアプリを芋せおフィヌドバックを受けたした。良い点や改善点、党䜓的な所感に぀いお話し合いたした。デザむナヌによっおは、絵を描いお提案しおくれるこずもあり、ワむダヌフレヌムが印刷された甚玙を持っおいるデザむナヌもいたした。 提䟛されたご飯たち 朝食には、クロワッサンやパむのような食感の゚ンパナヌダ、フルヌツの盛り合わせ、オヌバヌナむトオヌツなど、普段食べるこずの倚くない珍しいメニュヌが䞊びたした。 朝食 昌食はたくさんメニュヌがありたしたが、その䞭でも、グリルチキン&キノアサラダ、ティラミスを遞びたした。 昌食 昌食ず同様、倕食も倚くのメニュヌがありたした。その䞭でも、私はクリスピヌチキンワッフル、フルヌツタルトずチョコレヌトキャラメルバヌ、プラリネクリヌムのシュヌクリヌムを遞びたした。 倕食 食事の時間以倖でもスナックやドリンクが配られおいたした。 豊富に甚意されおいたドリンク おや぀のドラむフルヌツ Day 2 - 6月11日 この日は予玄制のセッションに参加したした。セッションは「Morning」「Afternoon」「Evening」の3぀の時間垯から遞べたす。ただし、予玄数に限りがあるため、早めに奜きな時間垯を遞ぶ必芁がありたす。私は「Evening」のセッションのみ予玄できたした。 Evening Session 䌚堎はDeveloper Centerで、生のプレれンテヌションを䜓隓できる貎重な機䌚でした。プレれンテヌションはずおもカッコよく、迫力満点で、い぀か自分もこんな発衚ができるようになりたいず感銘を受けたした。 参加したEvening Sessionの様子 ラむブコヌディングやデモなど、予玄制ならではの特別な内容が盛りだくさんで、参加した甲斐がありたした。 Appleスタッフ&デベロッパヌずの亀流 セッションが終わった埌は、軜食を楜しみながら、セッションのプレれンタヌやAppleのデベロッパヌ、さらには各囜のデベロッパヌたちず亀流したした。 Evening Session埌の亀流䌚で提䟛されおいた軜食 この時間をフル掻甚しお、初日のIn-person Labsで聞き逃しおしたった質問や、セッションを通じお気になったこずを、セッションのプレれンタヌやAppleのデベロッパヌに盎接聞きたした。それだけでなく、ブラゞルの孊生ずも仲良くなり、セッションの感想を語り合ったり、雑談を楜しんだりしたした。 その他 珟地での過ごしやすさ WWDC24の䌚期䞭は党お快晎に恵たれたしたが、䞀日の寒暖差が激しいものでした。日䞭は暑く、気枩は28〜31床に達したしたが、倜18時頃から急激に冷え蟌み、20床前埌たで䞋がりたした。日䞭の服装ずしおはTシャツず長ズボンが適しおいたしたが、倜間の急な冷え蟌みに察応するため、矜織ものを持参するべきでした。 日本の開発者たちずの亀流 iOS界隈で著名な方々が倚く参加しおいる印象を受けたした。䌚うたびに情報亀換するこずが倚く、有益な時間を過ごせたした。たた、 Swift Student Challenge の参加者ずも亀流する機䌚があり、地域掻性化のアプリを開発しおいる方ずお互いのアプリを玹介し合う堎面もありたした。さらに、日本のApple゚バンゞェリストの方が芪切に案内しおくれたので、非垞に助かりたした。 珟地参加するなら甚意・準備しおおくず良いこず 日本コミュニティに参加しお、事前に情報収集しおおくこず䟋try! SwiftのDiscord 日差しが匷いので、日焌け止めやサングラスを持っおいくこず私は珟地のゎルフショップでサングラスを賌入したした 基本的に珟金を持たずにクレゞットカヌドで支払いできるが、玛倱や盗難の察策を講じおおくずなお良い 自瀟サヌビスや個人で開発しおいるアプリがあれば、アピヌルできる資料やノベルティなどを準備するず良い 英語が䞍慣れな堎合でも、1か月間英䌚話の孊習を頑匵れば、翻蚳アプリを掻甚しながら通甚するレベルになる ただし、ラボなどでの技術的な䌚話は難しいので、事前準備は必須 最埌に 今回、ZOZOからは私䞀人が参加し、2幎連続でのWWDC珟地参加ずなりたした。昚幎にはなかった芁玠や新たな発芋、孊びが倚く、ずおも充実した日々を過ごせたした。 決しお英語が埗意ずは蚀えない私でも、Appleスタッフ、日本の゚ンゞニア、そしお気さくに話しかけおくれた倚囜籍のデベロッパヌたちのサポヌトのおかげで、WWDCを存分に楜しめたした。Appleコミュニティの玠晎らしさを改めお実感したした。 次回以降のWWDCで珟地参加するこずになった方々にずっお、この蚘事が少しでもお圹に立おば幞いです。 「WWDC24 報告䌚 at LINEダフヌ, ZOZO」を開催したす 6月26日氎に、WWDCに参加したLINEダフヌずZOZOの゚ンゞニアが、それぞれが興味のある分野に぀いお、新しく発衚された技術や埗た知芋、情報などを共有する「WWDC24 報告䌚」を開催したす。昚幎に続き私も登壇予定です。ご興味のある方はぜひご参加ください。 lycorptech-jp.connpass.com ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる仲間を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 hrmos.co corp.zozo.com
こんにちは。怜玢基盀郚の橘です。ZOZOTOWNでは、商品怜玢゚ンゞンずしおElasticsearchを利甚し、倧芏暡なデヌタに察しお高速な党文怜玢を実珟しおいたす。 Elasticsearchに関する取り組みは以䞋の蚘事をご芧ください。 techblog.zozo.com 怜玢基盀郚では、ZOZOTOWNの怜玢結果の品質向䞊を目指し、新しい怜玢手法の導入を怜蚎しおいたす。本蚘事ではベクトル怜玢ず呌ばれる怜玢手法に関しお埗た知芋を玹介したす。 ※本蚘事はElasticsearchバヌゞョン8.9に関する内容ずなっおいたす。 目次 目次 ベクトル怜玢ずは ベクトル怜玢に期埅するこず Elasticsearchを䜿甚したベクトル怜玢の導入 導入の簡略化 デプロむ可胜な埋め蟌みモデル ベクトル怜玢のク゚リ ハむブリッド怜玢ずは Elasticsearchを甚いたハむブリッド怜玢 RRF(Reciprocal rank fusion)を䜿うパタヌン rescoreを䜿うパタヌン ベクトル怜玢の定性評䟡 ベクトル怜玢の導入に䌎う課題 類䌌床の閟倀蚭定 モデルの埋め蟌み粟床の問題 ク゚リごずの類䌌床のばら぀き モデルの倉化による類䌌床の分垃の倉化 たずめ おわりに ベクトル怜玢ずは ベクトル怜玢ずは、デヌタを高次元のベクトル空間にマッピングし、類䌌性に基づいお情報を怜玢する技術です。 䞀般的なベクトル怜玢の方法は、ナヌザヌの怜玢ク゚リをベクトル化し、同じベクトル空間にマッピングされた商品デヌタずの類䌌床を蚈算したす。類䌌床が高い商品から順に怜玢結果ずしおナヌザヌに衚瀺したす。 䞋図においお商品Aは商品Bより怜玢ク゚リずの角床が小さく、類䌌床が高いため、怜玢結果では商品Aの方が䞊䜍に衚瀺されたす。 怜玢ク゚リや商品デヌタのベクトル化には埋め蟌みEmbeddingモデルを利甚する方法が䞀般的です。 CLIP などのマルチモヌダルモデルを䜿うこずで文字列デヌタに加え画像デヌタも同じ空間にベクトル化できたす。 ベクトル怜玢に期埅するこず ベクトル怜玢で特に期埅できる点は、曖昧なク゚リに察しおより良い結果を出力できるこずです。 䟋えば、ZOZOTOWNでは次のような曖昧な怜玢ク゚リが芋られたす。 ベビヌ甚品 きれいめワンピヌス フォヌマルなスヌツ 䟋えば「ベビヌ甚品」ずいう怜玢ク゚リの堎合、「甚品」ずいう単語は広い意味を持ちたす。党文怜玢では「甚品」ずいう文字が商品情報ず完党に䞀臎する必芁があるため、怜玢結果が限定されたす。 䞀方、ベクトル怜玢では「ベビヌ甚品」ずいう怜玢ク゚リで次のような商品を怜玢できたす。 ベビヌ服 ベビヌ甚おもちゃ ベビヌカヌ その他ベクトル怜玢に期埅できる点は以䞋です。 テキスト以倖のデヌタでの怜玢画像などのデヌタも怜玢に利甚可胜 衚蚘揺れク゚リに察しお堅牢怜玢ク゚リ「バック」で「バッグ」を怜玢可胜 倚蚀語ぞの察応怜玢ク゚リ「Tshirt」で「Tシャツ」を怜玢可胜 Elasticsearchを䜿甚したベクトル怜玢の導入 Elasticsearchは䞊述のベクトル怜玢をサポヌトしおおり、Elasticsearchでのベクトル怜玢導入には次のメリットがありたす。 スケヌラビリティElasticsearchは分散アヌキテクチャを採甚しおおり、倧芏暡なデヌタに察しおも効率的にスケヌルアップできたす。 高速な怜玢性胜ベクトル怜玢を含む倧量のデヌタに察する耇雑な怜玢を高速で凊理できたす。特にZOZOTOWNのように怜玢察象の商品数が倚い堎合の䜿甚に適しおいたす。Elasticsearch8.0以降では HSNW をベヌスずした近傍怜玢による高速な怜玢が可胜です。 統合された怜玢環境Elasticsearchは党文怜玢ずベクトル怜玢の䞡方をサポヌトしおいたす。党文怜玢ずベクトル怜玢の組み合わせで怜玢粟床の向䞊が期埅できたす。 導入の簡略化埋め蟌みモデルをElasticsearchにデプロむし、ベクトル怜玢導入を簡略化できたす。 導入の簡略化 ベクトル怜玢を実珟するためには怜玢ク゚リず商品デヌタを埋め蟌みモデルによりベクトル化する必芁がありたす。これらのベクトル化凊理のためのバッチやAPIの開発は、ベクトル怜玢導入の際のハヌドルずなりたす。 Elasticsearchでは、埋め蟌みモデルをElasticsearchにデプロむする方法が甚意されおおり、これによりベクトル怜玢の導入を簡略化できたす。 詳しい導入手順は以䞋の蚘事をご芧ください。 Elasticsearchで日本語NLPモデルを利甚しおセマンティック怜玢を実珟する | Elastic Blog 簡単な手順ずしおは次の通りです。 Elasticが提䟛するPythonのElasticsearchクラむアントラむブラリ eland を䜿甚しお、 Hugging Face 䞊のモデルをアップロヌドしデプロむ むンゞェストパむプラむン を䜜成し、 掚論プロセッサヌ でフィヌルドのデヌタをベクトル化しむンデックスを䜜成 knnク゚リ埌述の query_vector_builder オプションを䜿うこずで怜玢ク゚リをベクトルに倉換し、類䌌床の高い順の怜玢結果のレスポンスを取埗 このように、埋め蟌みモデルをElasticsearchにデプロむするこずで、ベクトル化凊理のためのバッチやAPIの開発を省略しおベクトル怜玢を導入できたす。 デプロむ可胜な埋め蟌みモデル ベクトル怜玢に䜿うモデルはHugging Faceに登録しおあるモデルの䞭から Feature Extraction のタスクに察応しおいるモデルを遞ぶ必芁がありたす。䟋えば、 multilingual-e5-large が該圓したす。 Hugging Face䞊にある事前孊習枈みモデルをファむンチュヌニングしたモデルも䜿甚できたす。その堎合、ファむンチュヌニングしたモデルをHugging Face䞊のリポゞトリにアップロヌドし、elandを䜿っおElasticsearchにアップロヌドしたす。 ベクトル怜玢のク゚リ knnク゚リ を䜿うこずにより、Elasticsearchでベクトル怜玢できたす。 ク゚リ䟋は以䞋の通りです。 { " knn ": { " field ": " text_embedding.predicted_value ", " query_vector_builder ": { " text_embedding ": { " model_id ": " cl-tohoku__bert-base-japanese-v2 ", " model_text ": " shoes " } } , " k ": 10 , " num_candidates ": 100 , " similarity ": 0.8 , " boost ": 1 , " filter ": { フィルタリング条件を蚘茉 } } } knnク゚リのパラメヌタは次の通りです。 パラメヌタ名 説明 field 怜玢察象のフィヌルド query_vector_builder ベクトル化に䜿うモデルidずベクトル化するテキスト k 結果出力数 num_candidates 各シャヌドから抜出する候補数 similarity 類䌌床の䞋限閟倀 boost 類䌌床スコアに掛ける重み filter フィルタリング条件 ハむブリッド怜玢ずは 䞊蚘でベクトル怜玢の利点を玹介したしたが、党文怜玢にもいく぀か利点がありたす。 実装や導入が比范的容易 倧芏暡な情報に察しお高速な怜玢が可胜 怜玢ク゚リずドキュメントのマッチ方法が明確で、結果の解釈が容易 党文怜玢ずベクトル怜玢はそれぞれ利点が異なりたす。䞡方を組み合わせるこずで、それぞれの利点をうたく掻かし、より高い怜玢粟床を期埅できたす。党文怜玢ずベクトル怜玢を組み合わせる怜玢手法は「ハむブリッド怜玢」ず呌ばれたす。 Elasticsearchにはハむブリッド怜玢を実珟する機胜が甚意されおいたす。 Elasticsearchを甚いたハむブリッド怜玢 ここではElasticsearchを䜿ったハむプリッド怜玢のパタヌンをいく぀か玹介したす。 RRF(Reciprocal rank fusion)を䜿うパタヌン RRF は異なる怜玢結果のランキングを統合し、ランキングを生成するアルゎリズムです。 RRFは以䞋の数匏で衚されたす。 パラメヌタ名 説明 統合するランキングの数 ドキュメントのランキング順䜍 調敎定数 ランキング察象ずなるドキュメントの集合 RRFを利甚し、党文怜玢のランキングずベクトル怜玢のランキングを統合するク゚リ䟋は以䞋の通りです。ベクトル怜玢ず党文怜玢のランキングスコアのスケヌルは異なりたすが、RRFを䜿うこずでスコアのスケヌルを合わせる必芁なくランキングを統合できたす。 { " size ": 10 , " query ": { " term ": { " text ": " shoes " } } , " knn ": { " field ": " text_embedding.predicted_value ", " k ": 10 , " num_candidates ": 100 , " query_vector_builder ": { " text_embedding ": { " model_id ": " cl-tohoku__bert-base-japanese-v2 ", " model_text ": " shoes " } } } , " rank ": { " rrf ": { " window_size ": 10 , " rank_constant ": 1 } } } 䞊蚘のク゚リでは、たずshoesずいう甚語に䞀臎するドキュメントを党文怜玢で取埗し、次に同じshoesを基にベクトル怜玢で最も近いドキュメント䞊䜍10件を取埗したす。その埌、党文怜玢ずベクトル怜玢の結果を統合し、RRFを適甚しお最終的なランキングを生成しおいたす。 RRFク゚リのパラメヌタは次の通りです。 パラメヌタ名 説明 window_size 各ランキングにおいおRRFアルゎリズムを適甚する䞊䜍Nä»¶ rank_constant 各ランキング内のドキュメントが最終的なランキングにどれだけ圱響を䞎えるかを決定する調敎定数倀が高いほど、䜎ランクのドキュメントがより倧きな圱響を䞎える rescoreを䜿うパタヌン rescore ク゚リによっお党文怜玢ずベクトル怜玢の結果をリランキングし統合できたす。 rescoreを利甚し、党文怜玢のランキングずベクトル怜玢のランキングを統合するク゚リ䟋は以䞋の通りです。 { " size ": 10 , " query ": { " term ": { " text ": " shoes " } } , " knn ": { " field ": " text_embedding.predicted_value ", " k ": 10 , " num_candidates ": 100 , " query_vector_builder ": { " text_embedding ": { " model_id ": " cl-tohoku__bert-base-japanese-v2 ", " model_text ": " shoes " } , " boost ": 0.0001 } } , " rescore ": [ { " window_size ": 10 , " query ": { " rescore_query ": { リスコアのロゞックを蚘茉 } , " query_weight ": 0 , " rescore_query_weight ": 1.0 , " score_mode ": " total " } } ] } 䞊蚘のク゚リでは、党文怜玢の結果ずベクトル怜玢の結果を組み合わせおリスコアを行い、最終的に䞊䜍10件の結果を取埗しおいたす。たた、knnク゚リのboostの倀を䜎く蚭定するこずで、党文怜玢の結果が優先しおリスコアされるようにしおいたす。 ク゚リ内でRRFずrescoreク゚リは䜵甚できないので泚意が必芁です。 ベクトル怜玢の定性評䟡 瀟内で党文怜玢の結果ずベクトル怜玢の結果をオフラむン定性評䟡したした。定性評䟡では、被隓者がいく぀かの評䟡甚ク゚リに察する党文怜玢の結果ずベクトル怜玢の結果を芋比べお、どちらの怜玢結果が良いかを評䟡したす。 ZOZOTOWNで実斜しおいる定性評䟡の詳现は以䞋の蚘事をご芧ください。 techblog.zozo.com 以䞋は、オフラむン定性評䟡でベクトル怜玢が良い結果を出したク゚リず悪い結果を出したク゚リの䟋です。 ベクトル怜玢が良い結果ずなったク゚リ ベクトル怜玢が悪い結果ずなったク゚リ ペット甚品 きれいめドレス 小さめリュック スポヌツりェアヌ いちご柄 卒業匏 女の子 小孊生 フォヌマル ブランド名党般 キャラクタヌ名党般 これらのク゚リず怜玢結果を考察し、ベクトル怜玢が適甚可胜だった語ず適甚困難だった語は次の通りでした。 ベクトル怜玢が適甚可胜だった語 説明 曖昧な語 「甚品」「きれいめ」など曖昧なク゚リに察しおは近い意味の商品を怜玢可胜 倚蚀語 「小さめ」のク゚リに察しお「small」ずいう語を含んだ商品を怜玢可胜 衚蚘揺れ 「りェアヌ」のク゚リに察しお「り゚ア」「りェア」ずいう語を含んだ商品を怜玢可胜 ベクトル怜玢が適甚困難だった語 説明 明確な語 「いちご柄」のク゚リに察しおドット柄のような商品を誀っお怜玢 耇雑な語 「卒業匏 女の子 小孊生 フォヌマル」のような様々な意味を含む耇雑なク゚リに察しお「ネクタむ」を誀っお怜玢 ドメむン性が匷い語 ブランド名やキャラクタヌ名などドメむン性が匷いク゚リに察しお䌌たブランドやキャラクタヌの商品を怜玢するこずは䞍可胜 このようにベクトル怜玢が適甚可胜な語ず適甚困難な語を評䟡するこずで、どのような怜玢ク゚リに察しおベクトル怜玢が効果的かを理解できたした。 ベクトル怜玢の導入に䌎う課題 ベクトル怜玢の導入を怜蚎するにあたり、いく぀かの課題がありたした。代衚的な内容をいく぀か玹介したす。 類䌌床の閟倀蚭定 類䌌床の䜎い商品はク゚リずは無関係である可胜性がありたす。ク゚リずは無関係な商品が含たれるこずを防ぐために、適切な類䌌床の閟倀を蚭定する必芁がありたす。 この閟倀の蚭定方法はいく぀か考えられたすが、1぀の方法ずしおアノテヌションによる閟倀蚭定の方法が考えられたす。 以䞋はアノテヌションの䟋で、アノテヌション結果にはク゚リず商品の関連性がある堎合に正解、関連性がない堎合に䞍正解を付䞎したす。 ク゚リ 商品 類䌌床 アノテヌション結果 きれいめワンピヌス 商品A 0.94 正解 きれいめワンピヌス 商品B 0.85 正解 きれいめワンピヌス 商品C 0.65 䞍正解 この結果を基に、適切な類䌌床を蚭定するこずが可胜になりたす。 モデルの埋め蟌み粟床の問題 以䞋の衚はある事前孊習枈みモデルを甚いお、怜玢ク゚リ「ダりン」ず商品名のcosine類䌌床を算出した結果です。 商品名 類䌌床 ダりンコヌト 0.67 例駄 0.64 ダりン ティペット 0.61 「ダりン」ず怜玢された際に、「ダりンコヌト」ず「ダりン ティペット」が怜玢結果に衚瀺されるのは適圓ですが、「䞋駄」が衚瀺されるこずは望たしくありたせん。この堎合、類䌌床の閟倀を0.65に蚭定し「ダりンコヌト」のみを怜玢結果に衚瀺するか、閟倀を䞋げお「䞋駄」を含めすべお怜玢結果に衚瀺するかの刀断が必芁です。 モデルの埋め蟌みに問題がある堎合、怜玢結果に意図しない商品が含たれおしたいたす。この問題を解決するには、モデルのファむンチュヌニングなどにより出力ベクトルを最適化する必芁がありたす。 ク゚リごずの類䌌床のばら぀き 以䞋の図は、いく぀かのク゚リに察しおcosine類䌌床が高いZOZOTOWNの商品TOP100を瀺しおいたす。 ク゚リごずにcosine類䌌床の分垃にばら぀きが芋られたす。䟋えば「スりェット」のク゚リに察しおcosine類䌌床の高いTop100の商品は党お類䌌床が0.91以䞊であるのに察し、「きれいめ」のク゚リに察しおはTop100商品すべお0.90以䞋になっおいたす。 この堎合、類䌌床の閟倀の蚭定が難しいです。䟋えばcosine類䌌床の閟倀を0.88にした堎合、「きれいめ」ずいうク゚リはベクトル怜玢で殆ど察応できないこずになりたす。cosine類䌌床の閟倀をより䜎く蚭定するず、無関係な商品が怜玢結果に含たれる可胜性が高くなりたす。 このように、ク゚リず商品によっおは類䌌床にばら぀きが発生し、類䌌床の閟倀を䞀意に決めるこずが難しくなるこずに泚意が必芁です。この閟倀を動的に倉える堎合は、サヌビス偎でク゚リに応じお倉曎する必芁がありたす。 モデルの倉化による類䌌床の分垃の倉化 利甚しおいるモデルのパラメヌタを倉曎するず、怜玢ク゚リず商品の類䌌床の分垃が倉わりたす。 次の図は、 e5-small モデルず universal-sentence-encoder モデルでcosine類䌌床が高いZOZOTOWN商品TOP100をプロットした図です。 モデルによっおcosine類䌌床の分垃が異なりたす。モデルの倉曎に応じお類䌌床の閟倀のパラメヌタを調敎する必芁がありたす。 よっお、モデルの倉曎に応じお類䌌床の閟倀のパラメヌタを調敎できるようにしおおく必芁がありたす。 たずめ 本蚘事ではベクトル怜玢の導入においお埗た知芋をご玹介したした。ベクトル怜玢の導入に関しおは本蚘事で取り䞊げた課題があり、珟状導入には至っおいたせんが、匕き続き怜蚎を重ねおいく予定です。 おわりに ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
こんにちは。MA郚の田島です。 匊瀟では開発ガむドラむンずいうものを甚いお、システムの品質を担保しおいたす。今回私がテックリヌドを務めおいるずいうこずもあり、バッチアプリケヌションを開発するためのガむドラむンを䜜成したした。本蚘事では「開発ガむドラむン」ず「バッチ開発ガむドラむン」を玹介したす。 バッチアプリケヌション開発に限定したTipsはたずたっおいるものが倚くないため参考にしおいただければず思いたす。 開発ガむドラむンに぀いおの玹介 冒頭でも玹介した通り匊瀟では、開発ガむドラむンずいうものを甚いおシステムの品質を担保しおいたす。バッチ開発ガむドラむンを玹介する前に、たず開発ガむドラむンを玹介したす。 開発ガむドラむンの皮類 開発ガむドラむンは珟圚、以䞋の皮類が存圚したす。 共通 Android iOS Frontend Backend Infra API Batch DB(Database) ML(Machine Learning) 各チヌムはこの開発ガむドラむンに沿うように、システムを構築・改修しおいたす。たた、新芏システムの構築や倧きめのシステムを改修するずきは、リリヌスフロヌが定められおおり、その過皋で開発ガむドラむンに沿っおいるかのチェックが行われたす。 ガむドラむンの遵守ルヌル ガむドラむンには項目ごずに以䞋のようなタグが付いおおり、タグによっおどの皋床ガむドラむンを遵守すべきかが倉わりたす。 タグ 遵守の必芁性 MUST / MUST NOT 必須 RECOMMENDED / NOT RECOMMENDED 掚奚 新芏ルヌルが策定された際、既存システムがガむドラむンに远埓するのは倚倧な工数が生じるこずもありたす。そのため、完党な遵守は新芏システムや新芏改修時にのみ適甚するようにしおいたす。ただし、既存システムにおいおもガむドラむンのルヌルを守るこずで品質の向䞊を図れるため、遵守するこずを掚奚しおいたす。 バッチ開発ガむドラむンの玹介 続いおは、本ブログのメむンテヌマであるバッチアプリケヌション開発に特化したバッチ開発ガむドラむンに぀いお玹介したす。 バッチ開発ガむドラむン䜜成の背景 今回、新たにバッチアプリケヌション開発のためのガむドラむンを䜜成したした。こちらはもずもず私が所属する郚眲である、MA郚がバッチアプリケヌションを倧量に開発・メンテナンスしおいたため郚眲向けに䜜ったものでした。しかし、内容はMA郚に限定せず汎甚的なものを䜜成したため、それを瀟内党䜓のガむドラむンずするこずになりたした。 バッチ開発ガむドラむン 以䞋がバッチ開発ガむドラむンです。実際のガむドラむンの内容をほがそのたた掲茉したした。ただし、瀟内向けの補足情報などが含たれおいるのでそれらは省略しおいたす。その代わりに、今回各項目においお「補足」ずいう項目を远加し具䜓䟋や補足情報を远加しおいたすので参考にしおいただければず思いたす。クラりドサヌビスの利甚が前提ずなっおいる項目もあるのでその点はご了承ください。 コヌドベヌス バッチの蚭定をアプリケヌションず同じリポゞトリで管理する(RECOMMENDED) バッチアプリケヌションでは以䞋を同じリポゞトリで管理するようにしおください。 項目 具䜓䟋 バッチアプリケヌション バッチ凊理を具䜓的に行うアプリケヌション(Shell/Python/Java/SQLなど) バッチ蚭定 各バッチのスケゞュヌリングや䟝存関係など 補足 このガむドラむンの前提ずしお、Backendガむドラむンにおいお以䞋が定められおいたす。 アプリケヌションの動䜜に必芁な「党お」のコヌドをGitHubで管理するMUST たた、このガむドラむンの意図は、バッチの蚭定ず動䜜するアプリケヌションを近くに眮くこずで、システム把握を容易にするこずです。RECOMMENDEDにしおいる理由は、䟋えばRailsアプリケヌションでバッチ専甚のAPIを甚意し、バッチアプリケヌションはそのAPIを叩くだけずいった構成にしたい需芁もあるず考えたからです。 基盀 䟝存関係があるバッチにはワヌクフロヌ゚ンゞンを利甚するRECOMMENDED バッチ同士の䟝存関係が耇雑な凊理にはワヌクフロヌ゚ンゞンを利甚しおください。 補足 以䞋にワヌクフロヌ゚ンゞンの䟋を掲茉したす。いずれも匊瀟で利甚実瞟のあるワヌクフロヌ゚ンゞンです。 ツヌル Apache Airflow ( Cloud Composer ) Digdag Argo Workflows Kubeflow Pipelines ( Vertex AI Pipelines ) AWS Step Functions GCP Workflows 凊理ごずにコンピュヌトリ゜ヌス(CPU/メモリ/ストレヌゞ)を遞択できる(RECOMMENDED) バッチ凊理毎にコンピュヌトリ゜ヌスを遞べるようなアヌキテクチャを利甚しおください。以䞋のようなワヌクフロヌ゚ンゞンでは、コンテナを利甚するこずでコンピュヌトリ゜ヌスを凊理ごずに遞択できる機構が存圚したす。 ツヌル 機構 Apache Airflow Kubernetes Executor / airflow-aws-executors Digdag ECS Command Executor / Kubernetes Command Executor Argo Workflows Core Concepts 参照 AZの障害発生時に別のAZにおバッチを実行出来る(MUST) AZの障害時に、別のAZにおバッチを実行出来るような構成にしおください。 ただし、バッチサヌバヌが倚重起動し、重耇しおバッチが実行されないように泚意しおください参照: 「バッチの2重起動を防ぐ」。 䟋えば、ゞョブキュヌ型のワヌクフロヌ゚ンゞンを利甚するず、別AZにゞョブワヌカヌを起動するこずでバッチ凊理の途䞭から再開が可胜ずなりたす※キュヌもMultiAZ構成になっおいる必芁あり。 補足 ここでは䟋ずしおAZの単䜍での障害を想定しおいたすが、芁件によっお「Region」「AZ」等の分離レベルを怜蚎しおください。 凊理ワヌカヌが自動スケヌルされる(RECOMMENDED) バッチ凊理を行うのに必芁なコンピュヌトむンスタンスが、必芁に応じお自動スケヌルするようなアヌキテクチャを利甚しおください。 ただし、過剰にワヌカヌがスケヌルされすぎおいないか、ワヌカヌ数に䞊限を蚭けるようにしおください。 氞続化ファむルは倖郚ストレヌゞに配眮する(RECOMMENDED) ログなどの氞続化するファむルはバッチサヌバヌではなく、倖郚ストレヌゞに氞続化しおください。 ツヌルによっおはデフォルトで倖郚ストレヌゞを利甚する蚭定があるのでそれを利甚するこずをおすすめしたす。 以䞋がストレヌゞの䟋です。 ストレヌゞ 察応ツヌル S3 Apache Airflow / Digdag / Argo Workflows GCS Apache Airflow / Digdag / Argo Workflows 補足 本ガむドラむンの意図ずしおは、バッチアプリケヌションが皌働するノヌドがリタむアしたずしおもログ自䜓は氞続化したいずいうこずです。そのため、ストレヌゞでなくずもAWSの CloudWatch やGCPの CloudLogging などでのログの氞続化も遞択肢の1぀ずなりたす。 ただし、それらLoggingサヌビスはストレヌゞサヌビスよりも比范的高䟡なため、Storageサヌビスにログを保存し、それらを容易に参照できる状態になっおいるのが良いず考えおいたす。 アプリケヌション蚭蚈 / SRE 自動リトラむをする(MUST) 特定の凊理がネットワヌクの䞀時的な問題などで倱敗するこずがあるため、凊理ごずに自動リトラむを行っおください。 リトラむはツヌル・ラむブラリに任せる(RECOMMENDED) バッチごずにリトラむを実装するこずはバグの原因になるため、ツヌルのリトラむ機構に任せるようにしおください。 ツヌルのリトラむ機構では足りない堎合は、ラむブラリを利甚しおください。 たた前提ずしお、バッチ凊理で利甚しおいるクラむアントラむブラリなどにリトラむ機構が含たれおいる堎合は適切に蚭定しおください。 以䞋がツヌルやラむブラリの䟋です。 ツヌル ツヌル 機構 Apache Airflow retry parameter Digdag _retry parameter Argo Workflows Retries Step Functions Retry GCP Workflows Retry steps ラむブラリ 蚀語 ラむブラリ Java failsafe など Python tenacity など Go retry-go など バッチの2重起動を防ぐ(MUST) 重耇起動されおはいけないバッチ凊理が倚重起動されないようにしおください。 䟋えば、2重起動を防ぐ仕組みがあるワヌクフロヌ゚ンゞンを䜿う、たたはバッチの先頭でLockを取るこずなどで実珟可胜です。 凊理を冪等にする(MUST) 凊理はリトラむを䜕床行っおも問題ないようにしおください。 補足 冪等性を考慮する堎面ずしお、デヌタの操䜜があげられたす。以前のテックブログで「BigQueryでのデヌタ远蚘凊理における冪等化の取り組み」を玹介しおいるので、そちらもご参照ください。 techblog.zozo.com 珟圚日時に䟝存する凊理を入れない(NOT RECOMMENDED) 䞊蚘「凊理を冪等にする」を達成するために、珟圚日時に䟝存する凊理を避けおください。 代わりに凊理開始時刻等で代替できないか怜蚎しおください。 たたリトラむ時にも冪等な凊理ずなるように、リトラむ時にリトラむ前の凊理開始時間を利甚したり、特定の時間を倖郚から泚入したり出来るようにしおください。 補足 実装の具䜓䟋ずしお、ワヌクフロヌ゚ンゞンを利甚しおいる堎合には、特定のワヌクフロヌの開始時間を取埗できたす。䟋えばDigdagでは以䞋のような「SessionTime」ずいうものが利甚できたす。これを利甚するこずで、リトラむが発生した堎合もリトラむ前、リトラむ埌で同様の時間を利甚した凊理がされたす。 docs.digdag.io ひず぀ひず぀の凊理を小さくする(RECOMMENDED) 凊理が倱敗した時のリトラむ時の埩旧時間を短くするため、ひず぀ひず぀の凊理を責任毎に分割しおください。 たた、各凊理を責任毎に小さくするこずで党䜓の芋通しが良くなりたす。 補足 䟋えば以䞋のようなク゚リでSELECT文に時間がかかる堎合、INSERTの凊理で倱敗するずたた時間のかかるSELECT文からやり盎す必芁が出おきたす。 INSERT INTO `project_id.dataset_id.destination_table` (count_result, timestamp ) SELECT COUNT (*) AS count_result, CURRENT_TIMESTAMP () AS timestamp FROM `project_id.dataset_id.source_table` WHERE last_purchase_date BETWEEN DATE_SUB( CURRENT_DATE (), INTERVAL 1 DAY) AND DATE_SUB( CURRENT_DATE (), INTERVAL 100 DAY); そこで凊理を以䞋のように別々にするこずで、2぀目の凊理だけをリトラむできたす。ただし、この堎合1぀目のSELECT結果を2぀目のク゚リに枡しおあげる必芁がありたす。 SELECT COUNT (*) AS count_result, CURRENT_TIMESTAMP () AS timestamp FROM `project_id.dataset_id.source_table` WHERE last_purchase_date BETWEEN DATE_SUB( CURRENT_DATE (), INTERVAL 1 DAY) AND DATE_SUB( CURRENT_DATE (), INTERVAL 100 DAY); INSERT INTO `project_id.dataset_id.destination_table` VALUES (${count_result}, ${ timestamp }) ワヌカヌを増やせば凊理性胜が線圢に䌞びるように実装する(RECOMMENDED) 倧量のデヌタ凊理など、デヌタ量が増えた堎合でも凊理ワヌカヌを増やすこずで凊理性胜が線圢に䌞びるように実装しおください。 䟋えばデヌタの凊理を分割し、䞊列化するこずで実珟ができたす。その時のチャンクサむズは埌から倉えられるようにしおください。 補足 䟋えば、以䞋のような毎秒1000件で合蚈1000件を配信するようなバッチを考えたす。 その埌配信量が倍に増え、2000件の配信が必芁になった堎合以䞋のようにワヌカヌを倍にするこずで凊理スピヌドは萜ずさずに倍の配信ができたす。ただし、ここではリク゚ストされる偎の負荷は気にしないものずしたす。 早い段階でValidationを行う(RECOMMENDED) 早い段階でデヌタのValidationをおこない、䞍正なデヌタが確認された堎合はバッチを萜ずしおください。 長時間のデヌタ凊理が完了した埌に䞍正デヌタにより凊理が倱敗するこずによる、凊理遅延を防ぐこずに繋がりたす。 凊理倱敗時に通知する(MUST) バッチ凊理が倱敗した堎合SlackやPagerDutyで気付けるようにしおください。 補足 匊瀟ではSlackやPagerDutyを利甚しおいたすが、それぞれの利甚ツヌルに合わせお通知先は倉曎しおください。以䞋のようなツヌルでは通知の仕組みやプラグむンが甚意されおいたす。 ツヌル 機構 Apache Airflow slack / pagerduty Digdag slack / その他参考 凊理時間のSLAを蚭ける(MUST) バッチ凊理時間にSLAを蚭け、SLAを超えた堎合はSlackやPagerDutyなどで気付けるようにしおください。 SLAの蚭定は、「凊理時間」たたは「特定の日時」のどちらでも問題ありたせん。 補足 以䞋のようなツヌルではSLAの仕組みが甚意されおいたす。 ツヌル 機構 Apache Airflow Timeouts Digdag sla Argo Workflows timeouts Step Functions TimeoutSeconds バッチ凊理が適切に動䜜を開始しおいるかを監芖する(MUST) 定期実行バッチが適切に開始されおいるかを監芖し、開始されおいない堎合は気付けるようにしおください。 凊理ワヌカヌ数やワヌカヌプロセスの監芖を行ったり、プロセスやログが定期的に動いおいるかを監芖したりするこずで実珟可胜です。 䟋えば、正垞にバッチ凊理が開始しないケヌスずしおは以䞋が考えられたす。 アプリケヌション自䜓の蚭定は正しいが、バッチ凊理を実行するためのむンスタンスが0台になっおいる アプリケヌション自䜓の蚭定は正しく、バッチ凊理を実行するためのむンスタンスも起動しおいるが、スケゞュヌラなどのプロセスが起動しおいない 䟝存関係を把握する(MUST) 各バッチが他の「どのような凊理に䟝存しおいるのか」・「どのような凊理に䟝存されおいるのか」を把握しおください。 たた、特定のバッチに異垞があった堎合に、䟝存関係のあるバッチを止めるなどの察応方針を事前に怜蚎しおください。 䟝存凊理がある堎合は埅ち合わせ凊理を実装する(MUST) バッチが他の凊理に䟝存しおいる堎合は、時間で埅ち合わせをするのではなく確実に䟝存凊理が完了したこずを確認したうえでバッチ凊理を実行するようにしおください。 実行タむミングがい぀でもいいものは平日の日䞭に実斜する(RECOMMENDED) 実行タむミングがい぀でもいい凊理に関しおは、察応者が察応しやすい時間垯である平日の日䞭に行っおください。 月1回など実行頻床の少ないバッチは極力避け、原則デむリヌ実行にする(RECOMMENDED) 月1回だけ実行されるような実行頻床の短いバッチは、デむリヌ実行でも問題無いようにしお原則1日1回以䞊動かすようにしおください。 バッチを修正等しおから初回起動たでに時間が空かないため、問題の発芋・修正を玠早くできたす。 ただし、毎日実行だず料金的なコストが倧幅に䞊がるなどあればその限りではありたせん。 デヌタの曎新や配信等の副䜜甚のあるバッチはDRY RUNを行う(RECOMMENDED) デヌタの曎新や配信等の副䜜甚のあるバッチはDRY RUNを行い事前に動䜜が問題ないこず、凊理内容が問題ないこずを確認しおください。 新芏開発・修正をした盎埌のバッチ実行時には立ち䌚っお実行ログや動䜜結果を確認する(MUST) バッチの修正を行った盎埌の初回起動時は、実行時間に立ち䌚っおログや動䜜結果を確認しおください。 ガむドラむン導入の効果ず改善点 以䞊バッチ開発ガむドラむンを玹介したした。今回バッチ開発ガむドラむンを新芏に䜜成したず玹介したしたが、実際にはガむドラむンを䜜成しおから2幎ほどが経ちたした。ガむドラむン䜜成の結果MA郚では、ガむドラむンに曞いおある項目に぀いお気を付けお実装ができるようになったず感じおいたす。 特に冪等性の担保ずいう郚分においおは、ガむドラむン䜜成前に比べお泚意しお実装ができるようになったず感じおいたす。そのお陰でシステムのリトラむを気軜か぀安党にできるようになりたした。 ただし、油断しおいるずガむドラむンに沿っおいない実装がただただ意図せずに入っおしたっおいるこずがありたす。ガむドラむンの項目も倚いので党PRですべおのチェックを1個1個行うのには時間がかかりたす。そのため、メンバヌそれぞれがガむドラむンの内容を圓たり前にできるようになるこずが倧事だなず感じおいたす。 たずめ 本ブログでは、開発ガむドラむン䞊びにバッチ開発ガむドラむンを玹介したした。バッチ開発ガむドラむンに぀いおは私達が利甚しおいるガむドラむンをほがそのたた玹介したした。ぜひ利甚しお頂いお、バッチアプリケヌションの品質向䞊に圹立おおいただければ幞いです。 終わりに ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに 技術評論瀟様より発刊されおいる Software Design の2024幎5月号より「レガシヌシステム攻略のプロセス」ず題した党8回の連茉が始たりたした。 本連茉では、ZOZOTOWNリプレむスプロゞェクトに぀いお玹介したす。2017幎に始たったリプレむスプロゞェクトにおいお、ZOZO がどのような意図で、どのように取り組んできたのか、読者のみなさんに有益な情報をお䌝えしおいければず思いたすので、ご期埅ください。第1回目のテヌマは、「ZOZOTOWNリプレむスプロゞェクトの党䜓アヌキテクチャず組織蚭蚈」です。 目次 はじめに 目次 ZOZOTOWNリプレむスの背景、目的 背景 目的 柔軟なシステム 開発生産性 技術のモダン化 採甚匷化 ZOZOTOWNリプレむスの歎史ずアヌキテクチャの倉遷 アヌキテクチャの倉遷 2004幎〜2017幎オンプレミスリプレむス前 2017幎〜2020幎モノリスリプレむス 2020幎〜マむクロサヌビス化 技術スタックの遞定 組織蚭蚈 プロゞェクトチヌムの構成ず倉遷 マむクロサヌビス分割ず組織 「開発」の偎面 「運甚」の偎面 「組織」の偎面 コミュニケヌションず意思決定 理解を埗る リリヌスフロヌ ADRArchitecture Decision Record ロヌドマップ おわりに ZOZOTOWNリプレむスの背景、目的 背景 ZOZOTOWNは、2004幎12月にサヌビスを開始しお以降、基本的なアヌキテクチャは倉えずに成長しおきたした。数幎に䞀床のペヌスでサむトリニュヌアルも行っおきたしたが、UI/UXを䞭心ずしたリニュヌアルでした。 ZOZOTOWNのサむトデザむン倉遷 右肩䞊がりの成長を続けおいたものの、2017幎圓時、䞭長期目暙ずしお蚭定しおいた商品取扱高5,000億円にシステム党䜓が耐えられないこずが予芋され、リプレむスプロゞェクトの怜蚎が始たりたした。 目的 リプレむスプロゞェクトは、「ZOZOTOWNを䜿っおいただいおいるお客様にい぀でも快適に買い物をしおいただけるサヌビスを提䟛するため」、そしお、「ZOZOTOWNの成長のため」に行いたす。この目的を達成するために、リプレむスを通しお、改善しおいきたいこずを敎理しおいき、目的を達成するためのポむントを倧きく4぀定矩したした。 柔軟なシステム リプレむス以前、オンプレミスのみで皌働しおいたZOZOTOWNは、新春セヌルなどの高負荷むベント時におけるサヌバ増匷には苊劎しおきたした。むベントに合わせお事前にサヌバの必芁台数を芋積もり、賌入し、セットアップする必芁がありたした。たた、凊理コストが重いコンテンツをカットするなど、むンフラだけではなくアプリケヌションずしおも䜜業が発生しおいたした。 そこで、むンフラ基盀をオンプレミスからクラりドぞ移行するこずで、必芁なずきに柔軟に増匷できるシステムにしたいず考えたした。 開発生産性 事業展開における機胜開発に加え、開発者芖点でのUI/UX改善や、゜ヌスコヌドのリファクタリングなどやりたいこずがたくさんありたす。しかし、モノリスアヌキテクチャで開発されおきたZOZOTOWNでは、開発者数が増加するに぀れおデプロむ䜜業が衝突しお順番埅ちが発生するなど、開発生産性に悪圱響が発生し始めおいたした。 そこで、マむクロサヌビス化するこずで開発に関わるチヌムが䞊行で開発できるようにし、開発生産性を高めたいず考えたした。䜵せお、IaCInfrastructure as Codeや CI/CDContinuous Integration / Continuous Deliveryを導入するこずで、デプロむ自動化による開発生産性の向䞊もねらいたした。 技術のモダン化 ZOZOTOWNはVBScriptで動いおいたす。開発元であるMicrosoft瀟もVBScriptの積極的な機胜開発は珟圚行っおおらず、このたたでは皌働させる環境もなくなり、事業が停止するリスクがありたす。経営リスクを回避するためにも、技術のモダン化は必須で、リプレむスプロゞェクトは避けられないず考えたした。 たた、レガシヌ蚀語であるがゆえに、AWS、Google Cloud、DatadogずいったクラりドベンダヌがSDKを提䟛しおおらず、利甚を諊めるか、ラむブラリを独自実装しなければならない状況でした。さらに、VBScript向けに協力䌚瀟内補のWebフレヌムワヌクを䜿甚しおいお、そのフレヌムワヌクの動きを新メンバヌは理解しなければならない状況でした。JavaやGo蚀語のようなクラりドベンダヌが暙準的にサポヌトしおいるプログラミング蚀語や、珟代的なフレヌムワヌクに眮き換えおいくこずで、そのような郚分の実装コスト、孊習コストを枛らしたいず考えたした。 採甚匷化 リプレむスプロゞェクト、ひいおは事業開発を加速するために採甚匷化が必芁でした。リプレむスプロゞェクトは、゚ンゞニアずしおの成長に぀ながる経隓ができるものだず思っおいたす。知芋をテックブログやむベント登壇で瀟倖に向けお発信するこずにより、ZOZOに興味を持っおいただき、採甚を匷化したいず考えたした。 ZOZOTOWNリプレむスの歎史ずアヌキテクチャの倉遷 アヌキテクチャの倉遷 2004幎〜2017幎オンプレミスリプレむス前 Webサヌバ、DBサヌバなどはすべおオンプレミスで運甚しおいたした。基本的な技術スタックはWindowsのIISInternet InformationServicesで、Classic ASPVBScriptを動かしおいたした。デヌタベヌスにはSQL Serverを利甚しおいたした。䞻なビゞネスロゞックはSQL Serverのストアドプロシヌゞャで蚘述しおおり、WebサヌバはHTML/JSONを生成するビュヌレむダヌずしお利甚しおいたした。 リプレむス前のアヌキテクチャ このアヌキテクチャは2004幎圓時、Microsoft補品でシステムを構築する際のベストプラクティスずされおいたものでした。ネットワヌクの现い圓時はデヌタの近くで凊理するストアドプロシヌゞャのほうが高速で、ロゞックを DB サヌバに寄せるこずで DRYDon't Repeat Yourselfに曞ける利点がありたした。このアヌキテクチャでZOZOTOWNは売り䞊げを䌞ばしおきたこずからも、圓時の技術遞定ずしお成功したず蚀えるでしょう。 䞀方で、さたざたな困りごずも出おきおいたした。䞻なビゞネスロゞックはストアドプロシヌゞャずしおDBサヌバで実行されるため、DBのCPUを消費しおしたいたす。CPUを増やすにはDBを増やす必芁があり、負荷分散させづらい状況にありたした。DBサヌバのスケヌルアップでは限界が芋え、DBを垂盎分割し察凊しおきたしたが、それでも限界が芋えおきたした。たた、ストアドプロシヌゞャのナニットテストフレヌムワヌクが なく、TDDTest Driven Developmentなど昚今では圓たり前ずされおいる開発プラクティスを導入できないこずも困りごずでした。 2017幎〜2020幎モノリスリプレむス そこでストアドプロシヌゞャからの脱华を目暙の䞭心に据えお、モノリスtoモノリスアヌキテクチャでのリプレむスプロゞェクトが始動したした。フェヌズを「参照系商品、怜玢」「準曎新系お気に入りログなど」「曎新系カヌト、泚文、䌚員」の3぀に分解し、フェヌズ1ずしお参照系機胜のリプレむスプロゞェクトが進行したした。 1 ビゞネスロゞックを凊理するのに、DBサヌバのCPUではなくWebサヌバのCPUを䜿うアヌキテクチャに倉曎できれば、Webサヌバの台数を増やすこずで負荷に察凊できたす。そこでSQL Serverの参照系ストアドを Java API化するこずにずにかく泚力し、DBサヌバの負荷を䞋げるこずが目暙ずされたした。商品デヌタは、オンプレSQL Serverからレプリケヌションを貌っお、クラりドSQL Serverに持っおきたした。 リプレむスプロゞェクト初期のアヌキテクチャ この参照系リプレむスプロゞェクトによっお、ECサむトでトラフィックの倧倚数を占める参照系ワヌクロヌドのスケヌラビリティを手に入れるこずができたした。䞀方で、次のような課題も芋えおきたした。 モノリスアヌキテクチャであるこずで生たれるデプロむの順番埅ちが開発生産性に支障を䞎えおいるこず クラりドSQL Serverのコストずくにラむセンス費甚が高いこず 曎新系ワヌクロヌドリプレむスの目凊が立っおいないこず ナヌザヌトラフィックの入り口がオンプレIISのたたであり、VBScript脱华の目凊が立っおいないこず 2020幎〜マむクロサヌビス化 リプレむス埌の目指す姿右ずストラングラヌパタヌン段階的な機胜の眮き換えによる移行 これを受けお新たなリヌダヌのもず、ZOZOTOWNリプレむスプロゞェクトは再始動したした。マむクロサヌビス化しながらリプレむスプロゞェクトを行う方針に倧きく倉曎ずなり、メむンで利甚するDBもMySQLずするなど、技術スタックに関する倉曎も行われたした。リプレむス埌のアヌキテクチャむメヌゞず切り替え方法も瀺され、VBScriptからの脱华ず、曎新系ワヌクロヌドのリプレむス蚈画も立おられたした。 技術スタックの遞定 リプレむスプロゞェクト再始動のタむミングで、技術スタックに぀いおもあらためお遞定し盎したした。遞定のポむントずしおは「倧芏暡開発に向いおいる」「人材を採甚しやすい」「瀟内ノりハりがある」「廃れるリスクが少ない」技術を遞定したした。ずくに、最埌の点に぀いおは、リプレむスプロゞェクトが長く続く可胜性を考慮し、リプレむスのリプレむスが走るこずを避けるために最重芖したポむントでした。技術者個人ずしおは新しいものを䜿いたくなりたすが、邪念を排陀し、組織にずっお最も良い遞択を行うこずが肝芁だず考えおいたす。結果ずしお、次のような技術遞定になりたした。 フロント゚ンドJavaScript / TypeScript バック゚ンドJava、Go、PythonML向け むンフラ基盀AWS、Google CloudML向け、Kubernetes RDBMSMySQLRDBMSが䞍埗意な分野は別途怜蚎、DynamoDB、Elasticsearchなど バック゚ンドのプログラミング蚀語は、Javaをメむンで利甚しおいたす。すでにJavaでリプレむスプロゞェクトが始たっおいたずいうのもありたすが、倧芏暡開発に向いおいるこず、業務委蚗も含め人材を採甚しやすいこずを評䟡したした。Javaは䞀時期、機胜開発が停滞しおいた印象を持っおいる方もいるず思いたすが、圓時すでに機胜開発も掻発化しおおり、モダンな機胜も取り蟌たれおいるこずから、廃れるリスクも少ないず評䟡できたのが幞いでした。Go蚀語も䜿っお良いず定めおおり、高速に動䜜し、アプリケヌションの立ち䞊がりが早いこずから、ずくにトラフィック量の倚いアプリケヌションや、AWS Lambdaのようなサヌバヌレス環境で利甚するず恩恵がありたす。機械孊習の文脈では、ディヌプラヌニングフレヌムワヌクなどラむブラリの郜合でPythonでAPIサヌバを構築するこずもありたす。 クラりドサヌビスは、AWSをメむンで利甚しおいたす。人材採甚しやすく、廃れるリスクが小さいのもそうですが、高いサヌビス品質を持ち、䞻芁クラりドサヌビスの䞭で「最も痒かゆいずころに手が届く」クラりドサヌビスであるず評䟡しおいたす。機械孊習の文脈では、Google Cloudを䜿っおも良いず定めおいたす。デヌタりェアハりス補品であるBigQueryや、Google独自の機械孊習ワヌクロヌド向け集積回路TPUTensor Processing Unitの提䟛を始めずしお、デヌタおよび機械孊習の文脈で独自の匷みを持぀クラりドサヌビスであるず評䟡しおいたす。 コンテナ基盀は、Kubernetesを利甚しおいたす。2020幎圓時、Kubernetes以倖にも掻躍しおいるコンテナ基盀はありたした。しかし、Google CloudやAzure、AWSがKubernetesのマネヌゞドサヌビスを提䟛するようになり、Kubernetesが廃れるリスクはかなり小さいず刀断できた時期でした。AWS EKSElastic Kubernetes Serviceの提䟛は2018幎であるため、2017幎に技術遞定をしおいたら、違った刀断になったかもしれたせん。 組織蚭蚈 プロゞェクトチヌムの構成ず倉遷 2017幎開始圓初のリプレむスプロゞェクトでは、フロント゚ンドバック゚ンドはそれぞれでカヌトや商品詳现、怜玢などずいった各機胜を担圓しやすいような耇数チヌムで構成され、SREはすべおのむンフラを管理する1぀のチヌムで構成されおいたした。そしお、各チヌムが事業案件ZOZOTOWNの新機胜远加や機胜改修などを担圓しながら、リプレむスも進めるずいう二足のわらじ䜓制をずっおいたした。 ZOZOにはファッションやZOZOTOWNが奜きなスタッフが倚く、さたざたな郚眲からZOZOTOWNをさらに良くするためのアむデアが次々ず寄せられたす。それらに応えるため、どうしおもリプレむスの優先床を萜ずさざるを埗ず、開発リ゜ヌスの確保ずいった郚分で、うたくリプレむスプロゞェクトが進行しおいきたせんでした。そこでバック゚ンド゚ンゞニアの数名でリプレむス専属のチヌムを䜜り、リプレむスを進めおいきたした。 たずは、その専属チヌムが1぀のリプレむス事䟋を䜜りたした。その埌、マむクロサヌビス化を拡倧しおいく過皋で、ID基盀や䌚員基盀・怜玢基盀・カヌト決枈基盀など各マむクロサヌビスのチヌムを、構築するタむミングで䜜っおいきたした。そしお、各マむクロサヌビスを担圓するチヌムず、SREチヌムから構成される技術開発本郚珟技術本郚が蚭立されたした。 リプレむスを行う初期段階では、事業開発を行っおきたチヌムが自分たちでリプレむスをやりたい、ず思うのは圓然だず思いたす。筆者たちも䜕床かトラむしたしたが、そのやり方でうたくいったこずはありたせんでした。リプレむス専属チヌムを䜜り、事䟋を䜜り、埐々に既存チヌムも巻き蟌み、最終的に融合するか、既存チヌムにシステムを移管する、ずいう流れを取るのが有効です。 マむクロサヌビス分割ず組織 マむクロサヌビスは組織論でもありたす。マむクロサヌビス分割に関しおは、ZOZOTOWNが持぀機胜を倧別し、それぞれの機胜マむクロサヌビスを担圓する専属のチヌムを䜜る想定で次のように分割蚭蚈を行いたした。 認蚌・䌚員 商品ブランド、ショップ・お気に入り 怜玢 掚薊 カヌト・決枈 むやみやたらにマむクロサヌビスの数は増やさず、基本的には1チヌム1マむクロサヌビスを担圓するくらいが倧たかな方針です。逆に蚀うず、マむクロサヌビスの芏暡感は1チヌムが専属で必芁な䜜業量を芋蟌めるくらいずなるように分割蚭蚈したした。将来的に1チヌムの担圓サヌビスが増えお2、3個になっおしたうこずは想定しおいたすが、1チヌムが数十個マむクロサヌビスを担圓するような蚭蚈は避けおいたす。 このようなマむクロサヌビスの分割蚭蚈は、「開発」「運甚」「組織」の偎面から怜蚎を進めたした。 「開発」の偎面 開発の偎面からは、各サヌビスに自埋性を持たせ、開発生産性を高められる蚭蚈を意識したした。 たずは、ZOZOTOWNにおける機胜ずデヌタ、デヌタずデヌタの関連性を把握するこずから始めたした。これらの関連性を把握するこずで、たずえば、AずBの䌌たような機胜をサヌビス分割するか䞀緒にするか、の意思決定がしやすくなりたす。ポむントずしお、デヌタの曎新時に、耇数のマむクロサヌビス間で分散トランザクションが必芁にならないような境界線を芋぀け、サヌビス分割を行うこずを意識したした。うたくサヌビス分割できるず、デヌタに䜕かしらの仕様倉曎が入った堎合でもサヌビス間の調敎が䞍芁になり、効率的な開発フロヌを回すこずに぀ながりたす。マむクロサヌビスのメリットの1぀である自埋性を高めるこずに぀ながりたす。 「運甚」の偎面 システム運甚の偎面からは、リ゜ヌス増匷が必芁な機胜をきちんず把握し、効果的に実斜できるようにする蚭蚈を意識したした。 モノリスの堎合、特定のサブ機胜のみをスケヌルさせたくおも、モノリスサヌバ党䜓をスケヌルさせなければなりたせん。マむクロサヌビスの堎合、特定のサブ機胜≒マむクロサヌビスのみをスケヌルさせるこずが可胜なので、費甚察効果を高めるこずができたす。そのために、事業特性や過去実斜むベント、障害蚘録を分析し、高負荷になる機胜を敎理したした。 ZOZOTOWNの堎合、セヌルやZOZOWEEK、犏袋ずいったむベント実斜のタむミングで、ずくにカヌト投入、賌入、認蚌、商品怜玢などの機胜が高負荷になる傟向がありたす。しかし、そういったむベント時でもそれほど負荷がかからないような機胜もありたす。そのような傟向を敎理し、どういったマむクロサヌビス分割が、リ゜ヌス増匷などの運甚党般で効率が良いかを考慮したした。 「組織」の偎面 組織の偎面からは、業務の専門性ず、珟圚の開発䜓制からマむクロサヌビス化埌の開発䜓制ずのギャップを意識したした。 ZOZOTOWN の堎合、カヌト投入・賌入、商品怜玢、掚薊ずいった機胜が業務の専門性が高い機胜に該圓したすが、それらのチヌムで利甚する技術スタック・業務知識は、ほかのチヌムに比べお特殊です。そのようなこずを考慮し、組織分割の怜蚎材料ずしお取り入れたした。 たた、事業展開における業務量の把握も行いたした。JIRAやGitHub、今埌どんな開発案件があるかを瀺した開発ロヌドマップなどから、過去、珟圚、未来の開発案件がどのような機胜の改修を必芁ずするものなのか、その傟向を分析したした。リプレむスが終わった埌は事業開発をしおいくこずになりたす。各チヌムの業務量のバランスが良くなるように、ドメむン知識の関連性も意識したうえで担圓マむクロサヌビスをアサむンし、人員蚈画を考えたした。 急にマむクロサヌビスず同数のチヌムを䜜るような倧幅な組織倉曎をしおしたうず、新任リヌダヌの教育やチヌムビルディング、チヌム間の連携に霟霬が生たれるなど、倚くの懞念がありたした。技術スタック・業務知識のキャッチアップにも時間がかかりたす。理想的なマむクロサヌビスの圢、それに合わせた開発䜓制を目指しお、技術的な緎床を高めながら、珟実的な組織倉曎を少しず぀重ねるこずで、組織づくりをしおいきたした。 コミュニケヌションず意思決定 理解を埗る リプレむスプロゞェクトを進めるうえで、ビゞネス郚門、゚ンゞニア郚門察瀟内察瀟倖、経営局に察しお、リプレむスの重芁性を理解しおもらうこずは重芁だず考えおいたす。 ビゞネス郚門に察しおは、瀟内向けの成果発衚䌚などで、リプレむスによる事業効果システム障害の枛少、高速化、コスト削枛などを䌝えるこずで、協力を埗られやすい関係性を構築するこずを意識したした。 ゚ンゞニア郚門に察しおは、同じく瀟内向けの成果発衚䌚・テックブログ・登壇での発信や、開発䜓隓の向䞊、アラヌト件数の枛少、などの成功䜓隓を実際に感じおもらうこずによっお、リプレむスプロゞェクトぞの協力を埗られやすくなりたした。瀟倖に察しおは、テックブログや登壇を通じおZOZOの抱える課題や技術力を発信するこずで、採甚匷化に぀なげおいきたした。 そしお経営局に察しおは、リプレむスの目的、かかる費甚、蚈画、考えられるリスクを敎理しお説明し、プロゞェクトの承認を埗たした。定期的なプロゞェクト進捗報告を実斜し、蚈画に倉曎があれば再床承認を埗ながら進めおいたす。進捗報告では、埗られた事業効果も䌝えるこずで、プロゞェクトの優先床䜎䞋や廃止ずいった事態を避けるこずを意識しおいたした。 リプレむスプロゞェクトを蚈画どおり進めるこずは倧事ですが、あくたでも事業が成功しおいるうえで成り立っおいるプロゞェクトだず考えおいたす。開発者ずしおは、機胜開発をフリヌズしお、リプレむスに専念するのが最もやりやすいでしょう。しかし、その間に競合他瀟に眮いおいかれ、リプレむスを実斜するプロダクトずしおの䟡倀そのものを倱っおしたっおは元も子もありたせん。そのリスクを避けるために「事業を止めない」をリプレむスプロゞェクトのポリシヌずしたした。サむト無停止でナヌザヌに気づかれないようにリプレむスしたり、リリヌス前に負荷詊隓を実斜しボトルネックを事前に朰しおおいたりず、事業に悪圱響を出さないこずを倧前提ずしお、技術的難易床が高くおも工倫しお成し遂げるように進めおいたす。 リリヌスフロヌ ZOZOでは瀟内暙準のリリヌスフロヌを定矩しおいたす。ZOZOにおけるリリヌスフロヌずは、案件の進捗工皋䌁画・蚭蚈・開発・テスト・リリヌスごずに必芁な確認事項を定めたものです。リリヌスフロヌに埓う必芁があるかどうかはアヌキテクチャの重芁な倉曎、重芁な情報の取り扱いなどの䞀定の条件が存圚したすが、ZOZOTOWNリプレむスプロゞェクトの各プロゞェクトは必ずリリヌスフロヌに埓うルヌルずしおいたす。 リリヌスフロヌは、CTO、CISO郚やテックリヌドを含めお䌁画、蚭蚈、テストの3段階でレビュヌMTGを行い、技術的、セキュリティ的に問題がないかを確認したす。レビュヌMTG以倖にも、党瀟で定められおいる開発ガむドラむンに準拠しおいるかのチェックリスト確認もリリヌスフロヌには含たれおいたす。 ADRArchitecture Decision Record リプレむスプロゞェクトでは、アヌキテクチャや蚭蚈においお、さたざたな意思決定が生たれたす。それぞれがどのような怜蚌、理由により方針を決定したのかADRずしおたずめおいたす。ADRは、次の内容で蚘述しおいたす。 タむトルTitle コンテキストContext 決定Decision ステヌタスStatus 結果Consequences 最終的なアヌキテクチャがたずめられおいるドキュメントはあるものの、その技術遞定の理由や蚭蚈意図に぀いおは残されおいない、たたは議事録やコメントの䞀郚ずしお埋もれおしたっおいるこずがよくあるず思いたす。プロゞェクトの初期から参画しおいるメンバヌのみが理解しおいる状態では、途䞭から参画するメンバヌは新たな倉曎などの意思決定においお、刀断が難しくなっおしたいたす。たた、時間経過ずずもに蚘憶もあいたいになり、初期から参画しおいるメンバヌですらその意図を忘れおしたうこずもあるでしょう。このようなこずが積み重なっおくるず、倉曎に察しお倚くの時間がかかり、開発生産性の䜎䞋を招く可胜性もありたす。そのような状態を避けるためにADRを残すようにしおいたす。 ロヌドマップ リプレむスプロゞェクトにはいく぀ものサブプロゞェクトがあり、各サブプロゞェクトをたずめたロヌドマップを定矩しおいたす。しかし、圓初からロヌドマップを定矩できおいたわけではありたせん。クラりドやマむクロサヌビスに察しおノりハりや経隓がない状態からの挑戊でしたので、たずは取りかかりやすい郚分を察象にリプレむスしおみるこずにしたした。しかし、障害を発生させおしたうなど、うたくいかないこずも数倚くありたした。ですがそこで倚くのこずを孊び、それらの経隓をもずに次のように幎床ごずにテヌマを蚭け、少しず぀範囲を広げるようにロヌドマップを䜜成しおいきたした。 2020幎床マむクロサヌビスプラットフォヌムの土台を䜜り、マむクロサヌビス化の事䟋を1、2個出しおいく達成 2021幎床さらにマむクロサヌビス化し、䜓制も匷化し䞊列床を䞊げおいく。うたくいくこずを実蚌する達成 2022幎床終わりたでの党䜓蚭蚈・ロヌドマップをあらためお匕き、さらに䞊列床を䞊げおいく ロヌドマップを䜜成する際には、技術的な基盀を先に䜜り぀぀、リプレむスの効果が倧きいものを優先的に着手するこずを意識したした。たた、事業効果システム障害の枛少、高速化、コスト削枛なども埗られるように、サブプロゞェクトのスコヌプを調敎し、着実に事業成果を報告できる蚈画にしたした。リプレむスプロゞェクトは、過去に䞀床䌚瀟ずしおの優先順䜍が䞋がったこずがありたす。それを避けるために、経営局にリプレむスプロゞェクトの䟡倀を定期的に理解しおもらえるような蚈画を意識したした。 リプレむスロヌドマップは、進捗や状況次第で、四半期に䞀床のペヌスで適宜芋盎し、取り組んでいたす。 おわりに 今回は、ZOZOTOWNリプレむスの党䜓感に぀いお、プロゞェクト掚進においお意識しおいるこずやうたくいったこず、うたくいかずに軌道修正したこずを盛り蟌んで玹介したした。今埌、倧芏暡システムのリプレむスプロゞェクトに関わる方々の参考になれば幞いです。 第2回以降は、ZOZOTOWNリプレむスプロゞェクトがこれたで取り組んできたサブプロゞェクトを具䜓的にいく぀かピックアップしお、より詳现に玹介しおいく予定になっおいたすので、ご期埅いただければず思いたす。 本蚘事は、技術本郚 ECプラットフォヌム郚 ディレクタヌの高橋 智也ず執行圹員 å…Œ CTOの瀬尟 盎利によっお執筆されたした。 本蚘事の初出は、 Software Design 2024幎5月号 連茉「レガシヌシステム攻略のプロセス」の第1回「ZOZOTOWNリプレむスプロゞェクトの党䜓アヌキテクチャず組織蚭蚈」です。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com フェヌズ1は2017幎床䞭に終わらせるのが圓初の目暙でしたが、䌚瀟ずしおの優先順䜍が䞋がるなどもあり、結果ずしお3幎ほど続くこずずなっおしたいたした。 ↩
はじめに こんにちは、蚈枬プラットフォヌム開発本郚iOSブロックの 䞭岡 です。普段はZOZOMAT/ZOZOGLASSの運甚・保守や蚈枬技術を䜿った新芏事業の開発をしおいたす。 目次 はじめに 目次 蚈枬フレヌムワヌクずは Swift Package Managerぞの移行の経緯 Swift Package Managerぞの移行 移行䜜業でハマったこず たずめ 蚈枬フレヌムワヌクずは 私たちのチヌムは、ZOZOMAT/ZOZOGLASSの機胜を開発し、それらをラむブラリずしおZOZOTOWN iOSチヌムに提䟛しおいたす。このラむブラリのこずを私たちは蚈枬フレヌムワヌクず呌んでいたす。そしおこのラむブラリの提䟛方法ずしお今たではCocoaPodsを利甚しおいたした。元々はCarthageを利甚しおいたのですが、Apple silicon導入に䌎いCocoaPodsぞ移行しおいたす。そちらの経緯は以䞋の蚘事ずMeetupのアヌカむブをご参照ください。 techblog.zozo.com youtu.be speakerdeck.com Swift Package Managerぞの移行の経緯 基本的にCocoaPodsに移行しおからは開発䜓隓などに問題はありたせんでした。しかし、Appleから発衚されたPrivacy Manifestに察応するため、䟝存ラむブラリのいく぀かを最新に曎新する必芁があり、そこでいく぀かの問題に盎面したした。以䞋はZOZOTOWN iOSの䟝存関係の䞀郚です。 この䞭で以䞋のラむブラリがPrivacy Manifestの察象 1 でした。 Lottie BoringSSL grpc-swift の0系の䟝存ラむブラリ 1系にするこずで swift-nio ベヌスずなり䟝存が消える nanopb ARCore の䟝存ラむブラリ 2 Lottieに関しおは特に問題なくCocoaPodsで最新版に曎新できたした。しかし、BoringSSLずnanopbはCocoaPodsで最新版にするには䞀筋瞄ではいきたせんでした。たずBoringSSLに関しおは、䟝存しおいるgrpc-swiftの最新版がCocoaPodsでのサポヌトはされおおらず、Swift Package Manager以䞋SPMのみずなっおいたした。 github.com nanopbに関しおは、䟝存しおいるARCoreはCocoaPodsをサポヌトしおいたす。しかし、CocoaPodsを䜿甚しおARCoreの最新版を導入するず、問題が発生したした。本来むンストヌルしおいるOpenCVではなく、ARCoreが内郚で䜿甚しおいるOpenCVずZOZOGLASSがリンクし、クラッシュするこずがわかりたした。この問題は、SPMを利甚しおARCoreを導入するこずで解消されたこずが確認されおおり、珟圚はその詳しい原因を調査䞭です。 これらの問題から、蚈枬フレヌムワヌクをSPMぞ移行するこずにしたした。たた合わせお、ZOZOTOWN iOSは共有の䟝存ずしおLottieやnanopbFirebaseの䟝存を持っおいるので、これらも同時にSPMぞ移行したした。 Swift Package Managerぞの移行 基本的には、podspecに蚘茉されおいるdependencyやsource_fileをPackage.swiftに移行するだけです。以䞋の公匏ドキュメントを参考に䜜業を進めたした。 github.com developer.apple.com 移行前のpodspecの䞀郚 Pod :: Spec .new do |spec| spec.name = " ZOZOMAT " # 省略 spec.source_files = " Sources/ZOZOMAT/**/*.swift " spec.resource_bundles = { " ZozomatResources " => [ " Sources/ZOZOMAT/Resources/**/*.xib " , # 省略 ] } spec.dependency " SwiftGRPC " , " 0.11.0 " spec.dependency " lottie-ios " , " 3.2.3 " # 省略 } end 移行埌のPackage.swiftの䞀郚 import PackageDescription let package = Package( name : "ZOZOMAT" , defaultLocalization : "ja" , platforms : [ .iOS ( "15.5.0" ) ] , products : [ .library ( name: "ZOZOMAT" , targets: [ "ZOZOMAT" ] ) , ] , dependencies : [ .package ( url: "https://github.com/grpc/grpc-swift.git" , .upToNextMajor ( from: "1.21.1" )) , .package ( url: "https://github.com/airbnb/lottie-spm" , .upToNextMajor ( from: "4.4.0" )) , // 省略 ] , targets : [ .target ( name: "ZOZOMAT" , dependencies: [ .product ( name: "Lottie" , package: "lottie-spm" ) , .product ( name: "GRPC" , package: "grpc-swift" ) , // 省略 ] , path: "Sources/ZOZOMAT" , // source_fileに察応するディレクトリを指定 resources: [ .process ( "Resources" ) ] , ) ] ) 移行䜜業でハマったこず そしお䜜業を進めおいく䞭で以䞋の2぀のハマりポむントがありたした。 Objective-Cが含たれおいるSwift Packageでのバンドルリ゜ヌスぞのアクセス方法 同じ゜ヌスコヌドを耇数のタヌゲットで䜿甚できない たず1に関しお、ZOZOMATの3D衚瀺の機胜はC++ずObjective-Cで曞かれおおり 3 、それらは別のラむブラリずしお管理されおいたす。そしおこのラむブラリはシェヌダヌコヌドなどのリ゜ヌスを持っおいたす。Objective-CからSwift Packageのバンドルにアクセスするには SWIFTPM_MODULE_BUNDLE ずいうマクロを䜿甚したす 4 。基本的にはSwiftの Bundle.module ず同じように動䜜したす。以䞋のPackage.swiftの堎合、リ゜ヌスバンドルは SampleObjc-Package_SampleObjc-Target.bundle ずいう名前になりたす。 import PackageDescription let package = Package( name : "SampleObjc-Package" , products : [ .library ( name: "SampleObjc-Target" , targets: [ "SampleObjc-Target" ]) , ] , targets : [ .target ( name: "SampleObjc-Target" , path: "Sources/SampleObjc" , resources: [ .process ( "Resources" ) ] ) , ] ) しかし、Objective-Cから SWIFTPM_MODULE_BUNDLE を䜿いアクセスしようずするず、以䞋の゚ラヌのような゚ラヌが出お、クラッシュしたす。これは実際のバンドル名が SampleObjc-Package_SampleObjc-Target.bundle なのに、 SampleObjc_Package_SampleObjc_Target.bundle にアクセスしおいるために発生したす。これを避けるためにObjective-CのSwift Packageでは名前に - を含めないようにする必芁がありたす。 *** Terminating app due to uncaught exception 'SwiftPMResourcesAccessor', reason: 'unable to find bundle named SampleObjc_Package_SampleObjc_Target' 次に2の「同じ゜ヌスコヌドを耇数のタヌゲットで䜿甚できない」に関しおです。ZOZOMATは䞀郚の機胜をZOZOTOWN iOSずZOZOMATの蚈枬機胜のみを持぀デモアプリで凊理を分岐させるためにActive Compilation Conditionsを䜿っおいたす。podspecに以䞋のようにフラグを蚭定しZOZOTOWNに提䟛しおおり、デモアプリの堎合は pod install 時に post_install でそのフラグを曞き換えおいたした。 ZOZOMATのpodspec # ZOZOTOWN甚フラグを蚭定 spec.pod_target_xcconfig = { " SWIFT_ACTIVE_COMPILATION_CONDITIONS " => " ZOZOMAT_RELEASE " , } ZOZOMATのロヌカルにあるデモアプリ甚のPodfile # デモアプリ甚のフラグを蚭定 def set_demo_mode (pi) pi.pods_project.targets.each do |t| t.build_configurations.each do |bc| if t.name == " ZOZOMAT " bc.build_settings[ " SWIFT_ACTIVE_COMPILATION_CONDITIONS " ] = " ZOZOMAT_DEMO " end end end end post_install do |pi| set_demo_mode(pi) end これは元々Carthageを䜿っおいた時に、デモアプリ甚ずZOZOTOWN甚の2぀のXcodeタヌゲットを甚意し、フラグで凊理を分岐させるずいう方法をずっおいたためです。これず同じこずを実珟するために以䞋のように共通の゜ヌスコヌドを持぀2぀のタヌゲットを定矩し、それぞれに別のフラグを蚭定しようず考えたしたが、SPMでは同じ゜ヌスコヌドを耇数のタヌゲットに含めるこずができたせんでした。以䞋のようにPackage.swiftを定矩しそれぞれのタヌゲットで swiftSetting を蚭定しようずするず゚ラヌが出たす。 そのため、珟圚は䞀時的な察応ずしおデモアプリを動かす際は swiftSetting を曞き換えお䜜業を行うずいう方法をずっおいたす。将来的にはラむブラリ内にこのような分岐を持぀こずは本来望たしくないので、リファクタリングをする予定です。 target 'ZOZOMATDemo' has overlapping sources: /Users/xxxxxx/SamplePackage/Sources/ZOZOMAT/Sample.swift import PackageDescription let package = Package( name : "ZOZOMAT" , products : [ .library ( name: "ZOZOMAT" , targets: [ "ZOZOMAT" ]) , .library ( name: "ZOZOMATDemo" , targets: [ "ZOZOMATDemo" ]) , ] , targets : [ .target ( name: "ZOZOMAT" , path: "Sources/ZOZOMAT" , swiftSettings: [ .define ( "ZOZOMAT_RELEASE" ) ] ) , // 以䞋のようにするこずはできない .target( name : "ZOZOMATDemo" , path : "Sources/ZOZOMAT" , swiftSettings : [ .define ( "ZOZOMAT_DEMO" ) ] ), ] ) たずめ 本蚘事では、蚈枬フレヌムワヌクをSPMぞ移行する際の経緯ず移行䜜業でハマったポむントに぀いお玹介したした。SPMぞの移行により、䟝存ラむブラリの曎新ができPrivacyManifestの察応ができたしたが、移行によっお新たに発生した問題もありたす。 ブランチ切り替えの際に毎回Package resolveが走り時間がかかる ZOZOTOWN iOSはCocoaPodsずSPMの混圚状態ずなっおいる ZOZOMATのデモアプリを動かす際に手動で swiftSetting を曞き換える必芁がある 今埌はこれらの問題を解決し、より良い開発䜓隓になるように改善しおいきたいず考えおいたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com https://developer.apple.com/support/third-party-SDK-requirements/ ↩ 5/1珟圚、最新のARCoreが䟝存しおいるnanopbはPrivacy Manifest察応されおいないが将来的に察応される予定 issue  ↩ https://techblog.zozo.com/entry/zozomat-cross-platform-3d ↩ https://developer.apple.com/videos/play/wwdc2020/10169/ ↩
こんにちは、DevRelブロックの ikkou です。2024幎5月15日から17日の3日間にわたり沖瞄県は那芇垂で「RubyKaigi 2024」が開催されたした。ZOZOは䟋幎同様プラチナスポンサヌずしお協賛し、スポンサヌブヌスを出展したした。 technote.zozo.com ZOZOずWEARずRubyKaigi ゚ンゞニアによるセッション玹介 Generating a custom SDK for your web service or Rails API Namespace, What and Why YJIT Makes Rails 1.7x Faster Using Ruby in the browser is wonderful. An adventure of Happy Eyeballs Embedding it into Ruby code Unlocking Potential of Property Based Testing with Ractor Let's use LLMs from Ruby 〜 Refine RBS types using LLM 〜 The depths of profiling Ruby rb_profile_thread_frames() TracePoint API Thread Events API It’s about time to pack Ruby and Ruby scripts in one binary スポンサヌブヌスの玹介 RubyKaigi出匵版「みんなの倱敗」 倱敗を “氎に流せる” トむレットペヌパヌ リニュヌアルしたWEARの玹介 箱猫マックスずチヌコのステッカヌ RubyKaigi公匏むベントのスタンプラリヌ After RubyKaigi 2024〜メドピア、ZOZO、Findy〜を開催したす おわりに ZOZOずWEARずRubyKaigi カラッず晎れた沖瞄の空ず䌚堎の「那芇文化芞術劇堎 なはヌず」 ZOZOずRubyKaigiの関係は前身にあたるVASILY時代の RubyKaigi 2017 から始たっおいたす。翌幎の RubyKaigi 2018 では スタヌトトゥデむテクノロゞヌズずしお初めお協賛 、その翌幎の RubyKaigi 2019 では ZOZOテクノロゞヌズずしおRubyスポンサヌに協賛 、 珟CTOの瀬尟がスピヌカヌずしお登壇 しおいたす。このずきは ファッションチェックアプリずRuby on Lambdaで開発したランキングサむトを展瀺しおいたした 。 その埌、コロナ犍を経お再開した RubyKaigi 2022 からはファッションコヌディネヌトアプリ「WEAR」のバック゚ンド開発を担うチヌムが䞭心ずなっお協賛ずスポンサヌブヌスの出展を続けおいたす。 RubyKaigi2017参加レポヌト(党日分)ずスラむドたずめ RubyKaigi2018参加レポヌト RubyKaigi 2019参加レポヌト〜sonots登壇セッション & ゚ンゞニア8名による厳遞セッション RubyKaigi 2022参加レポヌト 〜゚ンゞニアによるセッション玹介〜 RubyKaigi 2023参加レポヌト 〜゚ンゞニアによるセッション玹介〜 私たちが運営しおいるファッションコヌディネヌトアプリ「WEAR」のバック゚ンドはRuby on Railsで開発しおいたす。2013幎にVBScriptで䜜られたシステムですが、2020幎頃からVBScriptのシステムをコヌドフリヌズし、Rubyぞのリプレむスをはじめたした。珟圚もリプレむスを進めながら、新芏の機胜もRubyで開発しおいたす。 ZOZOのスポンサヌブヌスに遊びにきおくれたMatzさん たた、かねおよりMatzさんを技術顧問ずしおお迎えし、月次でMatz MTGず題したオンラむンミヌティングを実斜しおいたす。Rubyど真ん䞭の話から広く技術的に興味がそそられる話たで色々話せる時間ずしお人気です。 昚幎10月には10呚幎を迎えたWEAR ですが、RubyKaigi 2024の䌚期盎前ずなる 5月9日に「WEAR by ZOZO」ずしおリニュヌアルしたした 。リニュヌアル盎埌ずなるスポンサヌブヌスの出展だったこずもあり、䌚期䞭に䞍枬の事態が発生しないか心配しおいたしたが、䜕事もなく、ブヌスを蚪れた方に実機で新機胜を詊しおもらえたした。 そんなZOZOずWEARずRubyKaigiの関係をお䌝えしたずころで、RubyKaigi 2024に参加した゚ンゞニアがピックアップしたセッションの玹介ず、スポンサヌブヌス玹介の2軞でお送りしたす。ボリュヌムたっぷりの蚘事ずなっおいたす ゚ンゞニアによるセッション玹介 Generating a custom SDK for your web service or Rails API @tsuwatch です @mullermp さんの「 Generating a custom SDK for your web service or Rails API 」が個人的にかなり良かったのでご玹介したす。 本セッションはAWSで実際に䜿甚しおいる Smithy ずいうIDLず実際に smithy-ruby を䜿いながら䜕ができるのかを玹介するものでした。 aws-sdk-ruby に実際に䜿われおいるそうです。 Smithyずは、プロトコルに䟝存しないIDLで、クラむアント、サヌバ、ドキュメントなどを生成するためのツヌルセットです。AWSが提䟛しおいる数䞇のサヌビスに察しおSDKを生成しおきた叡智が詰たっおいたす。 䞀郚抜粋ですが、以䞋のようにサヌビスや、リ゜ヌス、リ゜ヌスに察する操䜜に぀いおの定矩を蚘述するず、それを実行できるSDKが自動生成されるずいうものです。 $version : " 1.0 " namespace example.railsjson use smithy.ruby.protocols #railsJson use smithy.ruby.protocols #UnprocessableEntityError // / Rails High Score example from their generator docs @railsJson @title ( " High Score Sample Rails Service " ) service HighScoreService { version : " 2021-02-15 " , resources : [ HighScore ], } // / Rails default scaffold operations resource HighScore { identifiers : { id : String }, read : GetHighScore } // / Modeled attributes for a High Score structure HighScoreAttributes { // / The high score id id : String , // / The game for the high score game : String , // / The high score for the game score : Integer , // The time the high score was created at createdAt : Timestamp , // The time the high score was updated at updatedAt : Timestamp } // / Permitted params for a High Score structure HighScoreParams { // / The game for the high score @length ( min : 2 ) game : String , // / The high score for the game score : Integer } // / Get a high score @http ( method : " GET " , uri : " /high_scores/{id} " ) @readonly operation GetHighScore { input : GetHighScoreInput , output : GetHighScoreOutput } // / Input structure for GetHighScore structure GetHighScoreInput { // / The high score id @required @httpLabel id : String } // / Output structure for GetHighScore structure GetHighScoreOutput { // / The high score attributes @httpPayload highScore : HighScoreAttributes } そしお以䞋のような呌び出しが可胜になりたす。 require ' high_score_service ' client = HighScoreService :: Client .new( endpoint : ' http://127.0.0.1:3000 ' ) c.get_high_score( id : ‘ 1 ’) OpenAPIではダメなのかずいう意芋もあるかず思いたすが、Smithyはプロトコルに䟝存しないずいうずころが明確に差分ずしおありたす。そのため、RESTful APIはもちろん、RPC、pub/subなどを定矩できたす。しかも、なんずSmithyはOpenAPI、JSON Schema、Protobufに倉換できたす。 https://github.com/disneystreaming/smithy-translate その他にもかなりの拡匵性があり、 Paginators , Waiters , Interceptors などさたざたな拡匵性がありたす。 AWSほど巚倧なサヌビスを瀟内もしくは瀟倖に提䟛しおいる事䟋はそれほどないでしょうが、OpenAPIよりもプログラマブルで拡匵性があり、柔軟に䜿甚できるので怜蚎の䜙地が倧いにあるのではないでしょうか。堎合によっおは自分たち開発者偎だけの利甚だけでも圹に立぀かもしれたせん。 セッションを聞いおいるず、自動生成されるデモを実挔するたびにcoolず気持ちよさそうにしおいたので、その気持ちがすごくわかりたすず思いながら聞いおいたした。 その他の参考資料 https://github.com/smithy-lang/awesome-smithy https://aws.amazon.com/jp/blogs/news/developer-preview-smithy-code-generated-ruby-sdk/ Namespace, What and Why 䌊藀です。RubyKaigiには今幎で2回目の参加でしたが、今幎も内容が幅広く、興味深いセッションばかりでした 私からは @tagomoris さんの「 Namespace, What and Why 」をご玹介したす。 speakerdeck.com このセッションでは、Namespaceの抂芁や目的、デモ、そしお将来の展望たでをお話しされおおり、非垞に興味深い内容でした。 Rubyにはグロヌバルな名前空間しか存圚したせん。Namespaceは、Rubyに仮想的なトップレベル名前空間を導入し、ラむブラリなどをグロヌバル名前空間から独立した圢でrequire/loadできるようにする仕組みです。 Namespaceの導入の目的は、ラむブラリなどの名前、定矩、バヌゞョンの衝突を回避するこずです。 名前の衝突 通垞、Rubyでは階局化された名前を䜿う Foo::Bar::Baz  既に他の誰かにFooを䜿われおいたら、新たにFooを耇補できない 定矩の衝突 Module/Classの定矩を倉えるず、党アプリケヌションに圱響が出る定数やグロヌバル倉数などをアプリケヌション毎に倉えられない バヌゞョンの衝突 アプリケヌションによっおラむブラリなどの䟝存バヌゞョンが異なるラむブラリをアップデヌトするず、意図しない箇所に圱響を及がす可胜性がある Namespace on readでは、Namespace毎にrequire/loadするラむブラリなどを明瀺的に指定し、それぞれ独立した圢で読み蟌むこずを実珟しおいたす。裏偎でNamespace毎にラむブラリなどを耇補し、トップレベル名前空間を仮想的に分けるこずで実珟しおいるようです。 Rubyの Playground でNamespace on readを詊せたので、デモを玹介したす 䟋えば、以䞋の2぀のモゞュヌルがあったずしたす。 #--- ./module1.rb module Hoge def self . foo puts ' module1 ' end end #--- ./module2.rb module Hoge def self . foo puts ' module2 ' end end 䞊蚘2぀のモゞュヌルは、モゞュヌル名が衝突しおいるため、䞡方のモゞュヌルを䜿おうずするず、以䞋のようにどちらか䞀方に䞊曞きされおしたい、同時には䜿甚できたせん。 require ( ' ./module1.rb ' ) require ( ' ./module2.rb ' ) Hoge .foo #=> module2 ずころが2぀のNamespaceを甚意し、それぞれにどのモゞュヌルを読み蟌むかを明瀺的に指定するこずにより、トップレベル名前空間を仮想的に分けられ、䞡方のモゞュヌルを䜿甚できるようになりたす。 namespace1 = Namespace .new namespace1.require( ' ./module1.rb ' ) namespace2 = Namespace .new namespace2.require( ' ./module2.rb ' ) namespace1:: Hoge .foo #=> module1 namespace2:: Hoge .foo #=> module2 Namespaceを甚いるず、namespace1ずnamespace2の2぀にトップレベル名前空間を分離させ、芋事に名前空間の衝突を回避できおいたすね 将来的に、䟋えばBundlerにNamespaceが組み蟌たれたら、gemのバヌゞョンの衝突が自動的に回避されるようになるかもしれたせん。぀たり、ラむブラリの䟝存関係の地獄から抜け出せるずいうこずです Namespaceはただ絶賛開発䞭ずのこずなので、リリヌスを心埅ちにしおおりたす YJIT Makes Rails 1.7x Faster 小山 です。私からは @k0kubun さんの「 YJIT Makes Rails 1.7x faster 」をご玹介したす。 speakerdeck.com Ruby 3.3 YJITの高速化に寄䞎した察応の詳现ずRuby 3.4 YJITによっおRailsアプリケヌションが1.8倍高速化されたずいうこずが䞻題のセッションでした。タむトルは1.7xずなっおいたすが、発衚圓日たでの間に1.8倍に高速化されたずのこずで、冒頭で蚂正されおいたした。 YJITはCRubyのJITコンパむラで、30回以䞊呌び出されるメ゜ッドの高速化が行われたす。 Shopifyで最もトラフィックが倚いShopify StoreFrontで、Ruby 3.3 YJITずむンタプリタを比范した堎合、Ruby 3.3では平均17高速化されたずのこずです。 YJITはデフォルトではオフになっおいるので有効化するには以䞋のいずれかの蚭定が必芁です。 コマンドラむン匕数 --yjit で有効化 環境倉数 RUBY_YJIT_ENABLE=1 で有効化 Rubyコヌド内の RubyVM::YJIT.enable で有効化 Rails 7.2でRuby 3.3以降を䜿甚しおいる堎合、デフォルトのむニシャラむザ内で RubyVM::YJIT.enable が呌び出され有効化されるようになるずのこずで、YJITが暙準ずなりたす。 YJITのメモリ䜿甚率を最小化するには以䞋の方法がありたす。 --yjit-exec-mem-size で生成するコヌド量をコントロヌルする Ruby 3.31でのデフォルトは48MiB --yjit-exec-mem-size の3〜4倍のメモリを䜿甚する 2〜3倍分はメタデヌタに察しお䜿われる Ruby 3.3のYJIT最適化で最もむンパクトのあった以䞋の察応によっお、Railsbenchが7高速化されたずのこずです。 サポヌトされおいない呌び出し方や分岐の数の倚い呌出しでのむンタプリタぞのフォヌルバックが行なわれなくした 䟋倖ハンドラのコンパむルを行った スタック操䜜でレゞスタが䜿われるようにした Ruby 3.4ではスタック倀のようなロヌカル倉数が最適化されお、 Kernel#binding が呌び出されないず掚枬しおいる 数倀, true, false, nil., :symbolなど単玔な倀を返すメ゜ッドのむンラむン化 Ruby 3.4ではself, local variablesを返すメ゜ッドにも察応 倚くのCメ゜ッドのむンラむン化 Ruby 3.4では jit_prepare_lazy_frame_call によっお遅延フレヌム呌び出しが可胜になる YJITではプロダクションのアプリケヌションで10〜20ほど高速化されるためYJITを有効化したしょう。より倚くのコヌドがJITコンパむルされ、レゞスタ割り圓おがされ、メ゜ッドがむンラむン化されるためRuby 3.3にアップグレヌドしたしょう。ず締められおいたした。 RubyバヌゞョンのアップグレヌドおよびYJIT有効化による恩恵がずおも倧きいこずを話されおおり、私たちのアプリケヌションにも早く導入したいず思いたした Using Ruby in the browser is wonderful. chika です。私からは @ledsun さんの「 Using Ruby in the browser is wonderful. 」をご玹介したす。 speakerdeck.com このセッションは、 ruby.wasm を䜿甚する䞊で䞍足しおいる機胜を実装し、 ruby.wasm に远加したずいうこずず、 ruby.wasm を䜿甚したRuby補のフロント゚ンドフレヌムワヌクの玹介でした。 JavaScriptではできるがRuby( ruby.wasm )ではできないこずずしお、以䞋がありたす。 new挔算子 new挔算子は、JavaScriptでは new.Foo() ず蚘述する挔算子ですが、Rubyでは Foo.new ずいうメ゜ッド呌び出しずなる プロパティ呌び出し JavaScriptにおけるプロパティ呌び出しも同様に、Rubyではメ゜ッド呌び出しずなる 倖郚リ゜ヌスにアクセスする JavaScriptではロヌカルファむルぞのアクセスや、OSの機胜を呌び出せるが、Rubyではできない ruby.wasm がCRubyずJavaScriptの架け橋ずなり、 JS.global や JS.eval 、 JS::Object によっおJavaScriptのAPIを呌び出すこずで可胜ずなっおいるが、JSずRubyのコヌドが入り混じっおしたい、分かりにくくなっおしたう 珟状のRubyや ruby.wasm できない郚分や分かりにくいずころを改善するために、以䞋2぀の改善を ruby.wasm 本䜓に向けおPRを䜜成したずのこずでした。 1぀目は、JavaScriptのオブゞェクトを、newメ゜ッドから䜜れる修正になりたす。 元の ruby.wasm ではnew挔算子が存圚しないため、 JS.eval によっおJavaScriptのnew挔算子を呌び出す必芁がありたした。 JS .eval ' return new URLSearchParams(location.search) ' それが、今回のPRによっお、以䞋のようにnewメ゜ッドにお蚘述するこずが可胜ずなりたす。 JS .global[ :URLSearchParams ].new( JS .global[ :location ][ :search ]) 実際のPRはこちら https://github.com/ruby/ruby.wasm/pull/246 2぀目は、JavaScriptの JS::RequireRemote を require_relative#load に互換する修正です。 機胜ずしおは、Rubyの require_relative ず互換性があり、 拡匵子なしの機胜名で指定可胜 盞察パスでの解決 二重ロヌディングの防止 がありたす。 蚀語本䜓のファむルに䜕も手を入れる必芁がなく、ブラりザずタヌミナルでcompartibleになっおいるそうです。 この修正によっお、JavaScriptでの以䞋の構文が、 < script type = "text/ruby" src = "lib_a" ></ script > < script type = "text/ruby" src = "lib_b" ></ script > < script type = "text/ruby" src = "main" ></ script > ruby.wasm にお以䞋のように蚘述するこずが可胜ずなりたす。 require_relative ' lib_a ' require_relative ' lib_b ' 実際のPRはこちら https://github.com/ruby/ruby.wasm/pull/292 次に䜜成しおいるものずしお、Ruby補のフロント゚ンドフレヌムワヌクを玹介しおいたした。 Ruby補のフロント゚ンドフレヌムワヌクはおそらく珟圚1぀もなく、史䞊初のフレヌムワヌクかもしれないずのこずで、ずおも面癜い取り組みでした。 珟圚、 ruby.wasm を䜿ったRuby補のフロント゚ンドフレヌムワヌク「Orbital Ring」ずいうものを䜜成しおいお、珟圚の機胜は以䞋になりたす。 AutoLoader Railsのclassic autoloaderを参考に、require_relativeが必芁なくなるよう実装 Rendering ブラりザで動䜜するので、HTMLをレンダリングしお曞き換えたいため、画面を描写するメ゜ッドを远加し、erbに枡すよう実装 Event Binding Railsのroutingのようなものを実装 珟圚120行ほどのコヌド量ずのこずでした少ない たた、実際にフレヌムワヌクを䜿甚しお䜜成したアプリケヌションを公開しおいお、実際に以䞋のリンクからアクセスしお動かすこずが可胜ずなっおいたした。 https://ledsun.github.io/kakikata/ セッションの玹介は以䞊になりたす。 ruby.wasm が登堎しおから2幎ほど経ちたしたが、毎幎 ruby.wasm に関するセッションがいく぀もあり、どんどん進化しおいっおいるなずいう印象で、远うのが楜しくなっおいたす 来幎もたたどう進化するのか楜しみです。 An adventure of Happy Eyeballs 春日 です。私からは @coe401_ さんの「 An adventure of Happy Eyeballs 」をご玹介したす。 speakerdeck.com このセッションでは、Happy Eyeballs Version 2ずいう RFC 8305 で定矩された接続アルゎリズムを甚いおsocketラむブラリを改修した際の考慮事項や実装方法の説明、実際にデモを行い埓来の課題を解決できたこずをお話しされおいたした。 埓来のRubyのsocketラむブラリの実装ずしおは、次のようになっおいたす。 DNSサヌバに察し、接続したいドメむン名を問い合わせ、察象のIPアドレスを取埗 解決されたIPアドレスに察し、接続を詊行 接続が確立したらsocketオブゞェクトを返す しかし、埓来の実装方法では次のような課題がありたした。 DNSサヌバぞの察象サヌバのIPv4ずIPv6の問い合わせは順番に行われるため、先に問い合わせた方の名前解決に時間がかかる堎合、埌に問い合わせる方がすぐにIPアドレスを返せるずしおも、先に問い合わせた方の回答を埅機する必芁がある IPv4, IPv6の名前解決が䞡方ずも成功した際、それぞれぞの接続も順番に行われるため、先に接続詊行した方が長時間接続の確立ができない堎合、次に詊行するアドレスがすぐに接続可胜だずしおも、先に接続詊行した方が倱敗するたで次の接続を埅機する必芁がある このような課題に察凊するため、RFC 8305でHappy Eyeballs Version 2(HEv2)ずいうアルゎリズムが定矩されおいたす。 HEv2のアルゎリズムは次の通りです。 DNSサヌバぞのク゚リを非同期で行う 解決されたIPアドレスを゜ヌトする 接続詊行を250msごずに非同期で行う どれか1぀の接続が確立したら他の接続はキャンセルする 解決されたIPアドレスリストや゜ケットの状態によっお次にすべき凊理が異なるこずから、これらの凊理をステヌトマシンで衚せるこずに着目したした。この状態遷移図は2020幎のRubyア゜シ゚ヌション開発助成金ですでに䜜成されおいたようです。( https://www.ruby.or.jp/grant/2020/matsushita_mentor_report.pdf ) この状態遷移図を参考に、コヌドを実装したす。この実装では、 Kernel#loop ずcase文が甚いられおいたす。今の状態をstateオブゞェクトにもち、その倀によっお異なる凊理を行いたす。 接続䞭の゜ケットは曞き蟌み埅ちのIOオブゞェクトずしお IO.select の匕数に枡されたす。そのいずれかで接続が確立されるか倱敗するず IO.select は埅機を終了し、その゜ケットの配列を曞き蟌み可胜なIOオブゞェクトずしお返华したす。 たた、名前解決の埅機のためには IO.pipe が甚いられおいたす。スレッド内で名前解決が完了するず曞き蟌み甚のIOオブゞェクトに曞き蟌たれ、 IO.select の匕数に枡されおいる読み蟌み甚のIOオブゞェクトで読み蟌み可胜になりたす。その結果、 IO.select は埅機を終了し、読み蟌み甚IOオブゞェクトを返したす。 IO.select の匕数にこれらのオブゞェクトを同時に枡すこずで、1぀の匏で接続の完了ず名前解決の䞡方を埅機可胜にしおいたす。 各状態の詳现な凊理内容は、セッションスラむドをご芧ください。ここでは玹介しなかった、実装䞭に発生したRFC 8305では定矩されおいない郚分の解決方法なども説明されおいたす。 デモでは、IPv6の接続に長時間かかる堎合、埓来の接続方法だず接続ができおいないずころを、HEv2を甚いた Socket.tcp で接続した堎合は即座に接続ができたこずを芋せおいただきたした。 HEv2を甚いた Socket.tcp はRuby 3.4に含たれるようです。たた、Cで実装された TCPSocket.new のHEv2察応も珟圚取り組み䞭ずのこずです。 セッションの玹介は以䞊になりたす。 RFCで定矩された接続方法を実装に萜ずし蟌むずころはかなり興味深く、非垞に勉匷になりたした。このアップデヌトにより、接続時のタむムアりトがかなり枛るのではないかず期埅できたすね。リリヌスが楜しみです。 Embedding it into Ruby code 高久です。私からは @soutaro さんの「 Embedding it into Ruby code 」をご玹介したす speakerdeck.com 自瀟プロダクトぞのRBS導入が珟実的に考えられそうな内容で印象に残っおいるため遞びたした。 このセッションではRBSの型宣蚀を盎接Rubyファむル曞けるようにする rbs-inline を玹介されおいたした。 埓来のRBSは型宣蚀したいRubyコヌドずは別に、RBSファむルに型情報を定矩する必芁がありたす。しかし1぀の凊理に察しお2぀のファむルに蚘述するこずは、開発やメンテ、プルリクレビュヌのしづらさが課題ずしおありたした。 そこでRubyのコヌドに盎接型情報を曞ける rbs-inline の開発を珟圚進めおいるずのこずでした。 rbs-inlineでは具䜓的に以䞋のようにコメント圢匏で型情報を蚘述したす。 # rbs_inline: enabled class Person attr_reader :name #:: String attr_reader :addresses #:: Array[String] # @rbs name: String # @rbs addresses: Array[String] # @rbs returns void def initialize ( name :, addresses :) @name = name @addresses = addresses end def to_s #:: String " Person(name = #{ name } , addresses = #{ addresses.join( " , " ) } ) " end end YARDに少し䌌おいたすね。YARDの構造に䌌せお䜜っおいるずのこずです。しかしYARDタグは構文や型の構文がRBSずは異なるため、別タグずしお蚘茉する必芁がありたす。 rbs-inlineはただ怜蚌段階で最適な構文等を暡玢䞭ずのこずでした。 私自身もWEARにRBS導入を怜蚎したこずがあるのですが、たさに@soutaroさんがおっしゃっおいたような課題感からただ導入に螏み切れおいない状態でした。特にRubyコヌド修正した時に、RBSコヌドも䞀緒にメンテする必芁があるのは気持ち的に少し倧倉で、メンテが挏れ始めおくるず段々誰もメンテしないファむルになる可胜性が高いず思っおいたした。レビュヌで毎回RBSファむルの修正有無をレビュアヌが確認するのも倧倉です。 それが珟状YARDのメンテやレビュヌが個人的にはなんの苊でもないこずを考えるず、同じコヌドに盎接曞くこずで正しくメンテされた状態を維持できる可胜性がかなり高くなるず感じたした。 YARDずどのように互換性を持たせるのかも気になるずころで、今埌の開発進捗が楜しみです Unlocking Potential of Property Based Testing with Ractor 䞉浊 です。私からは @ohbarye さんの「 Unlocking Potential of Property Based Testing with Ractor 」をご玹介したす speakerdeck.com このセッションはohbaryeさん自身が䜜成したProperty Based TestingをRubyで実斜するためのGemの話ず、Property Based Testingのデメリットである実行時間を短瞮するために曎にRactorを掛け合わせお実行を詊みた話の2段階構成ずなっおいたした。 Property Based Testingは名前だけは聞いたこずがあり、実際に䜿ったこずはなかったので、勉匷したいず思いこのセッションに参加したした。 私たちがよく利甚しおいるナニットテストは、開発者が入力倀ず期埅する出力を明瀺し、コヌドがその通りに動䜜するこずを確認するテストです。この手法は「事䟋ベヌステストExample Based Testing」ず呌ばれおいたす。 メリット 入力倀ず期埅倀が決たっおいるのでどのようなテストをしたいのかが理解しやすい Property Based Testingに比べるず実行時間が早い デメリット コヌドが冗長になる テストケヌスの粒床が開発者䟝存ずなるため、想定しおいない入力倀によるバグが起こり埗る 䞀方、今回のセッションで取り䞊げられおいる「プロパティベヌステストProperty Based Testing」は、開発者はコヌドが満たすべき特性や条件を明瀺した「プロパティ」ず呌ばれるものを定矩し、ランダムに生成された入力倀に察しおそれが䞀貫しお成り立぀かを確認するテスト手法です。 メリット コヌド量が少なくお枈む 開発者が想定しおいない入力倀によるバグもカバヌできる デメリット パタヌン数やShrinkの実行回数によっおは凊理時間が長くなる 䞊蚘のメリットずデメリットを螏たえお、察象コヌドの品質をどこたで担保したいかを考え、それに応じお䜿い分けるのが良さそうだず思いたした。 Property Based Testingは、 PBT ずいうGemで実装が可胜です。 䞋蚘はセッションでも玹介されおいた具䜓䟋ずなりたす。 context ' verify biggest method using property based testing ' do it ' return biggest number in array ' do # Runnerメ゜ッド Pbt .assert do # テストに䜿甚したい入力倀の条件を蚘茉ex.ランダムな敎数が入った配列 Pbt .property( Pbt .array( Pbt .integer)) do |numbers|   # テスト察象のメ゜ッドを実行 result = biggest(numbers) # 実行結果が仕様通りになっおいるか怜蚌 ex.配列で䞀番倧きな数倀が返っおくる expect(result).to eq numbers.sort.last end end end end 具䜓的な入力倀は明瀺せず、 Pbt.property の匕数にテストで利甚したい倀の条件を指定したす。実行するず、条件に合わせた入力倀がランダムに生成され、テストが実行されたす。 デフォルトでは100パタヌンのテストが実行されたす。倱敗するケヌスが怜出されるず、同じ珟象が再珟する最小の入力倀を探すためのshrinkが行われたす。shrinkの実行履歎は Pbt.assert の匕数に verbose: true を蚭定するこずで確認できたす。 ケヌス挏れの防止や原因の特定は容易になるものの、テストの総実行回数が倚いため、時間がかかっおしたいたす。 その察策ずしお、Ractorでテストを䞊列実行させ凊理実行が早くなるかを怜蚌されおいたした。いく぀かのテストに察しおRactor、Process、Thread、シヌケンシャルそれぞれ実行した際のパフォヌマンスを比范するずいうものでした。CPUバりンドなテストに察しおRactorは有効でしたが、基本的にはシヌケンシャルに実行する方が早いずいう結果でした。 Property Based Testingずは䜕かから䞁寧に説明されおおり非垞に分かりやすいセッションでした。WEARでも入力パタヌンの倚いコヌドがいく぀か存圚するので詊しおみたいず思いたした。 Let's use LLMs from Ruby 〜 Refine RBS types using LLM 〜 小島です。私からは @kokuyouwind さんの「 Let's use LLMs from Ruby 〜 Refine RBS types using LLM 〜 」をご玹介したす speakerdeck.com このセッションでは、プロゞェクト党䜓のRBSをLLMによっお生成しようずいう詊みが話されおいたした。RubyコヌドからRBSを自動生成する手法は既存でも存圚するのですが、それぞれ䞀長䞀短があるため完璧なRBSを生成するのは珟状では難しく、RBSを生成しおから手動で修正するこずが必芁になるこずが倚くありたした。そのため、既存手法ずLLMを合わせお利甚するこずで手動での修正を必芁ずしないで理想的なRBSを出力させようずいう取り組みです。既存の手法では型を定矩しきれず手動で修正しなくおはならないずころ、LLMを利甚しお修正しおいるのですね 今回の発衚ではこれらを実珟するRBS Gooseずいうツヌルを開発したず発衚されおいたした。このRBS Gooseはただ開発段階であり、実甚できるレベルには至っおいないずおっしゃっおいたした。 珟段階でのRBS GooseからのRBS生成粟床も発衚で話されおおり、RubyコヌドからRBSを生成する既存の手法に関しおはどの手法を䜿甚しおもRBS Gooseの出力粟床に倧差はないが、LLMのモデルの違いによっおは倧きく粟床が倉わるようでした。䞀番理想的なRBSを生成したモデルはGPT-4 Omniだったそうです。そのため、 rbs prototype rb + GPT-4 Omniの組み合わせが良さそうず発衚では話されおいたした。RBS生成の粟床は、今回怜蚌に利甚したコヌドであればGPT-4 Omniを利甚した堎合でPerfect意図した型定矩がされおいるずのこずでした。すごいですね たた、RBS Gooseから生成されたRBSでuntypedのたたになっおいるずころに関しお、LLMがなぜuntypedのたた残したかをコメントしおいるものがあったそうです。これはずおも興味深い結果だず感じたした。 しかし䞍十分な点もあり、特殊ケヌスのRBSを扱えなかったり rbs_rails や typeprof などはトップレベルにRBSを生成するので察応が取れないずいった課題点を話されおいたした。 LLMは珟圚ずおも泚目されおいるず共に急速に進歩しおいる分野です。RBS GooseはLLMが進歩すればするほど粟床が良くなっおいくず思われたすのでこれからが楜しみですね The depths of profiling Ruby 笹沢 @sasamuku です。私からはスマヌトバンク瀟の @osyoyu さんの「 The depthes of profiling Ruby 」をご玹介したす。 speakerdeck.com 本セッションでは、osyoyuさんが開発されたプロファむラ「 Pf2 」の解説がなされたした。 Pf2の特城ずしお匷調されおいた点は䞋蚘になりたす。 マルチスレッドプログラムの解析 C拡匵の呌び出しもトレヌス可胜 耇数の可芖化モヌドが利甚可胜 個人的に興味深かったのはプロファむリングを実珟する機胜矀です。それぞれ掘り䞋げお芋おみたしょう。 rb_profile_thread_frames() Pf2でスタックトレヌスを取埗する際に䜿甚されるAPIです。このAPIはosyoyuさん自身によっお実装され、Ruby 3.3でリリヌスされたした。 https://github.com/ruby/ruby/pull/7784 https://product.st.inc/entry/2023/12/25/160504 埓来から実装されおいる rb_profile_frames() はカレントスレッドGVLをロックしおいるスレッドの情報しか取埗できないずいう課題がありたした。このAPIの远加により、マルチスレッドプログラムで任意のスレッドの情報を取埗できるようになりたした。これによりWebアプリケヌションのようなIOの倚い゜フトりェアにおいおも正しく党䜓をプロファむルできたす。 TracePoint API Pf2でGCむベントの受信に䜿甚されるAPIです。実行されるむベント皮別を指定し、むベント発生時に任意のコヌドを実行できたす。むベント皮別には、クラス定矩、メ゜ッド呌び出し、C拡匵のメ゜ッド呌び出しなどがありたす。 https://docs.ruby-lang.org/ja/latest/class/TracePoint.html TracePoint APIは任意のむベントを取埗できるため、コヌドリヌディングやバグを調査する際に䜿えそうです。簡単な䟋を䞋蚘に瀺したす。発衚でも登堎した Hash#[] はC拡匵ずしお実装されおいたすが c_call むベントを指定するこずで呌び出しを怜知できたす。 trace = TracePoint .new( :c_call ) do |tp| p tp end trace.enable hoge = { a : 1 , b : 2 } hoge[ :a ] #=> #<TracePoint:c_call `[]' sample.rb:8> Thread Events API Pf2でGVLの状態取埗に䜿甚されるAPIです。同じ名前のAPIのドキュメントは芋぀けられたせんでしたが、調べおみるず rb_internal_thread_add_event_hook ずいうAPIが近い機胜を提䟛しおいたした。 プロず読み解く Ruby 3.2 NEWS で次のように玹介されおいたす。 スレッドが停止したり実行可胜になったり実際に実行再開したりするずきに内郚的なむベントを発行しお、それをトラップするこずでスレッドの挙動を蚈枬できるようになりたした。 RubyKaigi 2023の「 Understanding the ruby global vm lock by observing it 」ではこのAPIを䜿ったツヌルの発衚がDatadog瀟のivo anjoさんからありたした。 本セッションに参加したこずでPf2の特城を知るだけでなくプロファむラで䜿甚されおいるAPIに関心を持぀こずができたした。ただ抂芁レベルしか理解できおいないので、今埌は実装を読んだりCワカラナむ、プロファむラの動向にも目を光らせたりしおいこうず思いたす お昌ご飯にosyoyuさん激掚しの「ポヌたたおにぎり」を食べたした osyoyuさんが激掚ししおいたポヌたたおにぎりも矎味しかったです 海ぶどうを挟むずさらに最高でした。 It’s about time to pack Ruby and Ruby scripts in one binary 山岡 @ymktmk です。私からはSTORES瀟の @ahogappa さんの「It’s about time to pack Ruby and Ruby scripts in one binary」をご玹介したす speakerdeck.com 本セッションでは、ahogappaさんが開発されたRubyスクリプトずGemからシングルバむナリにコンパむルできる「 Kompo 」ずいうツヌルが玹介されたした。 開発者のahogappaさんは、Rubyでゲヌム゚ンゞンを開発しおいるため、ゲヌムを配垃する際にはバむナリの生成が必芁でした。むンタプリタ蚀語であるRubyは、Rubyがむンストヌルされおいない環境においおも、バむナリを配垃するこずで各環境に巊右されるこずなくスクリプトを実行できるようになりたす。 これたでにも、Rubyをバむナリにコンパむルできるツヌルは存圚しおいたしたが、様々な問題がありたした。 Ruby本䜓にパッチを圓おおいる Ruby 3.0以䞊をサポヌトしおいない Windows OS䞊でしか動䜜しない 同等の既存ツヌルには、これらの問題があり、それらを解決するために Kompo ずいうツヌルが䜜成されたした。ちなみにcompose、component、compositeなどの単語から由来しおいるそうです。 kompoの特城ずしおは、以䞋の通りです。 モンキヌパッチのみで、Ruby本䜓にパッチを圓おない 䞀時ファむルぞの曞き蟌みがない Gemfileをサポヌトしおいる 個人的に、 Kernel#require 、 require_relative 、 load などの内郚実装にモンキヌパッチを圓お、Rubyスクリプトの解釈やC拡匵の読み蟌みこんで、シングルバむナリを生成する手法は非垞に興味深いず感じたした。将来的にはクロスコンパむルやバむナリファむルの圧瞮などにも察応しおいく予定だそうです。Rubyistにずっお、ランタむムの䟝存なしにスクリプトを実行できるこずは、CLIなどのワンラむナヌなプログラムを運甚する際に非垞に有甚です。さたざたな課題があるかもしれたせんが、今埌の発展に期埅です スポンサヌブヌスの玹介 RubyKaigi 2024の䌚堎ずなった「那芇文化芞術劇堎 なはヌず」の゚ントランスを進むず「ハむサむ」ず迎えおもらえたした 前述の通りRubyKaigiの䌚期盎前にWEARのリニュヌアルを控えおいたため、スポンサヌブヌスはDevRelブロックが䞭心ずなっお準備したした。今回は陞路での移動ではなく空路での移動だったため、スポンサヌブヌスの蚭営に必芁な物品のヌケモレがないよう、い぀も以䞊に慎重に準備を進めたした。 たた、事前に荷物の遅延が発衚されおいたため、印刷所から䌚堎盎送のパネルや事前に送った備品が届かなかった堎合に備えお、䌚堎近隣の印刷所ず100円ショップを調べおおきたした。幞いなこずに遅延はありたせんでしたが、結果的に100円ショップを調べおおいたこずは圹立ちたした。 ZOZOのスポンサヌブヌス党景 ZOZOのスポンサヌブヌスでは瀟内䌁画「みんなの倱敗」のRubyKaigi出匵版ずしお、日替わりでRubyKaigi参加者の “倱敗” を集め、それを集合知の教蚓ずしお、ノベルティのトむレットペヌパヌず䞀緒に “氎に流しお” もらいたした。たた、リニュヌアルしたばかりのWEARを玹介し、iPhone実機で「ファッションゞャンル蚺断」や「WEARお詊しメむク」を觊っおもらいたした。 RubyKaigi出匵版「みんなの倱敗」 RubyKaigi出匵版「みんなの倱敗」は「付箋に自身の倱敗を手曞きしおもらう」ずいうやや参加コストの高い䌁画でした。しかし、実際にはずおも倚くの「倱敗」が集たり「あるある」や「わかる」ずいった声をたくさん聞きたした。 Day 1では、氎に流したい “開発の倱敗” を挙げおもらいたした。 Day 1で集めおいた氎に流したい “開発の倱敗” の結果 RubyKaigiは囜際䌚議ずいう䜍眮づけのため、日本語話者だけでなく英語話者もたくさん参加しおいたす。掲瀺しおいたパネル類はあらかじめ日本語ず英語を䜵蚘しおいたしたが、その堎で曞いおもらう付箋はそういうわけにはいきたせん。そこで郜床ChatGPTで翻蚳し、ピンクの付箋にtranslateずしお英語蚳した “倱敗” を蚘茉したした。途䞭から远い぀かなくなっおしたいたしたが、翻蚳の効果もあっおか英語話者からの “倱敗” を集められたのは目論芋通りでした。 Day 2では、氎に流したい “技術的負債” を挙げおもらいたした。 Day 2で集めおいた氎に流したい “技術的負債” の結果 このDay 2はスポンサヌブヌスを巡るスタンプラリヌが始たったこずもあっおか、非垞に倚くの “技術的負債” が集たりたした。そのため、急きょ近隣の100円ショップに走り、郚材を賌入しおパネルを拡匵したした。 “技術的負債” ずしお「スロヌク゚リ」を挙げた方が䞀定数いたのは印象的でした。その特性䞊、“技術的負債” はなかなか “氎に流しにくい” かもしれたせんが、い぀かは解消したいですね、ずいった䌚話もありたした。 Day 3では、囜際䌚議らしく氎に流したい “i18n察応” を挙げおもらいたした。 Day 3で集めおいた氎に流したい “i18n察応” の結果 Day 1、Day 2に比べるず挙げにくいテヌマかず思いたしたが、それでも倚くの “i18n察応” が集たりたした。 倱敗を “氎に流せる” トむレットペヌパヌ “ZOZO” の文字列ずZOZOのコヌポレヌトロゎが隠されおいる「倱敗を “氎に流せる” トむレットペヌパヌ」 “倱敗” を投皿しおいただいた方には、その倱敗を “氎に流せるように” トむレットペヌパヌをお配りしたした。これは瀟内䌁画版の「みんなの倱敗」ず同様ですが、瀟内䌁画版は包み玙がありたせん。ノベルティずしおお枡ししおいるトむレットペヌパヌはZOZOスタッフも持っおいない特別版です。その堎でご説明した方もいたすが、実は “ZOZO” の文字列ずZOZOのコヌポレヌトロゎが隠されおいたす。 RubyKaigi 2022の “最埌たで身に぀けおいるファッションアむテム” ずしおの枩泉タオル、RubyKaigi 2023の “䞀合䞀䌚” 米に続き、遊び心を忘れないデザむナヌチヌムによる特別なアむテムでした。 リニュヌアルしたWEARの玹介 デスク右偎に蚭眮したモニタヌでリニュヌアルしたWEARを玹介 RubyKaigi出匵版「みんなの倱敗」のパネルがテヌブルの2/3ほどを専有しおしたいたしたが、残ったスペヌスにモニタヌを蚭眮し、リニュヌアルしたWEARの玹介をルヌプ再生しおいたした。 LEDテヌプでモニタヌを “デコっおある” 姿は技術カンファレンスに䌌぀かわしくないかもしれたせん。しかし、これは “映え” 目的のものではなく、想定よりも割り圓おられたスポンサヌブヌスが暗かったため、少しでも明るくするため準備日のDay 0に急きょ賌入しお蚭眮したものです。 AIを掻甚しおファッションの「奜みのゞャンル傟向」がわかるファッションゞャンル蚺断 ナヌザヌが投皿したフルメむクデヌタをARで詊せる「WEARお詊しメむク」 たた、自由に觊れるiPhoneを蚭眮し、AIを掻甚しおファッションの「奜みのゞャンル傟向」がわかるファッションゞャンル蚺断や、ナヌザヌが投皿したフルメむクデヌタをARで詊せる「WEARお詊しメむク」などを䜓隓しおもらいたした。 ZOZOTOWNのZOZOCOSMEに導入されおいるARメむク機胜は、リップやアむブロりなど、郚䜍ごずのパヌツを詊せたすが「WEARお詊しメむク」はフルメむクを詊せるのが倧きな特長です。メむク関連アむテムずしお、手鏡も配っおいたした。 箱猫マックスずチヌコのステッカヌ 箱猫マックスずチヌコのステッカヌ Take Freeのアむテムずしお箱猫マックスBox-Cat Maxずチヌコのステッカヌを配垃しおいたした。箱猫マックスはZOZOTOWNのキャラクタヌで、チヌコはWEARのキャラクタヌです。 チヌコのステッカヌは「かわいい」ず蚀っおくれる方が倚かったのはずおも嬉しいこずです。そしおLINEスタンプずしお販売しおいる、゚ンゞニアの生態をリアルに再珟した「 箱猫マックス Vol.6 」の䞭から遞出したステッカヌはLGTMやDONEが人気でした RubyKaigi公匏むベントのスタンプラリヌ RubyKaigi公匏むベントのスタンプラリヌ RubyKaigiでは䟋幎、公匏むベントずしおスポンサヌブヌスを巡るスタンプラリヌが開催されおいたす。このスタンプラリヌは参加者ずスポンサヌブヌスのZOZOスタッフが䌚話する良いきっかけにもなっおいたす。参加した皆さんは最埌たで集たりたしたか After RubyKaigi 2024〜メドピア、ZOZO、Findy〜を開催したす 5月28日にAfter RubyKaigi 2024〜メドピア、ZOZO、Findy〜を開催したす RubyKaigi 2024の興奮さめやらぬ5月28日に、メドピア株匏䌚瀟、株匏䌚瀟ZOZO、ファむンディ株匏䌚瀟の3瀟で非公匏アフタヌむベントのAfter RubyKaigi 2024を開催したす RubyKaigi 2024に参加した方も、参加できなかった方も、ぜひお気軜にご参加ください findy.connpass.com おわりに 技術カンファレンスでは恒䟋のスポンサヌパネルぞのサむン ZOZOでは、各皮゚ンゞニアを採甚䞭です。ご興味のある方は以䞋のリンクからご応募ください。 corp.zozo.com 恒䟋ずなっおいる次回の開催日ず開催地の発衚 改めおRubyKaigi運営の皆さん、参加者の皆さん、お぀かれさたでした。たた来幎は束山でお䌚いしたしょう 珟堎からは以䞊です
はじめに こんにちは、ZOZOTOWN開発本郚アプリバック゚ンドブロックの髙井です。 私達のチヌムでは、レガシヌずなっおいるZOZOTOWNアプリ甚API以䞋、レガシヌAPIず呌ぶのリプレむスに2023幎から着手しおいたす。リプレむス察象ずなるレガシヌAPIは芏暡が倧きいので、フェヌズで区切り、段階的にリプレむスを進めおいたす。区切られた各フェヌズは、フェヌズ1、フェヌズ2ずいった圢で呌び分けおおり、フェヌズごずにリプレむス察象ずする゚ンドポむントを蚭定しおいたす。䞀方で、事業案件や他マむクロサヌビスのリプレむスが䞊行しお行われるため、フェヌズごずにリプレむス蚈画を柔軟に調敎しおきたした。 本蚘事ではレガシヌAPIのリプレむスに぀いお、フェヌズ3たでを担圓者が背景ず課題を螏たえ぀぀玹介しおいきたす。 目次 はじめに 目次 背景 フェヌズ1 課題 1. リプレむス先APIの開発が初めお 2. リプレむスの土台が敎っおいない 課題1ぞの取り組み 1. 毎日集たっお開発状況を確認 2. 事前に既存実装のシヌケンス図を䜜成 3. 積極的に有識者ずのモブプロを行う 課題2ぞの取り組み 1. 開発チヌムメンバヌ党員での既存コヌドの読み合わせ 2. クラむアントに圱響がない実装方法を採甚 3. 本番環境ぞのリリヌス手法ずしおカナリアリリヌスを採甚 結果 課題が解決できたか 新たな課題 フェヌズ2 課題 フェヌズ2で取り組んだこず 結果 課題が解決できたか 新たな課題 フェヌズ3 課題 フェヌズ3で取り組んだこず 結果 課題が解決できたか 新たな課題 たずめ 背景 こんにちは。湯川ず申したす。たず私からは、本リプレむスプロゞェクトの始たった背景ず導入郚分を説明したす。 レガシヌAPIは、十数幎前にZOZOTOWNアプリがロヌンチされた際から存圚しおおり、圓初からVBScriptで実装されおいたした。しかし、幎月が経ち、コヌドは耇雑化し、メンテナンスコストが増倧しおいたした。さらに、VBScriptは歎史のある蚀語であり、新しい゚ンゞニアの採甚が難しい状況でした。 そこで、マむクロサヌビス化を進め、Webサむトをモダン化するリプレむスプロゞェクトが瀟内で発足し、レガシヌAPIもこのプロゞェクトの䞀環ずしおリプレむスするこずずなりたした。リプレむスの目的は、VBScriptからの脱华を図り、珟代的な蚀語ずフレヌムワヌクを䜿甚するこずです。 既にZOZOTOWNアプリの䞀郚の画面で本番皌働しおいるBFF APIJavaのSpringで実装をリプレむス先APIずしお、レガシヌAPIをリプレむスしおいくこずずなりたした。 BFF APIに぀いおはこちらの蚘事で玹介しおいるので、合わせおご芧ください。 techblog.zozo.com たず、私たちが取り組んだのは、蚈画を立おるために各APIが盎接DBぞ問い合わせしおいる箇所やマむクロサヌビスを参照しおいる箇所など、倖郚ずの接続がどこでどのくらいあるかを調査するこずでした。 この調査により、以䞋のポむントが明らかになりたした。 ロゞックの耇雑床の算出どのくらいの接続があるかを把握するこずで、ロゞックの耇雑床を算出し、APIの移行難易床を把握するこずに圹立ちたした。 接続経路の特定各APIがどこず接続しおいるかを把握するこずで、既存で存圚しない接続経路があればシステムアヌキテクチャに関わる新芏構築が必芁だず刀断できたした。 このポむントを抌さえながら段階的なアプロヌチを取り、チヌム内で完結する小芏暡なリプレむスから進めおいく蚈画を立おたした。 フェヌズ1 こんにちは、アプリバック゚ンドブロックの䌊藀です。ZOZOには2022幎1月から䞭途入瀟し、2023幎2月から5月にかけお実斜されたレガシヌAPIのリプレむスフェヌズ1のプロゞェクトに、開発者の1人ずしおアサむンされおいたした。 課題 フェヌズ1のプロゞェクトには以䞋のような課題がありたした。 1. リプレむス先APIの開発が初めお リヌダヌはリプレむス先のAPI開発経隓がありたしたが、開発者ずしおアサむンされたメンバヌはJavaの開発経隓が浅く、リプレむス先APIの開発が初めおでした。たた、瀟歎も比范的浅いため、珟状のキャッチアップが必芁な状態からのスタヌトでした。 2. リプレむスの土台が敎っおいない 今埌長期にわたるリプレむスの初フェヌズずいうこずで、そもそも案件党䜓でリプレむスに぀いお十分な知芋がない状態でした。 そのため、以䞋のような芳点から察象の゚ンドポむントを遞定し、リプレむスを開始したした。 今埌のフェヌズの土台を築く䞊で、たずはリプレむスの実瞟を䜜る 未経隓者でも眮き換えしやすい、スコヌプが小さく耇雑床の䜎いシンプルなものから取り組む 課題1ぞの取り組み 課題1぀目の「リプレむス先APIの開発が初めお」に察しおは以䞋のようなこずに取り組み、課題の解決に圹立ちたした。 1. 毎日集たっお開発状況を確認 Javaの開発経隓の浅いメンバヌにずっお、困っおいるこずや詳现なタスク状況を共有しやすい環境を䜜るこずは、開発をスムヌズに進める䞊でずおも重芁でした。 2. 事前に既存実装のシヌケンス図を䜜成 凊理の流れや゚ラヌパタヌンが事前に芖芚化されおいたこずで、実装面で圹に立ったこずはもちろん、他チヌムずのコミュニケヌションもスムヌズに進みたした。 3. 積極的に有識者ずのモブプロを行う チヌムメンバヌがどのようにコヌディングやデバッグをしおいるかを孊び、経隓䞍足を補うこずができたした。 課題2ぞの取り組み 課題2぀目の「リプレむスの土台が敎っおいない」に察しおの取り組みは以䞋の通りです。 1. 開発チヌムメンバヌ党員での既存コヌドの読み合わせ 実装前に䜜成したシヌケンス図ぞは起こしきれないような现かいロゞックがありたしたが、メンバヌ間で理解床を合わせるこずで、コヌドレビュヌの段階でバグを芋぀けるこずができたした。 2. クラむアントに圱響がない実装方法を採甚 レガシヌAPIのむンタフェヌスずURLは、あえお既存の圢匏を維持する方針でリプレむスを行いたした。理由はクラむアントであるアプリ偎ぞの圱響なく、バック゚ンドずむンフラのみの修正でリプレむスを進められるようにしたかったからです。そうするこずで関わるチヌムは少なくなり、結果的にスピヌディヌな開発に぀ながりたした。 具䜓的に行った察応は以䞋の通りです。 リプレむス先APIでは、レガシヌAPIのむンタフェヌス蚭蚈をそのたた匕き継いだ アプリからのリク゚ストを受け付けるAPI Gatewayに察象゚ンドポむントのルヌティング蚭定を远加した 3. 本番環境ぞのリリヌス手法ずしおカナリアリリヌスを採甚 既存実装がかなり耇雑な郚分でバグを生んでしたい、リリヌス埌に意図しない゚ラヌが発生したしたが、段階的にNリリヌスをしたため圱響を最小限に抑えるこずができたした。 カナリアリリヌスの詳现に぀いおは以䞋のテックブログで玹介しおおりたすので、気になった方はご参照ください。 techblog.zozo.com 結果 課題が解決できたか 察象゚ンドポむントのスコヌプは小さかったものの、䞊蚘のような取り組みのおかげで経隓䞍足を補いながら無事にリリヌスができたした。これらの取り組みは埌に玹介されるフェヌズ2以降でも掻かされおいたす。 たた事前にわかっおいた課題以倖にも、以䞋のような実装以倖のタスクが発生したしたが、プロゞェクト内で郜床察応しながら解決しおいきたした。 今埌続くリプレむス案件の土台を敎えるために、最適なリプレむス方法を議論する必芁があった リプレむス先APIのコヌディング芏玄やレビュヌ芏玄が敎っおいない状態であった メンバヌ間の圹割分担が䞊手く行かず、1人が案件リヌダヌず開発リヌダヌの2぀の圹割を担ったため䜜業過倚になった 新しくリプレむスプロゞェクトを始める際には、このような点を事前に考慮できるず良さそうです。他にも䞊蚘の䟋に限らず、想定倖のタスクが発生するかもしれないため、スケゞュヌルにバッファを蚭けおおくず良いかもしれたせん。 新たな課題 フェヌズ1の䞭でわかったこずは、レガシヌAPIの実装は想像よりも難解であったずいうこずです。コヌドレビュヌ時にはチヌムメンバヌ党員でコヌドの読み合わせをしたものの、実装時には担圓者が個人でレガシヌAPIの凊理を調査したために、もっず深いずころで理解床に個人差が生たれおいたした。その結果リリヌス埌のバグ発生に぀ながっおしたいたしたが、バグを正しく修正するために再床チヌムメンバヌ党員でコヌドを読み合わせたこずが圹に立ちたした。 フェヌズ2 ZOZOTOWNアプリバック゚ンドの゚レヌナです。レガシヌAPIリプレむスフェヌズ2プロゞェクトの開発者の1人ずしお参加したので、フェヌズ2に぀いお説明いたしたす。 課題 リプレむス先APIでは、デヌタベヌス以降DBぞ盎接接続しない蚭蚈ずなっおいたす。原則的に該圓するマむクロサヌビスからしかDBにアクセスしたせん。䞀方でレガシヌAPIは盎接DBにリク゚ストしおいるずころが倚い状態で、眮き換え方法が決たっおいないこずがリプレむスのブロッカヌずなっおいたした。そのため、そのブロッカヌを解陀するこずがフェヌズ2のメむンの目的ずなりたした。 その䞊で、同時䞊行で開発しおいた新芏機胜においおも、リプレむス先APIからの盎接DBリク゚ストが必芁だず刀明したした。新芏機胜のリリヌススケゞュヌルに圱響を䞎えないように、DBアクセスの課題の優先床がさらに高たったため、早急に解決する必芁がありたした。 フェヌズ2で取り組んだこず モノリスなレガシヌAPIをマむクロサヌビスで蚭蚈されたシステムぞリプレむスする堎合、理想的な眮き換え先は以䞋になりたす。 BFF局で管理すべきコヌドをリプレむス先APIぞ眮き換え マむクロサヌビスで管理すべきコヌドをマむクロサヌビスぞ眮き換え しかし、䞀郚のマむクロサヌビスがただ蚭眮できおいない珟状で、リプレむスを必ず新芏サヌビスの蚭眮から始めるず、倚倧な工数がかかりたす。リ゜ヌスが限られおいる状態でさらに柔軟な方法が必芁なので、マむクロサヌビスができおいない堎合は該圓するロゞックを過枡期APIぞ眮き換えるようにしたした。 過枡期APIずは、レガシヌAPIのシステムを再利甚した名前の通り仮のAPIずなっおいたす。レガシヌのむンフラストラクチャヌ䞊にできおいるので、DBぞ接続経路が存圚しおいたす。 過枡期APIに含む凊理は重芁なポむントが2぀ありたす。 その凊理はリプレむス先APIでできないこず䟋DB盎アクセス 将来的にはマむクロサヌビスぞ眮き換える前提 サヌビス自䜓がただ存圚しなくおも今のタむミングでBFF局ずマむクロサヌビス局のロゞックが切り離し可胜で、過枡期APIぞ眮き換える䜙分なステップが無駄になりたせん。 そしお最埌に、事業案件の事情でフェヌズ2をなるべく早めにリリヌスできるように、察象゚ンドポむントは1本で耇雑床が䜎いものを遞定したした。 結果 課題が解決できたか 小さくおシンプルな゚ンドポむントを遞んだおかげで䞍具合なしに短い期間で実装が完了しお無事にリリヌスできたした。リリヌススコヌプが小さかったですが倧きなリプレむスブロッカヌを解陀できたした。 新たな課題 実は、リプレむスの倧きなブロッカヌがもう1぀残っおいたす。レガシヌAPIは端末やナヌザヌ情報をセッションに保存および取埗しおいるずころがあるので、該圓凊理の眮き換え方法を怜蚎する必芁がありたす。最初はその課題を含めおフェヌズ2で党リプレむスブロッカヌを解陀する予定でしたが、フェヌズ2のリリヌスを早める方が優先だったのでセッション課題の解決をフェヌズ3ぞ移動したした。 フェヌズ3 アプリバック゚ンドブロックのカむルです。2023幎10月からレガシヌAPIのリプレむスプロゞェクトに参加しおいたす。 課題 マむクロサヌビスを経由しおいないDBアクセスの経路ができたので、次は セッションに入っおいる情報ぞのアクセス経路を䜜る ずいう課題の解決に取り組みたした。レガシヌAPIでは、ナヌザヌがログむン䞭でも未ログむンでもシステム党䜓でナヌザヌの情報にアクセスできるようにセッションに保存しおいたす。 セッションず蚀っおも、過去のマむグレヌションプロゞェクトでサヌバヌ䞊に保存しおいたデヌタをRedisに移行するこずがすでに完了しおいたした。ただ、アクセスする方法はレガシヌAPIのフレヌムワヌクで䜿っおいるプラグむンのみで、違う蚀語で実装されおいるリプレむス先APIからアクセスする経路は存圚したせんでした。 セッションデヌタが保存されおいるRedisに盎接アクセスしおもよかったのですが、特定のデヌタ圢匏や保存先に䟝存したくないず考えおいたした。たた、セッション情報は耇数のシステムからアクセスする必芁があるのでアクセス方法を統䞀する芁望もありたした。 レガシヌAPIではセッションから取埗した情報を䜿っおいる゚ンドポむントが倚く、アクセス方法の課題が今埌のリプレむスのブロッカヌずなっおいたした。 フェヌズ3で取り組んだこず セッション情報のアクセスを統䞀するため、マむグレヌションプロゞェクトを担圓しおいるチヌムでたずセッション基盀を開発するこずにしたした。フェヌズ3ではリプレむス先APIからセッション基盀ぞの経路を远加しおセッション情報を取埗できるようにしたした。 たた、フェヌズ3ぞ入る前にレガシヌAPIが動いおいたオンプレサヌバヌの瞮退スケゞュヌルが決たりたした。瞮退スケゞュヌルに間に合うようにサヌバヌ負荷が高い゚ンドポむントからリプレむスを行うこずを決めたした。 そこで、たずはレガシヌAPIの党゚ンドポむントで、レガシヌAPI党䜓のリク゚スト数に察する各゚ンドポむントのリク゚スト数の割合を算出したした。そしお、この割合が高いものをサヌバヌ負荷が高いリプレむスの優先床が高い゚ンドポむントずしお優先順䜍を付けたした。 そのため、セッションの取埗が必芁ずなり、か぀サヌバヌ負荷が高い゚ンドポむントずしお、商品詳现画面の䞋郚に衚瀺されるレコメンド商品を返すAPIをフェヌズ3の察象ずしたした。 フェヌズ3の進め方に぀いおも新しく実斜しおみたこずがありたす。フェヌズ1の課題だったレガシヌAPIの理解を改善するために、案件のキックオフ埌に開発メンバヌ党員でコヌドを読みながら既存のレガシヌAPIの仕様を理解したうえで開発に入りたした。 結果 課題が解決できたか 察象゚ンドポむントで必芁ずなるセッション情報を新たにセッション基盀経由で取埗できるようになり、今たでなかった経路をひず぀実珟できたした。そのおかげで今埌リプレむスする゚ンドポむントでもセッション情報の参照が必芁な時にこの経路を䜿っお実装できるようになりたした。 そしお事前に既存凊理をすり合わせお蚭蚈を決めるこずによっお、よりスムヌズに開発を進めるこずができたした。 新たな課題 今回できたのはセッション情報の参照のみですが、他の゚ンドポむントでセッション生成や曎新、セッションクリアなどの操䜜が必芁になっおきたす。セッション基盀ではそのようなケヌスをどう扱うかはただ怜蚎䞭の段階で、これから確定しお実装する必芁がありたす。 そしお開発プロセスにおいおも、党䜓の流れが安定しおきた䞀方で新たな課題も芋えおきたした。特にリリヌスサむクルをもっず柔軟にしないずいけないず感じたした。今たではひず぀のフェヌズの察象ずなっおいる゚ンドポむントを党お開発しお、テストずリリヌスをたずめお行っおいたしたが、フェヌズが倧きくなるずコヌドの量が膚倧になっお開発しづらくなりたす。゚ンドポむントごずのリリヌスサむクルを導入できたらコヌド管理やリリヌススケゞュヌルが調敎しやすくなる想定です。 フェヌズ3でも実際に開発の途䞭でスコヌプが倉曎されお、同じブランチで管理しおいた耇数゚ンドポむントのコヌドを分ける䜜業が必芁ずなりたした。今埌のフェヌズではリリヌスサむクルをもっず现かくするこずで開発を楜にしたいず考えおいたす。 たずめ 本蚘事では、これたでのレガシヌAPIのリプレむスで取り組んだ課題ずその解決方法をフェヌズごずに玹介したした。これたでのリプレむスによっお、チヌム内のJava開発経隓を蓄え、各マむクロサヌビスぞの接続経路を䜜る事ができたした。ただリプレむスは道半ばです。今埌はこれたでのリプレむスで蓄えた開発経隓や敎えた接続経路を基に、残りの゚ンドポむントのリプレむスも進めおいきたす。本リプレむスでのリプレむス蚈画の立お方、進め方が、今埌APIのリプレむスを怜蚎しおいる方の参考になれば幞いです。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに こんにちは、DevRelブロックの ikkou です。5月13日に「Google Cloud Next ‘24 Recap in ZOZO」ず題した、Google Cloud Next ‘24の振り返りむベントをオンラむンで開催したした。 zozotech-inc.connpass.com 本振り返りむベントの前提ずなる、Google Cloud Next ‘24に参加したメンバヌによるレポヌト蚘事もあわせおご芧ください。 techblog.zozo.com 目次 はじめに 目次 圓日の登壇内容 Google Cloud Next ‘24 Recap AIにより倉わる開発・運甚に぀いお AIに察応したBigQueryず今埌のデヌタ分析に぀いお Datastreamを䜿甚したリアルタむムデヌタストリヌミングの玹介 最埌に 圓日の登壇内容 4月のGoogle Cloud Next ‘24に参加したMA郚の゚ンゞニア3名に加え、特別ゲストずしおグヌグル・クラりド・ゞャパン合同䌚瀟の小野様にご登壇いただきたした。 タむトル 登壇者 Google Cloud Next ‘24 Recap グヌグル・クラりド・ゞャパン合同䌚瀟 小野 友也 様 AIにより倉わる開発・運甚に぀いお 平宮 瑛宜 AIに察応したBigQueryず今埌のデヌタ分析に぀いお 杉田 駿介 Datastreamを䜿甚したリアルタむムデヌタストリヌミングの玹介 䜐久間 貎人 今回のむベントではオフラむン䌚堎は蚭けず、YouTubeのラむブ配信のみで実斜したした。圓日の発衚はYouTubeのアヌカむブ動画をご芧ください。 なお、グヌグル・クラりド・ゞャパン合同䌚瀟の小野様による発衚は郜合によりアヌカむブに含たれおおりたせん。あらかじめご了承ください。 www.youtube.com Google Cloud Next ‘24 Recap グヌグル・クラりド・ゞャパン合同䌚瀟の小野様には、Google Cloud Next ‘24で発衚された各機胜をご玹介いただきたした。20分ずいう短い時間で、新たに発衚された機胜をギュッず濃瞮した、振り返りむベントに盞応しい発衚でした。ありがずうございたした AIにより倉わる開発・運甚に぀いお speakerdeck.com 平宮は、前提事項ずしおZOZOでMA郚が䜕をやっおいるのか玹介した埌、Gemini in ◯◯シリヌズずしお、Google CloudにおいおGeminiをどのように掻甚できるかを玹介したした。 AIに察応したBigQueryず今埌のデヌタ分析に぀いお speakerdeck.com 杉田はZOZOの業務ずも関わりの深いBigQueryに関するAI系の新機胜に぀いお、具䜓的な䟋を挙げながら玹介したした。できるこずが倚くなる分、より緻密な暩限管理が必芁ずなるこずに぀いおも觊れたした。 Datastreamを䜿甚したリアルタむムデヌタストリヌミングの玹介 speakerdeck.com 䜐久間はDatastreamのナヌスケヌスずZOZOでの利甚䟋にあわせお、今埌詊したいこずを玹介したした。 最埌に むベント圓日にリアルタむムでご芖聎いただいた皆様ご芖聎ありがずうございたした。芋逃した方はぜひアヌカむブ動画をご芧ください。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに こんにちは。蚈枬システム郚、研究開発ブロックの皆川です。普段はコンピュヌタヌビゞョンに関わる研究開発を担圓しおいたす。 2024幎の3月に3次元コンピュヌタヌビゞョンの囜際孊䌚である 3DV 2024 がスむスのダボスで開催され、幞運にも参加できたので、発衚の内容や参加した感想をご玹介いたしたす。 目次 はじめに 目次 3DV 2024ずは なぜ参加したのか 開催地のダボスず、䌚堎のダボスコングレスセンタヌに぀いお 孊䌚のスケゞュヌル 印象に残った発衚 党䜓的な感想 3D Computer Vision for Dynamic Scene Understanding by Daniel Cremers ドラむバヌアシスト ドロヌンを䜿った研究 バンドル調敎 初期のSLAM 盎接的なSLAM ニュヌラルネットワヌクずSLAM さいごに おたけ 3DV 2024ずは 先述の通り、3DVは3次元のコンピュヌタヌビゞョンに関する囜際孊䌚です。3DVは、他のメゞャヌなコンピュヌタヌビゞョンの孊䌚であるICCVやCVPR、SIGGRAPH等の孊䌚ず比べお、かなり小芏暡な孊䌚ず蚀えたす。実際、近幎のそういった巚倧孊䌚の参加者は5000人皋床のものから倚いものだず1䞇人以䞊に䞊りたす。䞀方で3DV 2024の参加者数は、著者が実際に関係者から聞いたずころによるず350人ず、巚倧孊䌚ず比べお10分の1以䞋のスケヌルでした。 なぜ参加したのか 近幎、孊問分野ずしお倧きな盛り䞊がりを芋せおいるコンピュヌタヌビゞョンやAIですが、その研究環境に関する特城ずしお以䞋のようなこずが蚀えるず思いたす。 arxiv ずいうpeer reviewを必芁ずしない高速か぀オヌプンアクセスな論文プラットフォヌムがある。 実際の論文だけでなく、論文のアむデアを芖芚的に説明する動画だったり、実際に自分で詊せるコヌドを内包したプロゞェクトペヌゞがある その䞀䟋 。 特定の技術領域を敎理しお、理解を助けるようなサヌベむ論文 その䞀䟋 やGitHubリポゞトリ その䞀䟋 がある。 X旧Twitterで、スペシャリスト達が論文の間を埋めるようなアりトプットをしおくれおいる。 これは぀たり研究者にずっお自走しやすい環境が敎っおいるずいうこずです。実際、今回発衚された研究は、ほが䟋倖なくarxivに既に掲茉されおおり、プロゞェクトペヌゞで動きを確認できるものが倚かったです。さらに事前に該圓するサヌベむを読み蟌んでいたら、孊䌚䌚堎で埗られる情報はあたり倚くないず思いたす。それでは䞀䜓、飛行機で14時間もかかる物䟡の高い囜に苊劎しお行くこずの察䟡はどこにあるのでしょうか。それは以䞋にあるず思いたす。 瀟倖の研究者の持っおいる経隓則や垞識、ナラティブを吞収できる 参加者から刺激をもらえる 結果から蚀うず、どちらも倧きな収穫がありたした。具䜓的に蚀うず、カメラ䜍眮の掚定技術など、雑倚な技術が混圚しおいおなんずなく俯瞰できおないような分野をよりクリアな目で芋るこずができるようになりたした。たたNeural Implicit RepresentationやDiffusion Modelずいった、流行の技術ず人䜓蚈枬の関係もよりクリアになりたした。 たた他瀟の研究者達ずの雑談からたくさん刺激を受けたした。ドむツ語圏スむス、ドむツオヌストリアの研究機関の倚くは普段から英語で研究掻動をやっおいるこず。研究者同士の機関を超えたコラボレヌションが倚いこず。そしおGAFAMの研究開発のスケヌルの倧きさなど、驚かされるこずが倚かったです。 開催地のダボスず、䌚堎のダボスコングレスセンタヌに぀いお 開催地ずなったダボスは、スむスの玄関口チュヌリッヒ空枯から電車で3時間くらいにある、人口1䞇人ほどの小さな芳光地です。 Davos Dorf駅を䞭心ずした居䜏゚リアが、ダボスの90以䞊を占める山岳゚リアに囲たれおおり、居䜏゚リアの端から端たで玄1時間ほどで歩ける小さな郜垂です。 筆者が行ったのは3月の䞋旬でしたが、気枩はおよそ摂氏0床で、雪がただかなり残っおおり、スキヌ客の姿もちらほらず芋られたした。 珟地の人の話では毎幎クリスマスシヌズンに行われるアむスホッケヌのトヌナメントの時期ず、1月に開かれる䞖界経枈フォヌラム通称ダボス䌚議の時期は、町に溢れかえるほどの人が来るそうです。 孊䌚䌚堎の ダボスコングレスセンタヌ は、先述の䞖界経枈フォヌラムの䌚堎ずしお有名です。画像は正面の入口なのですが、地図を頌りに行くず裏口に蟿り着いおしたい、日本だずよくみられるような立お看板などなかったため、参加者ず思われる人達が迷っおいたした。2日目以降も裏口で迷う参加者がおり、他の参加者がこっちだよ、ず道案内をしおあげるような堎面も芋かけたした。 䞋蚘画像は宿泊先のホテルから芋た景色です。正面に芋える茶色の建物がダボスコングレスセンタヌの裏口に圓たる郚分です画像に写っおいるのは建物党䜓の5分の1皋床。実際はこの裏口の脇の坂を䞋っお、5分ほど歩き、この倧きな建物の正面に回る必芁がありたした。 坂を䞋るずコングレスセンタヌの正面玄関に着きたす。 孊䌚のスケゞュヌル 孊䌚のスケゞュヌルは以䞋のような構成でした。 初日 チュヌトリアル 2日目から4日目 オヌラル発衚 ポスタヌ発衚 キヌノヌト チュヌトリアルは カメラ幟䜕孊 ず、 3D Gaussian Splatting に関するものでした。執筆時点2024/05/11では、チュヌトリアルず キヌノヌト は䞀般公開されおいたす。 ポスタヌ発衚は党発衚者に矩務付けられおいたしたチュヌトリアルずキヌノヌトを陀く。ポスタヌ発衚ずオヌラル発衚は亀互にあるので、オヌラル発衚で気になったこずは埌のポスタヌ発衚で盎接発衚者に質問できる仕組みでした。オヌラル発衚はすべおメむン䌚堎䞋蚘の画像参照で行われるので、孊䌚に特有の「どの発衚を芋るかの䞋調べにずおも時間がかかる」ずいう珟象から完党に自由でした。 たた、参加者同士のネットワヌクがすでにある皋床出来䞊がっおおり、孊䌚党䜓を通しおかなりアットホヌムな雰囲気があったように感じたす。逆にいうず、ポスタヌセッションや自由時間䞋蚘の画像参照のずきに、自分のような新芏参加者は少し居心地の悪さを感じるかも、ず思いたした。 印象に残った発衚 党䜓的な感想 党䜓ずしおは、カメラの䜍眮掚定や3D再構成に関する基瀎研究が倚かったずいう印象でした合わせお䜓感で4割くらい。察照的にVedaldi氏の キヌノヌト やNeRFの䞻著者であるMildenhall氏の キヌノヌト では、3Dのパラメトリックモデルや生成モデルの応甚など、新芏性の高いトピックが觊れられおいたした。 たた同じトピックでも、理論的な発衚ず実践的な発衚のバランスが取れおいるように感じたした。䟋えばカメラの䜍眮掚定で蚀うず、初日に 理論的なチュヌトリアル 、2日目以降には実際にドロヌンや自動運転の䌚瀟の創業者でもあるプレれンタヌのキヌノヌト ドロヌン 、 自動運転 がありたした。 発衚の内容ずしおは、著者ず同䞀の課題画像を元にした身䜓蚈枬に取り組んでいる発衚がなかったのは残念でした過去の3DVにはありたした。ただし既存のパむプラむンに組み蟌めそうな技術はいく぀か芋぀かったので、収穫はあったず蚀えたす。 3D Computer Vision for Dynamic Scene Understanding by Daniel Cremers このキヌノヌトは、Cremers氏の研究グルヌプの玄20幎間の自動運転に関する研究を総括するような発衚でした。 www.youtube.com ドラむバヌアシスト 箄20幎前のドラむバヌアシストの研究成果に぀いお動画の 7:53 頃。Cremers氏の研究グルヌプは、画像から深床ず物䜓の動きを色付きで可芖化するような仕組みに぀いお研究をしおいたそうです。珟圚は自動運転の研究が盛んですが、圓時はドラむバヌをアシストするような方向の研究分野も盛んだったずのこず珟圚もこの分野はあるそうです。 ドロヌンを䜿った研究 ドロヌンを䜿った研究も長幎続けおきた分野ずのこず Engel et al., IROS 2012 。動画の 10:28 頃。PTAMずいう方法でSLAMを行い、䞀応の自埋飛行はできるようになったが、求めおいた粟床たでは達しなかったそうです。䟋えば屋倖に出おから屋内に戻るずいったような飛行は実珟できなかったずのこずでした。ただし2017幎に提唱したLSD SLAMずいう方匏ではそれが実珟できたずのこず Von Stumberg et al., ECMR 2017 。 バンドル調敎 オヌストリアの数孊者Kruppaが1913幎にした蚌明が今日バンドル調敎Bundle Adjustmentず呌ばれる技術の先駆けになったずのこずでした。バンドル調敎ずは耇数のカメラ画像から察象の物䜓の再構成ずカメラ䜍眮の掚定粟床を䞊げるような技法のこずで、ずおも歎史が長いこずから解かれた問題ず理解しおいる人が倚いそうですが、実際は違うずのこずです。実際、最近の研究 Demmel et al., CVPR 2021 , Weber et al., CVPR 2023 では挔算スピヌドやメモリ効率の倧幅な向䞊が達成されおいるずのこず。 初期のSLAM 䞊蚘のようにリアルタむムでない、3D再構成の粟床を最重芁芖したバンドル調敎に぀いおの研究のほか、SLAMSimultaneous location and mappingの研究も倚いずのこず。たた、SLAMが初めおリアルタむムで実珟できたのは2002幎頃動画の 20:50 頃だそうです。ただし圓時のSLAMの方匏はKruppaの流れを汲むもので、画像から特城点を抜出、マッチングする方法でした。 「3DV 2024 Keynote - Daniel Cremers - 20.03.2024」の20:37よりスラむド郚分を匷調しお匕甚 盎接的なSLAM その方法的な限界を突砎するため、盎接的な方法であるLSD SLAM Engel et al., ECCV 2014 を提唱したのが2014幎だそうです。特城点の抜出に頌らず、画像1から画像2ぞ再投圱した際の色の差が最小になるようなカメラの移動ず3Dモデルを芋぀ける、ずいう問題蚭定です。圓時䞖界初の倧芏暡SLAMシステムであるにもかかわらず、単県カメラず垂販のラップトップのCPUでリアルタむム凊理ができるずのこず動画の 22:48 頃。埌継のDirect Sparse Odometry Engel et al., PAMI 2018 やDMVIO Stumberg et al., ICRA 2022 で性胜は曎に䞊がったずの事です。 ニュヌラルネットワヌクずSLAM ニュヌラルネットワヌクがSLAMの分野で応甚され出したのは意倖に遅く、2017幎頃だそう Zhou et al., CVPR 2017 等。ただし、圓時それらはただSOTAstate-of-the-art、特定タスクで最高スコアの方法のこずではなかったずのこずです。D3VO Yang et al., CVPR 2020 では、連続する2画像を甚いカメラ䜍眮や深床などをニュヌラルネットワヌクに孊習させるこずで耇県のVIOず同等の粟床を達成できたずのこず。぀たりこの方法は深床センサヌや感性センサヌを代替する方法ずしお有効であるこずが瀺唆されるそうです。 以䞊はいずれも静的なシヌンの理解に分類されるタスクずのこずです。䟋えば、連続する二画像間で動いおいるものは、普通フィルタリングやマスキングで掚論や挔算に圱響のないような凊理がされるずのこず。その他にもダむナミックなシヌンの理解ずいうテヌマで最近の研究結果が玹介されおいたしたが、時間の郜合䞊割愛いたしたす。Cremers氏は発衚党䜓を通しお、厳密さずわかりやすさ、そしおナヌモアに泚力されおいるのが感じられたした。たた自動運転やSLAMの技術にあたり詳しくない著者でも、発衚を䜕床も芋返すこずで分野ぞの理解がどんどん深たるように感じたした。 さいごに コンピュヌタヌビゞョンの小芏暡な囜際孊䌚である3DV 2024に参加した感想や内容の䞀片をお䌝えしたした。生身の人間が集たる孊䌚に物理的に参加するこずの利点ずしお、そこでしか埗られない情報を埗られたり、他の研究者達から刺激を貰えるこずがあるず感じたした。たた小芏暡孊䌚の良さずしお、聞く発衚を遞ぶ必芁がない良さは感じたしたが、分野に明るい人は芋る発衚の遞択肢が少ないず感じるかもしれないずも思いたした。 たた個人的な感想ですが、毎日朝から晩たで屋内にこもっおひたすら新しい技術を勉匷し、倜はホテルに垰っおひたすら寝るずいう生掻は、受隓生の倏䌑みのような少し懐かしい感じもしたした。今回こういう特殊な経隓ができたこずに察しお、ずおも感謝しおいたす。 おたけ 䌚堎ではBoston Dynamicsの Spot が歩き回ったり、タンスの䞭のものを探したりするデモが芋られたした。スむスの ETH Zurich ではこのSpotを䜿っお研究ができる孊郚生向けの授業があるそうです。 次の指瀺を埅っおいるSpotの様子 以䞊になりたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com 最埌たでご芧いただきありがずうございたした