Slide 1

Slide 1 text

AWS LambdaͰ࣮ݱ͢Δ εέʔϥϒϧͰ௿ίετ ͳWebαʔϏεߏங YAPC::Hakodate 2024 @fujiwara ౻ݪढ़Ұ࿠

Slide 2

Slide 2 text

@fujiwara ໘ന๏ਓΧϠοΫSREνʔ Ϝ ISUCON 1,2,5,11 ! ༏উ4ճ ISUCON 3,8,12ʙ14 ӡӦ(ग़୊) github.com/kayac/ecspresso Amazon ECS σϓϩΠπʔϧ github.com/fujiwara/lambroll AWS Lambda σϓϩΠπʔϧ

Slide 3

Slide 3 text

Agenda • AWS Lambdaͷجຊ • طଘͷWebΞϓϦέʔγϣϯΛLambdaԽ͢Δ • Tonamelʹ͓͚ΔϚΠΫϩαʔϏεECS→LambdaҠߦࣄྫ • LambdaͰෳ਺։ൃ؀ڥ΍αʔϏεϝογϡΛ࣮ݱ͢Δ

Slide 4

Slide 4 text

AWS Lambdaͷجຊ

Slide 5

Slide 5 text

AWS Lambdaͷجຊ FaaS = Function as a Service αʔόʔΛ͋Β͔͡Ί༻ҙͤͣɺΫϥ΢υ্ʹσϓϩΠͨ͠ ʮؔ਺ʯΛ࣮ߦ͢ΔαʔϏε ؔ਺=ʮೖྗΛड͚औͬͯ (ॲཧΛߦ͍) ग़ྗΛฦ͢΋ͷʯ use v5.40.0; sub sum ($a, $b) { return $a + $b; }

Slide 6

Slide 6 text

Lambda༻ͷ sum ؔ਺ͷྫ use v5.40.0; sub sum ($event, $context) { my $a = $event->{a}; my $b = $event->{b}; return { sum => $a + $b }; } ͜ΕΛLambdaʹσϓϩΠ(ৄࡉུ)→ʮؔ਺ʯΛݺͼग़ͤΔ $ aws lambda invoke \ --function-name sum \ --payload '{"a":1, "b":2}' \ --cli-binary-format raw-in-base64-out \ /dev/stdout {"sum":3}

Slide 7

Slide 7 text

Lambdaͷ࣮ߦϞσϧ ΠϕϯτΛܖػʹϚΠΫϩVM(Firecracker1)͕ىಈ Πϕϯτ͸AWSͷ֤छαʔϏε͔Βൃੜ/खಈͰ࣮ߦ΋Մೳ ՝ۚ͸࣮ߦ࣌ؒ(msec)ͱϝϞϦׂΓ౰ͯྔ(MB)ʹԠͯ͡ൃੜ ࣮ߦ͍ͯ͠ͳ͍ͱ͖͸՝ۚ͞Εͳ͍ 1VM͸ಉ࣌ʹ1Πϕϯτͷॲཧ͔͠͠ͳ͍ ෳ਺Πϕϯτ͕ಉ࣌ʹൃੜͨ͠Βෳ਺ͷVM͕ࣗಈతʹىಈ͢Δ (εέʔϧΞ΢τ) 1 https://github.com/firecracker-microvm/firecracker

Slide 8

Slide 8 text

WebΞϓϦέʔγϣϯΛLambdaԽ͢Δ WebΞϓϦέʔγϣϯαʔόʔ = ϦΫΤετΛड͚औͬͯϨεϙϯεΛฦ͢ = ʮؔ਺ʯͱಉ͡ LambdaԽ͢ΔϝϦοτ ࣮ߦ͍ͯ͠Δͱ͖͚ͩ՝ۚ ɹϦΫΤετ͕དྷͳ͍ͱ͖ʹ͸ίετθϩ ٸܹͳෛՙ૿ՃʹରԠ͠΍͍͢ ɹϦΫΤετ͕૿͑ͨΒࣗಈతʹεέʔϧΞ΢τ

Slide 9

Slide 9 text

LambdaͰHTTPΛॲཧ͢ΔͨΊͷํ๏ 1. Amazon API Gateway 2. Application Load Balancer(ALB) 3. Lambda Function URLs AWS͕༻ҙ͍ͯ͠ΔϚωʔδυͳ΋ͷ (ଞʹ΋Ͱ͖Δ͕ޙड़)

Slide 10

Slide 10 text

Amazon API Gateway (2015ʙ) ϦΫΤετͷϧʔςΟϯά΍ม׵ɺೝূɺೝՄͳͲߴػೳ VPC಺ʹઃஔՄɺLambdaҎ֎ͷόοΫΤϯυ΋ࢦఆͰ͖Δ Application Load Balancer(ALB) (2018ʙ) ϩʔυόϥϯαʔͷλʔήοτͱͯ͠LambdaΛ௥ՃͰ͖Δ Path/ϔομϕʔεͰͷϧʔςΟϯά VPC಺ʹઃஔՄɺίετ͸ଟগֻ͔Δ(ݻఆඅ༻) Lambda Function URLs (2022ʙ) Lambdaؔ਺/aliasʹ1:1ରԠͨ͠URLΛൃߦ(VPC಺ෆՄ) ϧʔςΟϯά͸Ͱ͖ͳ͍ɺγϯϓϧɺ௿ίετ

Slide 11

Slide 11 text

LambdaͰHTTPϦΫΤετ GET /sum?a=1&b=2 HTTP/1.1 Host: example.com ↓͜ͷϦΫΤετΛLambda͕ड৴͢Δͱ͖ͷΠϕϯτ2 { "httpMethod": "GET", "path": "/sum", "headers": {"Host": "example.com"}, "queryStringParameters": {"a": "1", "b": "2"}, } 2 (Πϝʔδ) API GW(v1,v2), ALB, Function URLͰΠϕϯτͷܗࣜ͸ඍົʹҟͳΔ

Slide 12

Slide 12 text

LambdaͰHTTPϨεϙϯε { "statusCode": 200, "headers": {"Content-Type": "application/json"}, "body": "{\"sum\":3}" } ↓͜ͷϨεϙϯεΛLambda͕ฦ͢ͱ HTTP/1.1 200 OK Content-Type: application/json {"sum":3}

Slide 13

Slide 13 text

͜ΕΛશ෦ࣗ෼Ͱॲཧ͢Δͱ… sub handler ($event, $context) { my $path = $event->{path}; if ($path eq '/sum') { # pathͷϧʔςΟϯάॲཧ my $a = $event->{queryStringParameters}->{a}; my $b = $event->{queryStringParameters}->{b}; # ϨεϙϯεΛฦ͢ return { statusCode => 200, headers => {'Content-Type' => 'application/json'}, body => encode_json({ sum => $a + $b }), }; } return { statusCode => 404, headers => { 'Content-Type' => 'text/plain' }, body => 'Not Found', }; }

Slide 14

Slide 14 text

ϑϨʔϜϫʔΫΛ࢖͍͍ͨ ͍·Ͳ͖ϧʔςΟϯά΍Ϩεϙϯεੜ੒Λࣗ෼Ͱॻ͖ͨ͘ͳ͍ use Kossy; get '/sum' => sub ($self, $c) { my $a = $c->req->param('a'); my $b = $c->req->param('b'); return $c->render_json({ sum => $a + $b }); }; ͜Ε͚ͩͰࡁΉ

Slide 15

Slide 15 text

طଘͷWebΞϓϦέʔγϣϯΛLambdaԽ͢Δ

Slide 16

Slide 16 text

HTTPϦΫΤετ/Ϩεϙϯε㱻LambdaͷΠϕϯτ ͜ͷม׵͕Ͱ͖Ε͹ैདྷͷϑϨʔϜϫʔΫΛͦͷ··࢖͑Δʂ Perlͷ৔߹ AWS::Lambda::PSGI Λ࢖͑͹؆୯ use AWS::Lambda::PSGI; my $app = require "$ENV{'LAMBDA_TASK_ROOT'}/app.psgi"; my $func = AWS::Lambda::PSGI->wrap($app); sub handle { return $func->(@_); }

Slide 17

Slide 17 text

Goͷ৔߹ fujiwara/ridge3 (2016ʙ) import "github.com/fujiwara/ridge" func main() { var mux = http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello") } ridge.Run(":8080", "/", mux) } Goͷඪ४ net/http ͷϋϯυϥΛͦͷ··࢖͑Δ Lambda্Ͱ͸ؔ਺ɺଞͷ؀ڥͰ͸HTTPαʔόͱͯ͠ಈ࡞ ίʔυ͸มߋ͢Δඞཁ͕ͳ͍(=ಉ͡όΠφϦͰOK) 3 https://github.com/fujiwara/ridge

Slide 18

Slide 18 text

ެࣜ awslabs/aws-lambda-go-api-proxy4 (2018ʙ) import "github.com/aws/aws-lambda-go/lambda" import "github.com/awslabs/aws-lambda-go-api-proxy/httpadapter" func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello") }) lambda.Start(httpadapter.New(http.DefaultServeMux).ProxyWithContext) } ࣮ߦ؀ڥΛࣗಈ൑ผ͠ͳ͍ɻhttpαʔόΛىಈ͢Δʹ͸ ࣗ෼Ͱ൑ผ or main(όΠφϦ)Λ෼͚Δ 4 https://github.com/awslabs/aws-lambda-go-api-proxy

Slide 19

Slide 19 text

΋͏ҰͭͷΞϓϩʔν AWS Lambda Web Adapter5 (2021ʙ) Lambdaؔ਺಺Ͱextension(αΠυΧʔ)ͱͯ͠ಈ࡞ طଘͷWebΞϓϦέʔγϣϯΛී௨ͷαʔόʔͱͯ͠ىಈ LWA͕LambdaͷΠϕϯτड৴→localhost΁HTTPϦΫΤετ ϨεϙϯεΛLambdaͷϨεϙϯεʹม׵ͯ͠ฦ͢ ίʔυʹखΛೖΕͣʹɺैདྷͷWebΞϓϦέʔγϣϯΛLambda ্Ͱಈ͔͢͜ͱ͕Ͱ͖Δ 5 https://github.com/awslabs/aws-lambda-web-adapter

Slide 20

Slide 20 text

https://aws.amazon.com/jp/builders-flash/202301/lambda-web- adapter/ ΑΓҾ༻

Slide 21

Slide 21 text

Tonamelʹ͓͚ΔECS→LambdaҠߦࣄྫ

Slide 22

Slide 22 text

Tonamel tonamel.com ΧϠοΫ͕։ൃɾӡӦ͍ͯ͠ΔeεϙʔπେձࢧԉαʔϏε

Slide 23

Slide 23 text

τʔφϝϯτͬͯԿʁ ී௨ͷਓ͕૝૾͢Δʮτʔφϝϯτʯ=ʮߕࢠԂͷ͋Εʯ ӳޠతʹ͸ʮτʔφϝϯτʯ=ʮେձʯ ࣮͸ଞͷʮτʔφϝϯτʯܗࣜ΋͋Δ

Slide 24

Slide 24 text

τʔφϝϯτܗࣜ - উͪ࢒Γઓ γϯάϧΠϦϛωʔγϣϯ ⭐ 6 ɹ1ճෛ͚ͨΒऴΘΓ ɹ೔ຊޠͰ୯ʹʮτʔφϝϯτʯͱݴͬͨΒେ఍͜Ε μϒϧΠϦϛωʔγϣϯ ⭐ ɹ2ճෛ͚ͨΒऴΘΓɺ1ճෛ͚ͨΒഊऀαΠυʹ·ΘΔ ɹΦϦϯϐοΫͷॊಓ͸มଇμϒϧΠϦϛωʔγϣϯ εςοϓϥμʔ ϓϩ໺ٿΫϥΠϚοΫεγϦʔζͷ͋Ε 6 ⭐ ͸TonamelͰαϙʔτ͍ͯ͠Δܗࣜ

Slide 25

Slide 25 text

τʔφϝϯτܗࣜ - άϧʔϓઓ ૯౰ͨΓઓ ɹશһ͕શһͱରઓ͢Δ ɹϓϩ໺ٿ΍JϦʔάͷϦʔάઓ εΠευϩʔ ⭐ ɹશͯͷࢀՃऀ͕΄΅ಉ͡ࢼ߹਺ʹͳΔΑ͏ʹରઓ͢Δ ɹ΄΅ಉ͡ઓ੷ͷࢀՃऀಉ͕࢜ରઓ͢ΔΑ͏ʹ૊Έ߹Θͤ(ෳ ࡶ) TonamelΛ࢖͏ͱෳࡶͳεΠευϩʔ΋؆୯ʹ։࠵Ͱ͖Δ

Slide 26

Slide 26 text

TonamelͷΞʔΩςΫνϟ 2017೥ ϦϦʔε Amazon EC2 + Perl + MySQL(Aurora) + Redis(ElastiCache) ͍ΘΏΔී௨ͷϞϊϦγοΫWebΞϓϦέʔγϣϯ 2020೥ EC2 → ECS & GoͰϚΠΫϩαʔϏε ຊମͷWebΞϓϦέʔγϣϯ(Perl)ͷػೳΛ GoͰ࣮૷͞ΕͨϚΠΫϩαʔϏεʹҠߦ͍ͯ͘͠ ৽ػೳ͸جຊతʹGoͰ࣮૷ վम͸͍ܰ͘͝΋ͷͳΒPerlͰɺେ͖͍΋ͷ͸GoͰ

Slide 27

Slide 27 text

ݱࡏ10Ҏ্ͷϚΠΫϩαʔϏε͕Քಇத 7 ΞΧ΢ϯτ,ηογϣϯ,νϟοτ,௨஌ τʔφϝϯτද؅ཧ (ECS→Lambda) େձ؅ཧ εϙϯαʔ؅ཧ ՝ۚ؅ཧ ৆ۚϓʔϧ؅ཧ ֎෦API webhook etc... 7 https://speakerdeck.com/mackee/the-migrating-to-microservices-in-go-from- monolith-in-perl

Slide 28

Slide 28 text

TonamelͷαʔϏεಛੑ ීஈ͸ͦ͜·ͰΞΫηε͕ଟ͘ͳ͍͕ େձ͕։࠵͞ΕΔͱٸܹʹϦΫΤετ͕૿Ճ τʔφϝϯτද؅ཧαʔϏεͷAPIϦΫΤετ਺(2෼Ͱ20ഒ)

Slide 29

Slide 29 text

༧ଌΦʔτεέʔϧ ෛՙ௥ैͷΦʔτεέʔϧͰ͸ରԠͰ͖ͳ͍ͨΊ υϝΠϯ஌ࣝΛݩʹෛՙΛ༧ଌͯ͠ࣄલεέʔϧ͢Δ8 େձ͕։࠵͞ΕΔ೔࣌ɺن໛͸ࣄલʹ෼͔Δ(DBʹ͋Δ) աڈͷσʔλ͔Βओ࠵ऀஂମผʹ܎਺Λֻ͚ͯෛՙΛ༧ଌ (ਓؾͷ͋Δஂମ͸ࢀՃऀҎ֎ͷӾཡऀ΋ଟ͍) 30෼͝ͱʹ࣍ͷ30෼ؒͷෛՙΛ༧ଌͯ͠εέʔϧΞ΢τ 8 https://techblog.kayac.com/tonamel-spike-access

Slide 30

Slide 30 text

༧ଌ͸༧ଌͳͷͰ֎ΕΔ(͜ͱ͕͋Δ) աখʹ༧ଌ → ෛՙʹ଱͑ΒΕͣʹো֐ Ұ൪ར༻ऀ͕࢖͍͍ͨλΠϛϯάͳͷͰαʔϏεͷՁ஋௿Լ ա৒ʹ༧ଌ → ༨৒Ϧιʔε͕ແବͳίετʹ ࣮ࡍʹ2024೥લ൒Ͱ͸ෛՙ௥ैʹࣦഊͨ݁͠Ռ ฏۉͰ݄ʹ1ճఔ౓ͷো֐͕ൃੜ͍ͯͨ͠

Slide 31

Slide 31 text

ECS → LambdaͰղܾ? ίετ࡟ݮͱෛՙ௥ैੑͷ޲্ͷͨΊ τʔφϝϯτද؅ཧαʔϏεΛ ECS → LambdaʹҠߦ 2024೥7݄ʹҠߦޙ ෛՙ௥ैʹࣦഊͨ݁͠Ռͷো֐͸ͳ͠! ίετͷେ෯࡟ݮʹ΋੒ޭ !

Slide 32

Slide 32 text

ECS → Lambda ҠߦͰ΍ͬͨ͜ͱ net/http.Server → fujiwara/ridge αΠυΧʔͷॲཧΛ֎ʹग़͢ Fluentd: ϩάసૹ katsubushi: IDൃߦϛυϧ΢ΣΞ ΞϓϦέʔγϣϯͷίʔυࣗମ͸มߋͳ͠ पล෦ͷΈͷมߋͰLambdaʹҠߦͰ͖ͨ

Slide 33

Slide 33 text

FluentdͷҠߦ ECSͰ͸FirelensͰFluentd→Kinesis Data Streamsʹૹ৴ ϩάॲཧج൫ͷ౎߹্ɺ͜ͷߏ੒͸େ͖͘ม͑ͮΒ͍ ଞͷECSαʔϏεͰಈ͍͍ͯΔFluentdʹ in_http Λ௥Ճ Internal ALBͷλʔήοτͱͯ͠૊ΈࠐΈ LambdaͷϦΫΤετॲཧͷ࠷ޙʹόοϑΝͨ͠stdoutΛ FluentdʹHTTPͰૹ৴͢Δ

Slide 34

Slide 34 text

katsubushi ͷҠߦ github.com/kayac/go-katsubushi Int64ͷIDΛൃߦ͢Δϛυϧ΢ΣΞ DBͷauto incrementΛ࢖Θͣʹߴ଎ʹ int64ͷҰҙͳIDΛൃߦ͢Δ memcached protocol(text/binary) HTTP, gRPC ʹରԠ ʲࢀߟʳYAPC::Fukuokaͷൃද9,blog10 10 https://techblog.kayac.com/katsubushi-introduction.html 9 https://speakerdeck.com/fujiwara3/katsubushi

Slide 35

Slide 35 text

Before → After ઐ༻ECSαʔϏε͸࡞͍ͬͯͳ͍ (ଞͷαʔϏεͷαΠυΧʔΛڞ༻)

Slide 36

Slide 36 text

Ҡߦखॱ Internal ALBͷλʔήοτͱͯ͠ECSͱLambdaΛ྆ํ௥Ճ ՃॏϧʔςΟϯάͰঃʑʹτϥϑΟοΫΛҠߦ Lambda:ECS = 10:90 → 50:50 → 100:0 ண໨఺ ෛՙ͕૿Ճͨ͠λΠϛϯάͰCold Start͕ൃੜ͢Δ͸ͣ ͜ͷλΠϛϯάͰϨΠςϯγ͕૿Ճ͢ΔՄೳੑ͕͋Δ͕…? ⭕ ϩάͰ͸1ඵҎ಺ͰىಈͰ͖͍ͯΔ ⭕ ALBܦ༝ͰͷϨΠςϯγ΋໰୊ͳ͠

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

σϓϩΠ΋Ҡߦ ECS → Lambda ECSͷσϓϩΠ͸ kayac/ecspresso11 Ͱ౷Ұ͍ͯ͠Δ ECSͷλεΫఆٛ΍αʔϏεͷఆٛΛJSON/JsonnetͰ؅ཧ ECSͷΈΛର৅ͱ͍ͯ͠Δ ɹଞͷϦιʔεͷ؅ཧ͸TerraformͰ ɹઃఆϑΝΠϧ͔ΒtfstateΛࢀরͯ͠IDͳͲΛղܾͰ͖Δ 11 github.com/kayac/ecspresso

Slide 39

Slide 39 text

LambdaͷσϓϩΠ LambdaͷσϓϩΠ͸ fujiwara/lambroll12 Ͱ Lambdaؔ਺ͷઃఆΛJSON/JsonnetͰ؅ཧ ɹίʔυ͸zipԽͯ͠Ξοϓϩʔυͯ͘͠ΕΔ / Image΋αϙʔτ LambdaͷΈΛର৅ ɹଞͷϦιʔεͷ؅ཧ͸TerraformͰ ɹઃఆϑΝΠϧ͔ΒtfstateΛࢀরͯ͠IDͳͲΛղܾͰ͖Δ 12 github.com/fujiwara/lambroll

Slide 40

Slide 40 text

ecspresso & lambroll ࢖͍উख/πʔϧ͕؅ཧ͢Δൣғ͕΄΅ಉ͡ ECSͱLambdaΛಉ࣌ʹѻͬͯ΋ҧ࿨ײ͕ͳ͍ ͳͥͳΒ࡞ऀ͕ಉ͔ͩ͡Β… CircleCIͷσϓϩΠύΠϓϥΠϯʹlambrollΛ૊ΈࠐΈ ECSͱҰॹʹσϓϩΠ

Slide 41

Slide 41 text

ෳ਺։ൃ؀ڥ΍αʔϏεϝογϡΛ࣮ݱ͢Δ

Slide 42

Slide 42 text

։ൃ/ϓϨϏϡʔ؀ڥ͸? ։ൃ࣌ ridge / AWS::Lambda::PSGIΛ࢖͑͹ ͦͷ··ϩʔΧϧͰಈ͔ͤΔ ϓϨϏϡʔ؀ڥ ECSͰ͸ mirage-ecs acidlemon/mirage-ecs13 ECSͰ޷͖ͳ͚ͩ։ൃ؀ڥΛ࡞ΕΔ ؀ڥ͝ͱʹURLΛൃߦͯ͠ϧʔςΟϯά (proxy)ͯ͘͠ΕΔϛυϧ΢ΣΞ14 14 https://speakerdeck.com/fujiwara3/yapc-hiroshima-2024 13 github.com/acidlemon/mirage-ecs

Slide 43

Slide 43 text

LambdaͰ΋ϓϨϏϡʔ؀ڥ ࡞Γ·ͨ͠ fujiwara/lamux15 Lambda multiplexer URLͰaliasΛ൑ผͯ͠invoke͢Δ foo.example.com → invoke alias=foo bar.example.com → invoke alias=bar ݺͼग़͠ઌͷؔ਺͸HTTPॲཧ͢Δલఏ (ෳ਺ؔ਺ͷinvokeʹ΋ରԠ) 15 https://github.com/fujiwara/lamux

Slide 44

Slide 44 text

LamuxͰService Mesh lamux͸extensionͱͯ͠΋ಈ࡞͢Δ extensionͱͯ͠ಈ࡞͢Δ৔߹ 1.LambdaͷΠϯελϯε্Ͱlisten 2.HTTPϦΫΤετΛड৴ͯ͠ଞͷؔ਺/ aliasΛInvoke foo.sv1.example.com → invoke sv1:foo bar.sv2.example.com → invoke sv2:bar = αʔϏεϝογϡͷσʔλϓϨʔϯ ίϯτϩʔϧϓϨʔϯ͸Lambdaࣗମ

Slide 45

Slide 45 text

Lamux ͷ࣮ྫ perlbatross.kayac.com ΧϠοΫఏڙͷίʔυΰϧϑاը Perlbatross16 WebApp͸LambdaͰಈ࡞ Perl / Kossy / AWS::Lambda::PSGI / Aurora PostgreSQL ίϯςφΠϝʔδͰLambdaʹσϓϩΠ 16 https://perlbatross.kayac.com/

Slide 46

Slide 46 text

ίʔυΰϧϑ=೚ҙίʔυ࣮ߦ WebAppͷLambdaͰ͸࣮ߦͨ͘͠ͳ͍ ίʔυ࣮ߦ༻ؔ਺ΛඇVPCʹ഑ஔ (֎෦΁ͷ௨৴΋શͯःஅ͓ͯ͘͠) webapp͔Βlamuxܦ༝Ͱݺͼग़͢ (HTTP) αʔϏεؒ௨৴ΛHTTPʹ͓͚ͯ͠͹ LambdaͰ΋खݩͰ΋(ECSͰ΋) ಉ͡Α͏ʹಈ࡞͢Δ

Slide 47

Slide 47 text

࠷ޙʹ طଘͷWebΞϓϦέʔγϣϯΛLambdaԽ͢Δͷ͸೉͘͠ͳ͍ LambdaԽ͢ΔϝϦοτ - ٸܹͳෛՙ૿ՃʹରԠ͠΍͍͢ - ࣮ߦ͍ͯ͠ͳ͍ͱ͖͸ίετθϩ (ࠓճ͸ॻ͍ͯͳ͍͚Ͳ)޲͔ͳ͍αʔϏε΋͋Δ - IO(ωοτϫʔΫ)଴͕ͪଟ͍ͱίεύ͕ѱ͍ - ΞΫηεͷ૿ݮ͕গͳ͍αʔϏεͩͱׂߴ - ҆ఆͨ͠௿ϨΠςϯγ(1ܻmsec)͸೉͍͠