Slide 1

Slide 1 text

࣮ફϓϩμΫγϣϯαʔόʔϨε "84$%,ͱ5ZQF4DSJQUʹΑΔ 8FCΞϓϦέʔγϣϯ։ൃύλʔϯ ࿨ా༞հ

Slide 2

Slide 2 text

αʔόʔϨε Web ΞϓϦέʔγϣϯΛຊ൪؀ڥʹσϓϩΠ͢Δ ࠓ೔ͷ࿩

Slide 3

Slide 3 text

Slide 4

Slide 4 text

͜ͷܗΛߟ͑Δεςοϓ·ͰͲ͏ͨͲΓͭ͘ͷʁ ύλʔϯ͸Θ͔͚ͬͨͲͲ͏σϓϩΠ͢Δͷʁ

Slide 5

Slide 5 text

ຊηογϣϯͷ໨త αʔόʔϨεΞϓϦέʔγϣϯΛϓϩμΫγϣϯσϓϩΠ ͢ΔϋʔυϧΛԼ͛Δ Ξϓϩʔνɿ ΞϓϦέʔγϣϯσϓϩΠ·ͰͷεςοϓΛ໌Β͔ʹ͢Δ σϓϩΠՄೳੑ͕༗༻Ͱ͋Δ͜ͱΛࣔ͢ ۩ମతͳઃܭύλʔϯΛه࿥ʹ࢒͢

Slide 6

Slide 6 text

࿩͢͜ͱɾ࿩͞ͳ͍͜ͱ ࿩͢ "84ʹΑΔαʔόʔϨεΞϓϦέʔγϣϯ ΞϓϦέʔγϣϯઃܭɺσϓϩΠઓུ ࿩͞ͳ͍ (PPHMF$MPVE1MBUGPSNɼ.JDSPTPGU"[VSF ૊৫ɺίϥϘϨʔγϣϯɺ։ൃख๏

Slide 7

Slide 7 text

$POUFOUT αʔόʔϨεͷಘҙͳ͜ͱɾۤखͳ͜ͱΛ࠶֬ೝ͢Δ σϓϩΠ·Ͱͷεςοϓͱ"84$%, "84ͰͷΞϓϦέʔγϣϯύλʔϯ ͦͯ͠ϞμϯΞϓϦέʔγϣϯ΁

Slide 8

Slide 8 text

$POUFOUT αʔόʔϨεͷಘҙͳ͜ͱɾۤखͳ͜ͱΛ࠶֬ೝ͢Δ σϓϩΠ·Ͱͷεςοϓͱ"84$%, "84ͰͷΞϓϦέʔγϣϯύλʔϯ ͦͯ͠ϞμϯΞϓϦέʔγϣϯ΁

Slide 9

Slide 9 text

લఏɿαʔόʔϨεͷఆٛ ΦϯϓϨϛε Ϋϥ΢υ FaaS Ϛωʔδυ αʔϏε ΞϓϦέʔγϣϯ ϥϯλΠϜ ϛυϧ΢ΣΞ OS Ծ૝Խج൫ ϋʔυ΢ΣΞ Ϣʔβʔ Ϣʔβʔ Ϋϥ΢υϕϯμʔ Ϣʔβʔ Ϋϥ΢υϕϯμʔ Ϋϥ΢υϕϯμʔ αʔϏε੹೚Ϟσϧ

Slide 10

Slide 10 text

લఏɿαʔόʔϨεͷఆٛ ΦϯϓϨϛε Ϋϥ΢υ FaaS Ϛωʔδυ αʔϏε ΞϓϦέʔγϣϯ ϥϯλΠϜ ϛυϧ΢ΣΞ OS Ծ૝Խج൫ ϋʔυ΢ΣΞ Ϣʔβʔ Ϣʔβʔ Ϋϥ΢υϕϯμʔ Ϣʔβʔ Ϋϥ΢υϕϯμʔ Ϋϥ΢υϕϯμʔ αʔϏε੹೚Ϟσϧ ͜ΕΒΛ૊Έ߹ΘͤΔ͜ͱ

Slide 11

Slide 11 text

'BSHBUF͸ "VSPSB4FSWFSMFTT͸ʁ ࿩ΛΘ͔Γ΍͘͢͢ΔͨΊʹɺຊηογϣϯͰ͸αʔ όʔϨεͷର৅ʹؚΊ·ͤΜ 71$͕ొ৔͢ΔͱɺαʔϏεؒ࿈ܞʹ͓͍ͯϓϥΠϕʔτ ωοτϫʔΫΛҙࣝ͢Δඞཁ͕ग़ͯ͘ΔͨΊͰ͢ ͱͯ΋ศརͰɺڧྗͰɺΞϓϦέʔγϣϯߏஙͷબ୒ࢶͱͯ͠ ັྗతͰ͢

Slide 12

Slide 12 text

αʔόʔϨε͕ಘҙͳ͜ͱϏδωεޮՌͱ͸ αʔϏεΠϯ· Ͱͷ࣌ؒΛ୹ॖ ୹ظ࣮૷࣮ݱ ػձଛࣦ๷ࢭ ӡ༻ɾอकͷ লྗԽ αʔϏε඼࣭҆ఆԽ ಺੡Խ֦େͷࢧԉ ΞδϦςΟ޲্ ݱ৔ཁٻͷਝ଎࣮૷ αʔόʔϨεͷޮՌͱ͸? https://aws.amazon.com/jp/serverless/patterns/serverless-benefit/

Slide 13

Slide 13 text

αʔόʔϨε͕ಘҙͳ͜ͱ αʔϏεͱ'BB4Λ૊Έ߹ΘͤͯϢʔεέʔεͷҰ෦Λૣظࢢ৔౤ೖՄೳ wطଘγεςϜͷҰ෦Λஔ͖׵͑ w৽͍͠Ϗδωεͷ1SPPGPG$PODFQU wϚΠΫϩαʔϏεͱͯ͠ఆٛͨ͠γεςϜͷߏங 1BZBTZPVHPʢ࢖ͬͨ෼͚ͩ՝ۚʣʹΑΔίετ࠷దԽ wར༻࣌ؒଳ͕ܾ·͍ͬͯΔ؅ཧը໘ͳͲͷΞϓϦ wಛఆͷ࣌ظ͚ͩՔಇ͢ΔΩϟϯϖʔϯαΠτ wσόΠε͕ͲΜͲΜ૿͍͑ͯ͘*P5όοΫΤϯυ

Slide 14

Slide 14 text

αʔόʔϨε͕ۤखͳ͜ͱ ϦϨʔγϣϯʹΑͬͯσʔλΛ࿈ܞ͢ΔλΠϓͷγεςϜ w4'"ɺ$3. τϥϯβΫγϣϯ͕සൟ͔ͭେྔʹൃੜ͢ΔγεςϜ wۜߦ ௿ϨΠςϯγ͕ٻΊΒΕΔγεςϜ wΦϯϥΠϯ'14ήʔϜͷαʔόʔ

Slide 15

Slide 15 text

͜͜·Ͱͷ·ͱΊ αʔόʔϨεΞϓϦέʔγϣϯ͸ಛఆͷϢʔεέʔεɺҰ෦ͷ αʔϏεΛ࣮૷ͯ͠ૉૣ͘ࢢ৔ʹ౤ೖ͢Δ͜ͱ͕ಘҙ τϥϯβΫγϣϯ΍௿ϨΠςϯγ͕ٻΊΒΕΔγεςϜ͸ۤख

Slide 16

Slide 16 text

$POUFOUT αʔόʔϨεͷಘҙͳ͜ͱɾۤखͳ͜ͱΛ࠶֬ೝ͢Δ σϓϩΠ·Ͱͷεςοϓͱ"84$%, "84ͰͷΞϓϦέʔγϣϯύλʔϯ ͦͯ͠ϞμϯΞϓϦέʔγϣϯ΁

Slide 17

Slide 17 text

ຊηογϣϯͷ໨త αʔόʔϨεΞϓϦέʔγϣϯΛϓϩμΫγϣϯσϓϩΠ ͢ΔϋʔυϧΛԼ͛Δ Ξϓϩʔνɿ ΞϓϦέʔγϣϯσϓϩΠ·ͰͷεςοϓΛ໌Β͔ʹ͢Δ σϓϩΠՄೳੑ͕༗༻Ͱ͋Δ͜ͱΛࣔ͢ ۩ମతͳઃܭύλʔϯΛه࿥ʹ࢒͢

Slide 18

Slide 18 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ ։ൃલ ཁ͕݅αʔόʔϨεʹ߹க͍ͯ͠Δ͜ͱΛ֬ೝ͢Δ AWS ΞΧ΢ϯτ΁ͷαʔϏε഑ஔΛܾΊΔ ֎෦ΠϯλʔϑΣʔεΛઃܭ͢Δ

Slide 19

Slide 19 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ αʔόʔϨε։ൃܾఆޙ AWS CDK ͷ࠾༻Λݕ౼͢Δ ιʔεϦϙδτϦΛ࡞ͬͯσϓϩΠ͢Δ DEV, STG, PRD ؀ڥ΁σϓϩΠͰ͖ΔΑ͏ʹ͓ͯ͘͠ σϓϩΠՄೳͳ CI /CD ύΠϓϥΠϯΛ૊Ή

Slide 20

Slide 20 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ σϓϩΠͰ͖ͨΒ AWSߏ੒Λઃܭ͢Δ ΞϓϦέʔγϣϯΛ࣮૷͍ͯ͘͠ PRD΁σϓϩΠ ຊ൪Քಇ

Slide 21

Slide 21 text

ઌʹσϓϩΠՄೳͳঢ়ଶΛ֫ಘ͠ɺҡ࣋͢Δ Ұ؏ͨ͠ํ਑

Slide 22

Slide 22 text

ͳͥʁ Ϋϥ΢υΞϓϦͷҰ൪ͷน͸ɺσϓϩΠͱ݁߹ *".ϙϦγʔɺϦιʔε੍ݶɺΠϕϯτۦಈαʔϏεͷൃՐͳ Ͳɺ࣮؀ڥͰ͔͠Θ͔Βͳ͍͜ͱ͕ͨ͘͞Μ͋Δ ͜Ε͕ϓϩμΫγϣϯσϓϩΠʹ͋ͨͬͯͷҰ൪ͷ৺ཧతɺ࣌ ؒత՝୊ͩͱߟ͑Δ ͳΒ͹ɺૣ͍ஈ֊Ͱ͜ͷ՝୊ΛͭͿͯ͠͠·͓͏ͱ͍͏ൃ૝

Slide 23

Slide 23 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ ։ൃલ ཁ͕݅αʔόʔϨεʹ߹க͍ͯ͠Δ͜ͱΛ֬ೝ͢Δ AWS ΞΧ΢ϯτ΁ͷαʔϏε഑ஔΛܾΊΔ ֎෦ΠϯλʔϑΣʔεΛઃܭ͢Δ

Slide 24

Slide 24 text

ཁ͕݅αʔόʔϨεʹ߹க͍ͯ͠Δ͜ͱΛ֬ೝ͢Δ ௿ϨΠςϯγ΍ಉ࣌ʹेݸҎ্ͷτϥϯβΫγϣϯ͕ٻ ΊΒΕ͍ͯͳ͍͔ͳͲɺۤख෼໺Λ͖͚ͭͭΕ͍ͯͳ͍ ͔ΛνΣοΫ͢Δ

Slide 25

Slide 25 text

ϏδωεαΠυͱͷڠྗ͕ඞਢ ͜͜ͰαʔόʔϨε͕߹Θͳ͍Ͱ͢Ͷɺͱ͍͏൑அ΋े ෼͋Γ͑Δ ͦͷܾஅ͸ɺεςʔΫϗϧμʔશһ͕ڵຯΛ࣋ͪɺશһ ͕ೲಘ͢Δ͜ͱ͕ඞਢ

Slide 26

Slide 26 text

ࣄྫ঺հɿ4#(JGU༷

Slide 27

Slide 27 text

ࣄྫ঺հɿ4#(JGU༷

Slide 28

Slide 28 text

ࣄྫ঺հɿ4#(JGU༷ ͢ͰʹαʔόʔϨεͷಘҙྖҬΛཧղ͓ͯ͠Γ ࠷ॳ͔Βద༻ൣғΛߜ͍͍ͬͯͨͩͨ͜ͱ͕੒ޭཁҼ

Slide 29

Slide 29 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ ։ൃલ ཁ͕݅αʔόʔϨεʹ߹க͍ͯ͠Δ͜ͱΛ֬ೝ͢Δ AWS ΞΧ΢ϯτ΁ͷαʔϏε഑ஔΛܾΊΔ ֎෦ΠϯλʔϑΣʔεΛઃܭ͢Δ

Slide 30

Slide 30 text

"84ΞΧ΢ϯτ΁ͷαʔϏε഑ஔΛܾΊΔ σϓϩΠ͢ΔͨΊʹඞཁͳࡐྉͷͻͱͭ AWSΞΧ΢ϯτ DEV؀ڥ %&7 αʔϏε# AWSΞΧ΢ϯτ PRD؀ڥ AWSΞΧ΢ϯτ αʔϏεA αʔϏε$ αʔϏε" αʔϏε# αʔϏε$ 13% αʔϏε" %&7 AWSΞΧ΢ϯτ αʔϏεB 13% %&7 AWSΞΧ΢ϯτ αʔϏεC 13%

Slide 31

Slide 31 text

"84ΞΧ΢ϯτ΁ͷαʔϏε഑ஔΛܾΊΔ AWSΞΧ΢ϯτ DEV؀ڥ %&7 αʔϏε# AWSΞΧ΢ϯτ PRD؀ڥ AWSΞΧ΢ϯτ αʔϏεA αʔϏε$ αʔϏε" αʔϏε# αʔϏε$ 13% αʔϏε" %&7 AWSΞΧ΢ϯτ αʔϏεB 13% %&7 AWSΞΧ΢ϯτ αʔϏεC 13% ͪ͜Β͕͓͢͢Ί

Slide 32

Slide 32 text

"84ΞΧ΢ϯτ΁ͷαʔϏε഑ஔΛܾΊΔ AWSΞΧ΢ϯτ DEV؀ڥ %&7 αʔϏε# AWSΞΧ΢ϯτ PRD؀ڥ AWSΞΧ΢ϯτ αʔϏεA αʔϏε$ αʔϏε" αʔϏε# αʔϏε$ 13% αʔϏε" %&7 AWSΞΧ΢ϯτ αʔϏεB 13% %&7 AWSΞΧ΢ϯτ αʔϏεC 13% ͪ͜Β͕͓͢͢Ί - ΞΧ΢ϯτ͝ͱͷϦιʔε্ݶʹͻ͔͔ͬΓʹ͘͘ͳΔ - ΞΧ΢ϯτͷϥϯχϯάίετ = αʔϏεͷϥϯχϯάίετ - ৽͍͠αʔϏεΛ౤ೖ͢Δͱ͖ɺطଘͷՔಇதαʔϏεΛؾʹʹ͠ͳ͘ ͯΑ͍

Slide 33

Slide 33 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ ։ൃલ ཁ͕݅αʔόʔϨεʹ߹க͍ͯ͠Δ͜ͱΛ֬ೝ͢Δ AWS ΞΧ΢ϯτ΁ͷαʔϏε഑ஔΛܾΊΔ ֎෦ΠϯλʔϑΣʔεΛઃܭ͢Δ

Slide 34

Slide 34 text

֎෦ΠϯλʔϑΣʔεΛઃܭ͢Δ ৄࡉ·Ͱ٧ΊΔඞཁ͸ͳ͘ɺཁ͢ΔʹʮͲ͏ݴ͏ܗͰ αʔϏεΛ࢖ͬͯ΋Β͏͔ʯΛܾΊΔ 3&45"1*ɺ(SBQI2-"1* ΩϡʔΠϯά 4JOHMF1BHF"QQMJDBUJPO ϑΝΠϧΞοϓϩʔυ

Slide 35

Slide 35 text

͊͞։ൃͩ

Slide 36

Slide 36 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ αʔόʔϨε։ൃܾఆޙ AWS CDK ͷ࠾༻Λݕ౼͢Δ ιʔεϦϙδτϦΛ࡞ͬͯσϓϩΠ͢Δ DEV, STG, PRD ؀ڥ΁σϓϩΠͰ͖ΔΑ͏ʹ͓ͯ͘͠ σϓϩΠՄೳͳ CI /CD ύΠϓϥΠϯΛ૊Ή

Slide 37

Slide 37 text

"84$%,ͷ࠾༻Λݕ౼͢Δ

Slide 38

Slide 38 text

αϯϓϧ$MPVE8BUDI&WFOUTͰىಈ͢Δ-BNCEB'VODUJPO import events = require('@aws-cdk/aws-events'); import targets = require('@aws-cdk/aws-events-targets'); import lambda = require('@aws-cdk/aws-lambda'); import cdk = require('@aws-cdk/core'); import fs = require('fs'); export class LambdaCronStack extends cdk.Stack { constructor(app: cdk.App, id: string) { super(app, id); const lambdaFn = new lambda.Function(this, 'Singleton', { code: new lambda.InlineCode(fs.readFileSync('lambda-handler.py', { encoding: 'utf-8' })), handler: 'index.main', timeout: cdk.Duration.seconds(300), runtime: lambda.Runtime.PYTHON_3_6, }); // Run every day at 6PM UTC // See https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule- expressions.html const rule = new events.Rule(this, 'Rule', { schedule: events.Schedule.expression('cron(0 18 ? * MON-FRI *)') }); rule.addTarget(new targets.LambdaFunction(lambdaFn)); } } const app = new cdk.App(); new LambdaCronStack(app, 'LambdaCronExample'); app.synth(); aws-cdk-examples/index.ts at master · aws-samples/aws-cdk-examples https://github.com/aws-samples/aws-cdk-examples/blob/master/typescript/lambda-cron/index.ts

Slide 39

Slide 39 text

αϯϓϧ$MPVE8BUDI&WFOUTͰىಈ͢Δ-BNCEB'VODUJPO import events = require('@aws-cdk/aws-events'); import targets = require('@aws-cdk/aws-events-targets'); import lambda = require('@aws-cdk/aws-lambda'); import cdk = require('@aws-cdk/core'); import fs = require('fs'); export class LambdaCronStack extends cdk.Stack { constructor(app: cdk.App, id: string) { super(app, id); const lambdaFn = new lambda.Function(this, 'Singleton', { code: new lambda.InlineCode(fs.readFileSync('lambda-handler.py', { encoding: 'utf-8' })), handler: 'index.main', timeout: cdk.Duration.seconds(300), runtime: lambda.Runtime.PYTHON_3_6, }); // Run every day at 6PM UTC // See https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule- expressions.html const rule = new events.Rule(this, 'Rule', { schedule: events.Schedule.expression('cron(0 18 ? * MON-FRI *)') }); rule.addTarget(new targets.LambdaFunction(lambdaFn)); } } const app = new cdk.App(); new LambdaCronStack(app, 'LambdaCronExample'); app.synth(); aws-cdk-examples/index.ts at master · aws-samples/aws-cdk-examples https://github.com/aws-samples/aws-cdk-examples/blob/master/typescript/lambda-cron/index.ts

Slide 40

Slide 40 text

αϯϓϧ$MPVE8BUDI&WFOUTͰىಈ͢Δ-BNCEB'VODUJPO import events = require('@aws-cdk/aws-events'); import targets = require('@aws-cdk/aws-events-targets'); import lambda = require('@aws-cdk/aws-lambda'); import cdk = require('@aws-cdk/core'); import fs = require('fs'); export class LambdaCronStack extends cdk.Stack { constructor(app: cdk.App, id: string) { super(app, id); const lambdaFn = new lambda.Function(this, 'Singleton', { code: new lambda.InlineCode(fs.readFileSync('lambda-handler.py', { encoding: 'utf-8' })), handler: 'index.main', timeout: cdk.Duration.seconds(300), runtime: lambda.Runtime.PYTHON_3_6, }); // Run every day at 6PM UTC // See https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule- expressions.html const rule = new events.Rule(this, 'Rule', { schedule: events.Schedule.expression('cron(0 18 ? * MON-FRI *)') }); rule.addTarget(new targets.LambdaFunction(lambdaFn)); } } const app = new cdk.App(); new LambdaCronStack(app, 'LambdaCronExample'); app.synth(); aws-cdk-examples/index.ts at master · aws-samples/aws-cdk-examples https://github.com/aws-samples/aws-cdk-examples/blob/master/typescript/lambda-cron/index.ts

Slide 41

Slide 41 text

αϯϓϧ$MPVE8BUDI&WFOUTͰىಈ͢Δ-BNCEB'VODUJPO import events = require('@aws-cdk/aws-events'); import targets = require('@aws-cdk/aws-events-targets'); import lambda = require('@aws-cdk/aws-lambda'); import cdk = require('@aws-cdk/core'); import fs = require('fs'); export class LambdaCronStack extends cdk.Stack { constructor(app: cdk.App, id: string) { super(app, id); const lambdaFn = new lambda.Function(this, 'Singleton', { code: new lambda.InlineCode(fs.readFileSync('lambda-handler.py', { encoding: 'utf-8' })), handler: 'index.main', timeout: cdk.Duration.seconds(300), runtime: lambda.Runtime.PYTHON_3_6, }); // Run every day at 6PM UTC // See https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule- expressions.html const rule = new events.Rule(this, 'Rule', { schedule: events.Schedule.expression('cron(0 18 ? * MON-FRI *)') }); rule.addTarget(new targets.LambdaFunction(lambdaFn)); } } const app = new cdk.App(); new LambdaCronStack(app, 'LambdaCronExample'); app.synth(); aws-cdk-examples/index.ts at master · aws-samples/aws-cdk-examples https://github.com/aws-samples/aws-cdk-examples/blob/master/typescript/lambda-cron/index.ts - $ cdk deploy - TypeScriptίʔυ͔Β AWS ϦιʔεΛσϓϩΠՄೳ - ཪͰ AWS CloudFormation ςϯϓϨʔτΛੜ੒͍ͯ͠Δ

Slide 42

Slide 42 text

͜Ε͸"84͔ΒͷϝοηʔδΛײ͡Δ

Slide 43

Slide 43 text

͜Ε͸"84͔ΒͷϝοηʔδΛײ͡Δ Ϋϥ΢υϦιʔεͷσϓϩΠ·ͰؚΊͯ ΞϓϦέʔγϣϯ։ൃͩͧ ͓·͕͑΍Ε

Slide 44

Slide 44 text

"84$%,ͷ࠾༻Λݕ౼͢Δ ͸͍ɺ΍Γ·͢ ։ൃऀͷٕज़εΠονίετ͕ݮΓɺσϓϩΠ·Ͱͷো น͕গͳ͘ͳΔ ΞϓϦέʔγϣϯΤϯδχΞ͕ΠϯϑϥΛɺΠϯϑϥΤ ϯδχΞ͕ΞϓϦέʔγϣϯΛ։ൃ͢Δ͖͔͚ͬʹͳΔ

Slide 45

Slide 45 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ αʔόʔϨε։ൃܾఆޙ AWS CDK ͷ࠾༻Λݕ౼͢Δ ιʔεϦϙδτϦΛ࡞ͬͯσϓϩΠ͢Δ DEV, STG, PRD ؀ڥ΁σϓϩΠͰ͖ΔΑ͏ʹ͓ͯ͘͠ σϓϩΠՄೳͳ CI /CD ύΠϓϥΠϯΛ૊Ή

Slide 46

Slide 46 text

ϞϊϨϙʹΑΔΞϓϦέʔγϣϯͷ؅ཧ ύοέʔδߏ੒Ͳ͏͠·͔͢ ZBSOXPSLTQBDFʹΑΔϞϊϨϙ͕͓͢͢Ί yarn workspace | Yarn https://classic.yarnpkg.com/ja/docs/cli/workspace/

Slide 47

Slide 47 text

ߏ੒ྫ QBDLBHFT NBOBHFNFOUSFBDU MBNCEBOPEF JOGSBBXTDEL QBDLBHFKTPO UTDPOpHCBTFKTPO ./

Slide 48

Slide 48 text

ߏ੒ྫ QBDLBHFT NBOBHFNFOUSFBDU MBNCEBOPEF JOGSBBXTDEL QBDLBHFKTPO UTDPOpHCBTFKTPO ./ - ֤ workspace Ͱಠཱͯ͠։ൃ͕Մೳ - ಉ࣌ʹɺϓϩδΣΫτϧʔτͷ package.json ͷεΫϦϓτ࣍ୈͰɺ·ͱ ΊͯϏϧυ͢Δ͜ͱ΋Մೳ

Slide 49

Slide 49 text

-BNCEB'VODUJPOͱ"84$%,ͷ࿈ܞ "84$%,Ͱ-BNCEB'VODUJPOΛఆٛ͢Δͱ͖ ʹɺϏϧυޙͷ-BNCEB'VODUJPOύεΛࢦఆ͢Ε͹ 0, … new lambda.Function(stack, 'getGreetingReply', { functionName: 'getGreetingReply-function', code: lambda.Code.fromAsset(NODE_LAMBDA_SRC_DIR), handler: 'lambda/handlers/api-gw/greeting/api-gw-get-greeting-reply-handler.handler', runtime: lambda.Runtime.NODEJS_12_X, layers: [nodeModulesLayer], environment: { REGION: cdk.Stack.of(stack).region, }, }); …

Slide 50

Slide 50 text

-BNCEB'VODUJPOͱ"84$%,ͷ࿈ܞ "84$%,Ͱ-BNCEB'VODUJPOΛఆٛ͢Δͱ͖ ʹɺϏϧυޙͷ-BNCEB'VODUJPOύεΛࢦఆ͢Ε͹ 0, … new lambda.Function(stack, 'getGreetingReply', { functionName: 'getGreetingReply-function', code: lambda.Code.fromAsset(NODE_LAMBDA_SRC_DIR), handler: 'lambda/handlers/api-gw/greeting/api-gw-get-greeting-reply-handler.handler', runtime: lambda.Runtime.NODEJS_12_X, layers: [nodeModulesLayer], environment: { REGION: cdk.Stack.of(stack).region, }, }); …

Slide 51

Slide 51 text

-BNCEB'VODUJPOͱ"84$%,ͷ࿈ܞ "84$%,Ͱ-BNCEB'VODUJPOΛఆٛ͢Δͱ͖ ʹɺϏϧυޙͷ-BNCEB'VODUJPOύεΛࢦఆ͢Ε͹ 0, … new lambda.Function(stack, 'getGreetingReply', { functionName: 'getGreetingReply-function', code: lambda.Code.fromAsset(NODE_LAMBDA_SRC_DIR), handler: 'lambda/handlers/api-gw/greeting/api-gw-get-greeting-reply-handler.handler', runtime: lambda.Runtime.NODEJS_12_X, layers: [nodeModulesLayer], environment: { REGION: cdk.Stack.of(stack).region, }, }); … - $ yarn deploy

Slide 52

Slide 52 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ αʔόʔϨε։ൃܾఆޙ AWS CDK ͷ࠾༻Λݕ౼͢Δ ιʔεϦϙδτϦΛ࡞ͬͯσϓϩΠ͢Δ DEV, STG, PRD ؀ڥ΁σϓϩΠͰ͖ΔΑ͏ʹ͓ͯ͘͠ σϓϩΠՄೳͳ CI /CD ύΠϓϥΠϯΛ૊Ή

Slide 53

Slide 53 text

؀ڥ͝ͱʹσϓϩΠͰ͖ΔΑ͏ʹ͓ͯ͘͠ ελοΫ໊Λ؀ڥ͝ͱʹม͑Δ͜ͱͰରԠՄೳ ؀ڥม਺ͳͲʹೖΕ͓ͯ͘ͱྑ͍ export async function greetingApplicationStack( scope: cdk.Construct, id: string, global: GlobalProps, ): Promise { // dev | stg | prd const stage = process.env.STAGE_NAME!; const stack = new cdk.Stack(scope, id, { stackName: `${stage}-${id}-stack`, }); const buckets = await s3Construct.reference(stack, bucketArns); const dynamoTables = await dynamoConstruct.reference(stack, dynamoArns); const nodeModulesLayer = cdkLambda.LayerVersion.fromLayerVersionArn( stack, 'NodeModulesLayer', nodeModulesLayerArn, ); // lambda const lambda = await greetingLambdaConstruct(stack, global, { buckets,dynamoTables,nodeModulesLayer, }); // API Gateway await greetingApiConstruct(stack, global, { lambda, env: { apiStageName: 'v1'}, }); return stack; }

Slide 54

Slide 54 text

؀ڥ͝ͱʹσϓϩΠͰ͖ΔΑ͏ʹ͓ͯ͘͠ ελοΫ໊Λ؀ڥ͝ͱʹม͑Δ͜ͱͰରԠՄೳ ؀ڥม਺ͳͲʹೖΕ͓ͯ͘ͱྑ͍ export async function greetingApplicationStack( scope: cdk.Construct, id: string, global: GlobalProps, ): Promise { // dev | stg | prd const stage = process.env.STAGE_NAME!; const stack = new cdk.Stack(scope, id, { stackName: `${stage}-${id}-stack`, }); const buckets = await s3Construct.reference(stack, bucketArns); const dynamoTables = await dynamoConstruct.reference(stack, dynamoArns); const nodeModulesLayer = cdkLambda.LayerVersion.fromLayerVersionArn( stack, 'NodeModulesLayer', nodeModulesLayerArn, ); // lambda const lambda = await greetingLambdaConstruct(stack, global, { buckets,dynamoTables,nodeModulesLayer, }); // API Gateway await greetingApiConstruct(stack, global, { lambda, env: { apiStageName: 'v1'}, }); return stack; }

Slide 55

Slide 55 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ αʔόʔϨε։ൃܾఆޙ AWS CDK ͷ࠾༻Λݕ౼͢Δ ιʔεϦϙδτϦΛ࡞ͬͯσϓϩΠ͢Δ DEV, STG, PRD ؀ڥ΁σϓϩΠͰ͖ΔΑ͏ʹ͓ͯ͘͠ σϓϩΠՄೳͳ CI /CD ύΠϓϥΠϯΛ૊Ή

Slide 56

Slide 56 text

"84$PEF1JQFMJOFͰ΋σϓϩΠͰ͖ΔΑ͏ʹ͓ͯ͘͠ NBTUFSϒϥϯν͔Β EFW؀ڥ͸ࣗಈσϓϩΠ TUH QSE͸ঝೝϑϩʔΛڬ Ήɺ͕͓͢͢Ί ঝೝΛϦδΣΫτ͢Ε͹ɺϦ Ϧʔε͞Εͳ͍ʢӈਤʣ

Slide 57

Slide 57 text

΋ͪΖΜ"84$PEF1JQFMJOFͷߏங΋"84$%,Ͱ const applicationBuild = new codeBuild.PipelineProject( stack, 'GreetingApplicationDeploy-project', { projectName: 'GreetinApplicationDeploy-project', buildSpec: codeBuild.BuildSpec.fromSourceFilename( './buildspec/buildspec-deploy.yml', ), role: deployRole, environment: { buildImage: LinuxBuildImage.STANDARD_3_0, environmentVariables: { AWS_DEFAULT_REGION: { type: codeBuild.BuildEnvironmentVariableType.PLAINTEXT, value: stack.region, }, }, }, }, );

Slide 58

Slide 58 text

αʔόʔϨεͰઓ͏͜ͱʹશһೲಘ͢Δ AWS CDK ͰσϓϩΠՄೳঢ়ଶΛ࠷ॳʹͭ͘Δ ͜͜·Ͱͷ·ͱΊ

Slide 59

Slide 59 text

ϓϩμΫγϣϯσϓϩΠͷεςοϓ֓؍ σϓϩΠͰ͖ͨΒ AWSߏ੒Λઃܭ͢Δ ΞϓϦέʔγϣϯΛ࣮૷͍ͯ͘͠ PRD΁σϓϩΠ ຊ൪Քಇ

Slide 60

Slide 60 text

$POUFOUT αʔόʔϨεͷಘҙͳ͜ͱɾۤखͳ͜ͱΛ࠶֬ೝ͢Δ σϓϩΠ·Ͱͷεςοϓͱ"84$%, "84ͰͷΞϓϦέʔγϣϯύλʔϯ ͦͯ͠ϞμϯΞϓϦέʔγϣϯ΁

Slide 61

Slide 61 text

͋ͱ͸ΞϓϦέʔγϣϯͷத਎Λॆ࣮͍ͤͯ͘͞ "84ߏ੒Λઃܭ͢Δ ඞཁʹԠͯ͡-BNCEB'VODUJPOͷίʔυΛॻ͘ "84$%,ʹ͓ͯ͜͠σϓϩΠ͢Δ σϓϩΠ͢Δ

Slide 62

Slide 62 text

͋ͱ͸ΞϓϦέʔγϣϯͷத਎Λॆ࣮͍ͤͯ͘͞ "84ߏ੒Λઃܭ͢Δ ඞཁʹԠͯ͡-BNCEB'VODUJPOͷίʔυΛॻ͘ "84$%,ʹ͓ͯ͜͠σϓϩΠ͢Δ σϓϩΠ͢Δ ✖ N

Slide 63

Slide 63 text

࣮੷ͷ͋Δύλʔϯ͔Βͷྲྀ༻ɾԠ༻͕Φεεϝ ઃܭϦϑΝϨϯε"84ެࣜ αʔόʔϨεύλʔϯ https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/

Slide 64

Slide 64 text

࣮੷ͷ͋Δύλʔϯ͔Βͷྲྀ༻ɾԠ༻͕Φεεϝ ઃܭϦϑΝϨϯεॻ੶

Slide 65

Slide 65 text

࣮੷ͷ͋Δύλʔϯ͔Βͷྲྀ༻ɾԠ༻͕Φεεϝ ઃܭϦϑΝϨϯεαʔόʔϨείϛϡχςΟ

Slide 66

Slide 66 text

࣮੷ͷ͋Δύλʔϯ͔Βͷྲྀ༻ɾԠ༻͕Φεεϝ ࣮૷ϦϑΝϨϯε"84$%,&YBNQMFT

Slide 67

Slide 67 text

࣮੷ͷ͋Δύλʔϯ͔Βͷྲྀ༻ɾԠ༻͕Φεεϝ ࣮૷ϦϑΝϨϯε%FWFMPQFST*0

Slide 68

Slide 68 text

ࠓ೔͸·ͩαϯϓϧ͕গͳͦ͏ͳύλʔϯΛ঺հ "84"QQ4ZODʹΑΔ#BDLFOEGPS'SPOUFOE 71$-JOLΛར༻ͨ͠71$಺"1*ͱͷ࿈ܞ Ͳ͏ͯ͠΋+BWBϥΠϒϥϦΛ࢖Θͳͯ͘͸ͳΒͳ͍ 4UFQ'VODUJPOTΛར༻ͨ͠αʔόʔϨεδϣϒ

Slide 69

Slide 69 text

"84"QQ4ZODʹΑΔ#BDLFOEGPS'SPOUFOE ओʹΫϥΠΞϯτΞϓϦέʔγϣϯʹ(SBQI2-"1* Λఏڙ͢Δ 'BDFCPPL΍(JU)VCͳͲɺϢʔβʔ޲͚"1*Λ(SBQI2-Ͱఏ ڙ͢Δύλʔϯ΋૿͖͑ͯͨ ·ͣ͸؅ཧը໘ͷόοΫΤϯυͱͯ͠ར༻͢Δͷ͕ศར

Slide 70

Slide 70 text

"84"QQ4ZODʹΑΔ#BDLFOEGPS'SPOUFOE

Slide 71

Slide 71 text

"84"QQ4ZODʹΑΔ#BDLFOEGPS'SPOUFOE const graphApi = new appsync.GraphQLApi(stack, 'AdminBff', { name: global.getGraphApiName('AdminBff'), authorizationConfig: { defaultAuthorization: { authorizationType: AuthorizationType.API_KEY, apiKeyConfig: { description: 'test api key config', expires: luxon.DateTime.local().plus({ days: 7 }).toISO(), name: 'default test api key', }, }, additionalAuthorizationModes: [], }, logConfig: { fieldLogLevel: FieldLogLevel.ALL, excludeVerboseContent: true, }, schemaDefinitionFile: path.join(__dirname, 'schema.graphql'), });

Slide 72

Slide 72 text

"84"QQ4ZODʹΑΔ#BDLFOEGPS'SPOUFOE const graphApi = new appsync.GraphQLApi(stack, 'AdminBff', { name: global.getGraphApiName('AdminBff'), authorizationConfig: { defaultAuthorization: { authorizationType: AuthorizationType.API_KEY, apiKeyConfig: { description: 'test api key config', expires: luxon.DateTime.local().plus({ days: 7 }).toISO(), name: 'default test api key', }, }, additionalAuthorizationModes: [], }, logConfig: { fieldLogLevel: FieldLogLevel.ALL, excludeVerboseContent: true, }, schemaDefinitionFile: path.join(__dirname, 'schema.graphql'), });

Slide 73

Slide 73 text

"84"QQ4ZODʹΑΔ#BDLFOEGPS'SPOUFOE const greetingTableDataSource = graphApi.addDynamoDbDataSource( 'GreetingTableDataSource', 'greeting table', dynamoTables.greetingTable, ); greetingTableDataSource.createResolver({ typeName: 'Mutation', fieldName: 'createHello', requestMappingTemplate: MappingTemplate.dynamoDbPutItem( PrimaryKey.partition('id').auto(), Values.projecting('input'), ), responseMappingTemplate: MappingTemplate.dynamoDbResultItem(), });

Slide 74

Slide 74 text

"84"QQ4ZODʹΑΔ#BDLFOEGPS'SPOUFOE const greetingTableDataSource = graphApi.addDynamoDbDataSource( 'GreetingTableDataSource', 'greeting table', dynamoTables.greetingTable, ); greetingTableDataSource.createResolver({ typeName: 'Mutation', fieldName: 'createHello', requestMappingTemplate: MappingTemplate.dynamoDbPutItem( PrimaryKey.partition('id').auto(), Values.projecting('input'), ), responseMappingTemplate: MappingTemplate.dynamoDbResultItem(), }); (SBQI"QJʹ %BUB4PVSDFΛ௥Ճ

Slide 75

Slide 75 text

"84"QQ4ZODʹΑΔ#BDLFOEGPS'SPOUFOE const greetingTableDataSource = graphApi.addDynamoDbDataSource( 'GreetingTableDataSource', 'greeting table', dynamoTables.greetingTable, ); greetingTableDataSource.createResolver({ typeName: 'Mutation', fieldName: 'createHello', requestMappingTemplate: MappingTemplate.dynamoDbPutItem( PrimaryKey.partition('id').auto(), Values.projecting('input'), ), responseMappingTemplate: MappingTemplate.dynamoDbResultItem(), }); %BUB4PVSDFʹ 3FTPMWFSΛ௥Ճ

Slide 76

Slide 76 text

71$-JOLΛར༻ͨ͠71$಺"1*ͱͷ࿈ܞ طଘγεςϜͷҰ෦ΛαʔόʔϨεͰஔ͖׵͑Δ৔߹ʹ ૺ۰͢Δέʔε ߏஙࡁΈͷ&$αʔόʔ܊ʹ/FUXPSL-PBE#BMBODFSܦ༝ Ͱ"1*(BUFXBZ͔ΒΞΫηεͰ͖Δ Πϯλʔωοτʢͨͱ͑͹41"ͳͲͷ؅ཧը໘ʣ͔ΒͷΞΫ ηεΛ"1*(BUFXBZʹू໿Ͱ͖ΔɻಛʹೝূํࣜΛ"VUI ϩάΠϯͳͲͰ౷Ұ͍ͨ͠ύλʔϯ

Slide 77

Slide 77 text

71$-JOLΛར༻ͨ͠71$಺"1*ͱͷ࿈ܞ

Slide 78

Slide 78 text

71$-JOLΛར༻ͨ͠71$಺"1*ͱͷ࿈ܞ 71$ /-#·Ͱ ߏஙࡁΈͱ͠·͢

Slide 79

Slide 79 text

"84$%,"1*(BUFXBZߏங෦෼ const api = new apig.RestApi(scope, 'GreetingApi', { restApiName: global.getApiName('Greeting'), endpointTypes: [apig.EndpointType.REGIONAL], deployOptions: { stageName:’v1’, }, }); const helloLink = new VpcLink(scope, 'VpcLink', { targets: [ NetworkLoadBalancer.fromNetworkLoadBalancerAttributes( scope, ‘GreetingNlb', { loadBalancerArn: ‘arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxx:loadbalancer/net/Bonjo-Ec2Se-xfsda/12234567890', }, ), ], }); const helloResource = api.root.addResource('helo'); helloResource.addMethod( 'GET', new apig.Integration({ type: IntegrationType.HTTP_PROXY, integrationHttpMethod: ‘GET', url: ‘http://abxyfskeladk.elb.ap-northeast-1.amazonaws.com’, options: { connectionType: ConnectionType.VPC_LINK, vpcLink: helloLink, }, }), { methodResponses: [{statusCode: ‘200'}] },

Slide 80

Slide 80 text

"84$%,"1*(BUFXBZߏங෦෼ const api = new apig.RestApi(scope, 'GreetingApi', { restApiName: global.getApiName('Greeting'), endpointTypes: [apig.EndpointType.REGIONAL], deployOptions: { stageName:’v1’, }, }); const helloLink = new VpcLink(scope, 'VpcLink', { targets: [ NetworkLoadBalancer.fromNetworkLoadBalancerAttributes( scope, ‘GreetingNlb', { loadBalancerArn: ‘arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxx:loadbalancer/net/Bonjo-Ec2Se-xfsda/12234567890', }, ), ], }); const helloResource = api.root.addResource('helo'); helloResource.addMethod( 'GET', new apig.Integration({ type: IntegrationType.HTTP_PROXY, integrationHttpMethod: ‘GET', url: ‘http://abxyfskeladk.elb.ap-northeast-1.amazonaws.com’, options: { connectionType: ConnectionType.VPC_LINK, vpcLink: helloLink, }, }), { methodResponses: [{statusCode: ‘200'}] }, طଘ/-#ΑΓ 71$-JOL࡞੒

Slide 81

Slide 81 text

"84$%,"1*(BUFXBZߏங෦෼ const api = new apig.RestApi(scope, 'GreetingApi', { restApiName: global.getApiName('Greeting'), endpointTypes: [apig.EndpointType.REGIONAL], deployOptions: { stageName:’v1’, }, }); const helloLink = new VpcLink(scope, 'VpcLink', { targets: [ NetworkLoadBalancer.fromNetworkLoadBalancerAttributes( scope, ‘GreetingNlb', { loadBalancerArn: ‘arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxx:loadbalancer/net/Bonjo-Ec2Se-xfsda/12234567890', }, ), ], }); const helloResource = api.root.addResource('helo'); helloResource.addMethod( 'GET', new apig.Integration({ type: IntegrationType.HTTP_PROXY, integrationHttpMethod: ‘GET', url: ‘http://abxyfskeladk.elb.ap-northeast-1.amazonaws.com’, options: { connectionType: ConnectionType.VPC_LINK, vpcLink: helloLink, }, }), { methodResponses: [{statusCode: ‘200'}] }, "1*(BUFXBZͱ 71$-JOLΛ઀ଓ

Slide 82

Slide 82 text

Ͳ͏ͯ͠΋+BWBϥΠϒϥϦΛ࢖ΘͶ͹ͳΒͳ͍ ଞϕϯμʔͷ֎෦"1*ͷར༻ํ๏Ͱɺ+"3Λ௨͔͢͠ ͳ͍έʔεͳͲ -BNCEB'VODUJPOશମΛ+BWBݴޠͰ࣮૷͢Δ͔ ϨΠςϯγ͕͞΄Ͳؔ৺ࣄͰͳ͍৔߹͸ɺ+"3ϥΠϒϥϦΛ࣮ ߦ͢ΔͷΈͷ࠷খͷ-BNCEB'VODUJPOʢ+BWBʣΛ༻ҙ͢Δͷ ΋ख

Slide 83

Slide 83 text

Ͳ͏ͯ͠΋+BWBϥΠϒϥϦΛ࢖ΘͶ͹ͳΒͳ͍ ଞϕϯμʔͷ֎෦"1*ͷར༻ํ๏Ͱɺ+"3Λ௨͔͢͠ ͳ͍έʔεͳͲ -BNCEB'VODUJPOશମΛ+BWBݴޠͰ࣮૷͢Δ͔ ϨΠςϯγ͕͞΄Ͳؔ৺ࣄग़ͳ͍৔߹͸ɺ+"3ϥΠϒϥϦΛ࣮ ߦ͢ΔͷΈͷ࠷খͷ-BNCEB'VODUJPOʢ+BWBʣΛ༻ҙ͢Δͷ ΋ख

Slide 84

Slide 84 text

-BNCEB'VODUJPOͰϥοϓ͢Δ

Slide 85

Slide 85 text

ߏ੒ྫ QBDLBHFT NBOBHFNFOUSFBDU MBNCEBOPEF JOGSBBXTDEL QBDLBHFKTPO UTDPOpHCBTFKTPO ./ MBNCEBKBWB

Slide 86

Slide 86 text

ߏ੒ྫ QBDLBHFT NBOBHFNFOUSFBDU MBNCEBOPEF JOGSBBXTDEL QBDLBHFKTPO UTDPOpHCBTFKTPO ./ MBNCEBKBWB ௥Ճ (SBEMFͰϏϧυɺ-BNCEB 'VODUJPOͷ+"3ੜ੒

Slide 87

Slide 87 text

4UFQ'VODUJPOTΛར༻ͨ͠αʔόʔϨεδϣϒ ͲΜͳͱ͖ʹ4UFQ'VODUJPOT͕ొ৔͢Δ͔ -BNCEB'VODUJPO͕ෳ਺ͷ࢓ࣄΛ੥͚ෛ͓ͬͯΓɺ෼ղͯ͠ δϣϒͱ͍ͨ͠ ͳ͓͔ͭɺਐߦঢ়گ͕Θ͔Δͱخ͍͠έʔε ྫɿ؅ཧը໘͔Β࣮ߦ͢ΔσʔλҰׅొ࿥ॲཧ

Slide 88

Slide 88 text

4UFQ'VODUJPOTΛར༻ͨ͠αʔόʔϨεδϣϒ

Slide 89

Slide 89 text

ҰׅॲཧͳͲͰΑ͘Έ͔͚ΔΞϨΛαʔόʔϨεͰ

Slide 90

Slide 90 text

ҰׅॲཧͳͲͰΑ͘Έ͔͚ΔΞϨΛαʔόʔϨεͰ ΞϨ MPBEJOH

Slide 91

Slide 91 text

"84$%,ͳΒ4UBUF.BDIJOFΛϝιουͰ਺चͭͳ͗ʹ const convertCsvTask = new sfnTasks.LambdaInvoke( stack, 'CsvConvertTask', { lambdaFunction: lambda.convertCsvToJsonLinesFn, invocationType: LambdaInvocationType.REQUEST_RESPONSE, resultPath: '$.convert', }, ); const waitForConvert = new sfn.Wait(stack, 'WaitForConvert', { time: sfn.WaitTime.duration(Duration.seconds(5)), }); const writeDynamodbTask = new sfnTasks.LambdaInvoke( stack, 'WriteDynamodbTask', { lambdaFunction: lambda.writeDynamodbFn, invocationType: LambdaInvocationType.REQUEST_RESPONSE, resultPath: '$.writeData', inputPath: '$.convert.Payload', }, ); const batchWriteChain = sfn.Chain.start(convertCsvTask) .next(waitForConvert) .next(writeDynamodbTask) const batchWriteMachine = new sfn.StateMachine(stack, 'BatchWriteMachine', { stateMachineName: global.getStateMachineName('BatchWriteMachine'), definition: chain, timeout: cdk.Duration.minutes(20), });

Slide 92

Slide 92 text

const convertCsvTask = new sfnTasks.LambdaInvoke( stack, 'CsvConvertTask', { lambdaFunction: lambda.convertCsvToJsonLinesFn, invocationType: LambdaInvocationType.REQUEST_RESPONSE, resultPath: '$.convert', }, ); const waitForConvert = new sfn.Wait(stack, 'WaitForConvert', { time: sfn.WaitTime.duration(Duration.seconds(5)), }); const writeDynamodbTask = new sfnTasks.LambdaInvoke( stack, 'WriteDynamodbTask', { lambdaFunction: lambda.writeDynamodbFn, invocationType: LambdaInvocationType.REQUEST_RESPONSE, resultPath: '$.writeData', inputPath: '$.convert.Payload', }, ); const batchWriteChain = sfn.Chain.start(convertCsvTask) .next(waitForConvert) .next(writeDynamodbTask) const batchWriteMachine = new sfn.StateMachine(stack, 'BatchWriteMachine', { stateMachineName: global.getStateMachineName('BatchWriteMachine'), definition: chain, timeout: cdk.Duration.minutes(20), }); "84$%,ͳΒ4UBUF.BDIJOFΛϝιουͰ਺चͭͳ͗ʹ

Slide 93

Slide 93 text

͜͜·Ͱͷ·ͱΊ "84$%,Λ࢖ͬͯઌʹσϓϩΠͯ͠͠·͏͜ͱΛ͓ ͢͢Ί͠·ͨ͠ த਎ͷ࡞ΓࠐΈύλʔϯΛ͍͕ͭࣔ͘͠·ͨ͠ ͜ΕͰɺʮσϓϩΠ͚ͩͰ΋΍ͬͯΈΑ͏͔ͳʯͱͳΕ ͹໨తୡ੒Ͱ͢

Slide 94

Slide 94 text

αϯϓϧ༻ҙ͋Γ·͢ "84$%,-BNCEB'VODUJPOͷϞϊϨϙ https://github.com/cm-wada-yusuke/template-aws-cdk-typescript-serverless-app

Slide 95

Slide 95 text

$POUFOUT αʔόʔϨεͷಘҙͳ͜ͱɾۤखͳ͜ͱΛ࠶֬ೝ͢Δ σϓϩΠ·Ͱͷεςοϓͱ"84$%, "84ͰͷΞϓϦέʔγϣϯύλʔϯ ͦͯ͠ϞμϯΞϓϦέʔγϣϯ΁

Slide 96

Slide 96 text

Ϋϥεϝιου.PEFSO"QQMJDBUJPO%FWFMPQNFOU Ϋϥεϝιουɹ."%

Slide 97

Slide 97 text

Ϋϥεϝιου.PEFSO"QQMJDBUJPO%FWFMPQNFOU ຊ൪؀ڥʹσϓϩΠͨ͠ΞϓϦέʔγϣϯ͸ɺ͓ۚΛՔ͙͜ ͱ͕Ͱ͖·͢ wมԽ΁ͷ௥ਵ͕ඞཁ wຊηογϣϯ͸αʔόʔϨεΞϓϦέʔγϣϯͷσϓϩΠՄೳੑʹ ΑΔΞδϦςΟ֬อʹϑΥʔΧε͕ͨ͠ɺՁ஋Λఏڙ͚ͭͮ͠Δͨ Ίͷཁૉ͸ͨ͘͞Μ͋Δ wมԽʹ௥ਵͰ͖ɺՁ஋Λఏڙ͚ͭͮ͠ΒΕΔΞϓϦΛϞμϯΞϓϦ έʔγϣϯͱఆٛ͠ɺ։ൃɾίϯαϧαʔϏεͱͯ͠ల։͍ͯ͠· ͢

Slide 98

Slide 98 text

%FW*0$POOFDU݄೔͕."%ಛूͰ͢ʂ

Slide 99

Slide 99 text

ࢀߟॻ੶ɾར༻ͨ͠πʔϧ w DODGXHTFSWFSMFTT$/$'4FSWFSMFTT8(IUUQTHJUIVCDPNDODG XHTFSWFSMFTT w "84$%,IUUQTHJUIVCDPNBXTBXTDEL w DNXBEBZVTVLFUTBTDELIUUQTHJUIVCDPNDNXBEBZVTVLF UTBTDEL

Slide 100

Slide 100 text

ηογϣϯޙ͸Ξϯέʔτ΁ͷ͝ڠྗΛΑΖ͓͘͠ئ͍͠·͢ɻ ͝ճ౴͍͍ͨͩͨํʹ͸ޙ೔ɺࢿྉΛૹ෇͍ͨ͠·͢ɻ SNS౤ߘʹ͸ͪ͜ΒΛ͓࢖͍͍ͩ͘͞ɻ #devio2020 ΠϕϯτͷϙʔλϧαΠτ͸ͪ͜Β https://classmethod.jp/m/devio_2020_connect/ ϥΠϒηογϣϯ࿥ը΋ͪ͜Β͔Β ࢹௌͰ͖·͢ɻ https://forms.gle/ytMbgwo3ujUi2bsX9 15:00ʙ15:45 ʮ࣮ફϓϩμΫγϣϯαʔόʔϨε - AWS CDKͱTypeScript ʹΑΔWebΞϓϦέʔγϣϯ։ൃύλʔϯʯ
 ͷΞϯέʔτ͸ͪ͜ΒͰ͢ɻ Q&A Q&A