$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DMM 決済基盤で AWS CDK を使っている話
Search
HukurouKk
March 03, 2020
Programming
0
540
DMM 決済基盤で AWS CDK を使っている話
CDK meetup #2 @onlineで発表したスライドです。
HukurouKk
March 03, 2020
Tweet
Share
Other Decks in Programming
See All in Programming
Microservices rules: What good looks like
cer
PRO
0
1.4k
ハイパーメディア駆動アプリケーションとIslandアーキテクチャ: htmxによるWebアプリケーション開発と動的UIの局所的適用
nowaki28
0
420
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
270
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
110
【CA.ai #3】ワークフローから見直すAIエージェント — 必要な場面と“選ばない”判断
satoaoaka
0
240
チームをチームにするEM
hitode909
0
330
Cap'n Webについて
yusukebe
0
130
WebRTC、 綺麗に見るか滑らかに見るか
sublimer
1
160
SwiftUIで本格音ゲー実装してみた
hypebeans
0
370
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
3
720
宅宅自以為的浪漫:跟 AI 一起為自己辦的研討會寫一個售票系統
eddie
0
500
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
2
220
Featured
See All Featured
Music & Morning Musume
bryan
46
7k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
YesSQL, Process and Tooling at Scale
rocio
174
15k
The Pragmatic Product Professional
lauravandoore
37
7.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
RailsConf 2023
tenderlove
30
1.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Designing Experiences People Love
moore
143
24k
KATA
mclloyd
PRO
32
15k
Transcript
%..ܾࡁج൫Ͱ"84 $%,Λ͍ͬͯΔ ߹ಉձࣾ%..DPN1'ࣄۀຊ෦ϖΠϝϯταʔϏε෦ খੁߤฏ!$%,NFFUVQ
ࣗݾհ
খੁߤฏ JE!)VLVSPV,L w ߹ಉձࣾ%..DPNॴଐ w ϓϥοτϑΥʔϜࣄۀຊ෦ w ϖΠϝϯταʔϏε෦ w ΞϓϦέʔγϣϯΤϯδχΞ
w ৽ଔ
ΞδΣϯμ "84$%,ͱ ࠾༻ͨ͠എܠ "84$%,Λར༻͍ͯ͠ΔϓϩμΫτʹ͍ͭͯͷհ "84$%,Λͬͨ࣌ͷ։ൃ࣌ͷར ՝ͳͲ
ࠓޙʹ͍ͭͯ ·ͱΊ
"84$%,ͱʁ
"84$%, w ϓϩάϥϚϒϧ*B$πʔϧɻίʔυͰ"84ͷڥߏங͕Մ ೳɻ +BWB4DSJQUɾ5ZQF4DSJQUɾ1ZUIPOɾ+BWBɾ/&5 w ࠒʹ("ʂݱࡏWFS ݱࡏ
w αʔϏε͝ͱʹ࡞ΒΕ͍ͯΔ$POTUSVDU1BUUFSOTΛ ͑αΫοͱڥߏங͕Ͱ͖Δɻ
ͳͥ࠾༻͔ͨ͠ʁ
ݱঢ়ͷઆ໌͔Β
ΦϯϓϨ Ϋϥυ ϦϓϨΠεதʜ ΠϯϑϥνʔϜ ֤ϓϩμΫτνʔϜ FHܾࡁ5 ϨΨγʔ ϓϩμΫτ ৽ ϓϩμΫτ
ϦϓϨΠε࣌ͷ՝ w *B$πʔϧ $MPVE'PSNBUJPOUFSSBGPSN ͷར༻ͷͨΊ ͷֶशίετ૿Ճ w Ұ෦ɺ8FC6*Λϙνϙν͢Δ࠶ݱੑͷͳ͍ڥߏங w ΞʔΩςΫνϟ
αʔόʔϨεɺίϯςφͳͲ ʹΑͬͯ πʔϧͷ૬ੑ͕͋Δɻ
ղܾͷબࢶͷҰ͕ͭ"84$%,
"84$%,ར༻ͷૂ͍ w ಠࣗͷ%4-ͳͲΘͣʹɺϓϩάϥϚϒϧʹॻ͚Δ͜ͱʹ ΑͬͯΞϓϦέʔγϣϯدΓͷΤϯδχΞͰॻ͖͍͢ɺ ϨϏϡʔ͍͢͠ɻ w ܕʹΑͬͯิ͕ޮͨ͘ΊɺͦΕͧΕͷ$POTUSVDU-JCSBSZ ʹԿ͕͋Δ͔ѲͰ͖Δɻ FEJUPSʹΑΓ·͕͢
w ΞϓϦέʔγϣϯ͔ΒΠϯϑϥ·Ͱಉ͡ݴޠͰॻ͘͜ͱ͕Ͱ ͖Δɻ αʔϏεʹΑΓ·͕͢
ଞͷπʔϧൺֱ
4". w "84αʔόʔϨεΞϓϦέʔγϣϯϞσϧ "844". αʔόʔϨεʹಛԽͨ͠*B$πʔϧ w ZBNMͰߏΛఆٛ͠ɺσϓϩΠߦ͑Δɻ·ͨMPDBMBQJͷ Α͏ͳݕূػೳ༻ҙ͞Ε͍ͯΔɻ w
ݕূػೳ%ZOBNP%#-PDBM 4UFQ'VODUJPOT-PDBMͳͲ ͱ࿈ܞऔΕΔͨΊɺϩʔΧϧͷ"84ݕূڥ༻ҙՄ ೳɻ
5FSSBGPSN w )BTIJ$PSQ*B$πʔϧɻUGϑΝΠϧʹઐ༻ͷ%4- )$- ͰڥߏஙఆٛΛॻ͘ɻ֤ϕϯμʔʹରԠɻ w ͋͘·ͰɺΠϯϑϥΛͭ͘ΔπʔϧʹͨΊɺΞϓϦέʔ γϣϯͷ[JQԽͳͲ͕ඞཁɻ w Ͳ͏ͯ͠044ɺ͔ͭϚϧνϕϯμʔʹରԠ͍ͯ͠Δͷ
͋ͬͯɺ৽αʔϏεͷରԠΊɻ
"84$%,Λར༻͍ͯ͠ΔϓϩμΫτʹ͍ͭͯͷհ
4FSWFSMFTT
֓ཁ w ܾࡁߦձࣾͷϦΫΤετΛड͚औΓɺฐࣾͷϙΠϯτ ΛϢʔβʔʹ༩͢ΔγεςϜ w ༩ॲཧʹࣦഊͨ͠߹ɺޭ͢Δ·Ͱ࠶ॲཧΛߦ ͏ɻ w ࠓޙෳͷߦձࣾʹରԠͰ͖ΔΑ͏ɺͳΔ͘։ൃɾ ӡ༻Λָʹ͢Δ
None
ϦΫΤετΛ ड͚औΔ
-BNCEB͕ىಈ 424 4ʹ͛Δ
ΩϡʔΛΠϕϯτʹ-BNCEB ىಈ 4UBUFNBDIJOFΛཱͯΔ
4UFQGVODUJPOTͰϫʔΫϑϩʔཧ -BNCEBͰϦΫΤετΛ͛Δ ࣦഊͨ͠Β·ͨ܁Γฦ͢ɻ
None
αʔόʔϨεͷํ ͜ͷهࣄͰհ͍ͯ͠·͢ɻ https://inside.dmm.com/entry/2020/01/17/ payment-cdk-serverless
$POUBJOFS &$4'BSHBUF
֓ཁ w ΫϨδοτΧʔυػೳؔ࿈ͷϑϩϯτΤϯυΞϓϦέʔ γϣϯ w ΠϯϑϥͱΞϓϦέʔγϣϯͷͦΕͧΕͷߋ৽ͷࡍͷɺ σϓϩΠपΓΛ্ख͘࿈ܞͤ͞Δඞཁ͕͋Δɻ
None
։ൃϑϩʔ
None
None
%FQMPZɾ3FMFBTF
*OGSBTUSVDUVSFEFQMPZ ᶃ13NFSHF ᶄDELEFQMPZ
"QMJDBUJPOEFQMPZ &$4 ᶃ13NFSHF "QQMJDBUJPOSFQPTJUSZ *OGSBTUSVDUVSFSFQPTJUSZ ᶄ1VTI&$3 ᶅ৽͍͠JNBHFUBHʹमਖ਼ͯ͠QVTI ։ൃڥͰࣗಈमਖ਼ɺຊ൪Ͱखಈमਖ਼ ᶈ1VMMOFXJNBHF ᶇDELEFQMPZ
ᶆ13NFSHF
ϒϥϯνઓུ w ֤ڥ͝ͱʹϒϥϯνΛ༻ҙɻ QSETUHEFWTBOECPY w QSETUHEFWͰଞͷϓϩμΫτଞαʔϏεͷ1'ػೳ ͱͯ͠ݕূʹΘΕΔͨΊɺӨڹͷ͋ΔσϓϩΠͰ͖ͳ ͍ɻ w
TBOECPYଞͷϓϩμΫτͱͷͭͳ͗͜ΈΛ͠ͳ͍ಠཱͨ͠ ։ൃڥɻ։ൃதͷڍಈͷ֬ೝʹ༻͢Δɻ
"84αʔϏεڍಈ֬ೝ ։ൃ։࢝ EFWө TUHө QSEө
։ൃํ w ͋Δ۠ͰTUBDLΛ͚Δ.VMUJ4UBDLӡ༻ QSPEVDU MPHج൫ .PDL"QJ &$3 71$ͳͲ
w υϝΠϯͷূ໌ॻऔಘ "$. ͳͲೋʹΔ͜ͱͳ͍෦ 8FC6*Ͱߦͳ͍ͬͯΔɻ w ڥͷΓସ͑DELEFQMPZDFOWEFWͷΑ͏ͳDPOUFYUʹ͠ ͯΓସ͍͑ͯ͠Δɻ const envName = app.node.tryGetContext('env') || 'dev'; const config = app.node.tryGetContext('environments')[envName];
։ൃ࣌ͷϝϦοτ
ϓϩάϥϜݴޠͰߏΛఆٛͰ͖Δɹ w ݱࡏ"84$%,+BWB4DSJQUɾ5ZQF4DSJQUɾ1ZUIPOɾ +BWBɾ/&5ʹରԠ͍ͯ͠Δɻ w ಠࣗͷ%4-Ͱॻ͘ඞཁ͕ͳ͍ͨΊɺͦͷݴޠΛѻ͍ͬͯͨΤ ϯδχΞͳΒ։ൃʹࢀՃ͍͢͠ɻ w ·ͨΞϓϦέʔγϣϯ߹ΘͤΔͱޮ61
ศརͳ$POTUSVDU-JCSBSZ w "84$%,ʹ$POTUSVDUMJCSBSZͱ͍͏$MPVE'PSNBUJPOͰ هࡌ͢Δ༰ΛΧϓηϧԽ͞ΕͨϞδϡʔϧ͕͋Δɻ w $POTUSVDUʹछྨ͕͋Γɺ-PX-FWFM$POTUSVDU )JHI -FWFM$POTUSVDU 1BUUFSOTͷࡾछྨ͕͋ΓɺͦΕͧΕఆٛϨ ϕϧ͕ҧ͏ͷ͕༻ҙ͞Ε͍ͯΔɻ
w ݸਓతʹ)JHI-FWFM$POTUSVDUɺ1BUUFSOT͕͋Ε$%, ߏங͢ΔϝϦοτ͕ग़͖ͯͦ͏͔ͳͱࢥ͍ͬͯ·͢ɻ ࢀߟ AWS Cloud Development Kit (AWS CDK) Developer Guide https://docs.aws.amazon.com/cdk/latest/guide/constructs.html
-PX-FWFM$POTUSVDU w $GOͱQSFpY͕͍͍ͯΔϥΠϒϥϦɻ$MPVE'PSNBUJPOͷ֤ ϦιʔεʹͨΔɻ )JHI-FWFM$POTUSVDU w $MPVE'PSNBUJPOͷ֤ϦιʔεΛநԽ͍ͯ͠ΔϥΠϒϥϦɻ NFUIPEͳͲ͕༻ҙ͞Ε͓ͯΓఆ͕ٛ؆୯ɻ 1BUUFSOT w
ෳͷϦιʔεΛར༻͢ΔϢʔεέʔεΛநԽͨ͠ϥΠϒϥ ϦɻBXTFDTQBUUFSOTBXTSPVUFQBUUFSOT͕ͨΔɻ
None
const subnets = vpc.selectSubnets({ subnetGroupName: isolatedSubnetName }); const redisSubnetGroup =
new elasticache.CfnSubnetGroup(this, `${id} RedisClusterPrivateSubnetGroup`, { cacheSubnetGroupName: `${env}ElastiCacheSubnetGroup`, subnetIds: subnets.subnetIds, description: `${env} ElastiCache SubnetGroup` }); const redisReplication = new elasticache.CfnReplicationGroup(this, `${id} RedisReplicaGroup`, { engine: ‘redis’, cacheNodeType: config.cacheNodeType, replicasPerNodeGroup: 1, numNodeGroups: 1, automaticFailoverEnabled: true, autoMinorVersionUpgrade: true, replicationGroupDescription: ‘cluster redis’, cacheSubnetGroupName: redisSubnetGroup.cacheSubnetGroupName, securityGroupIds: [elasticacheSG.securityGroupId] }); redisReplication.addDependsOn(redisSubnetGroup); -PX-FWFM$POTUSVDU4BNQMF FMBTUJDBDIF
None
)JHI-FWFM$POTUSVDUTBNQMF "1*HBUFXBZ-BNCEB export class LambdaApigatewayStackStack extends cdk.Stack { constructor(scope: cdk.Construct,
id: string, props?: cdk.StackProps) { super(scope, id, props); const restApi = new RestApi(this, id, { restApiName: 'SampleApiGateway', }); const sampleResource = restApi.root.addResource('SampleResource'); const sanpelFun = new Function(this, 'MyFunction', { runtime: Runtime.NODEJS_12_X, handler: 'index.handler', code: new AssetCode('./src/lambda'), }); const confirmDeletionIntegration = new LambdaIntegration(sanpelFun); sampleResource.addMethod('POST', confirmDeletionIntegration); } }
export class EcsPatternSampleStack extends Stack { constructor(scope: Construct, id: string,
props?: StackProps) { super(scope, id, props); const cluster = new Cluster(this, 'EcsPatternSampleCluster', { clusterName: 'EcsPatternSampleCluster', }); const taskDefinition = new FargateTaskDefinition(this, 'TaskDefinition'); const container = taskDefinition.addContainer('EcsPatternSampleContainer', { image: ContainerImage.fromRegistry('amazon/amazon-ecs-sample') }); container.addPortMappings({ containerPort: 80 }); new ApplicationLoadBalancedFargateService(this, 'EcsPatternSampleService', { cluster: cluster, memoryLimitMiB: 1024, cpu: 512, desiredCount: 1, taskDefinition: taskDefinition }); } } 1BUUFSOTTBNQMF FDTQBUUFSOT
ࠓճ1BUUFSOT͓ͬͯΓ·ͤΜɻ w ӈਤͷΑ͏ͳ"-#ύεϧʔςΟϯ άͰྲྀ͢4FSWJDFΛ͚ΔߏʹͰ ͖ΔΑ͏ʹ͔ͨͬͨͨ͠ΊɺFDT QBUUFSOTͷར༻Λݟૹͬͨɻ w ݱࡏͷFDTQBUUFSOTෳͷ 4FSWJDFͷఆٛʹରԠ͍ͯ͠ͳ͍ͨ Ίɻ
طଘ4FSWJDF ৽ن4FSWJDF IPHF IVHB
4UFQ'VODUJPOTͷ࣮ w ϫʔΫϑϩʔཧΛͯ͘͠ΕΔ"84ͷϚωδϝϯταʔ ϏεɻMBNCEBͷ݁Ռ࣍ୈͰذॲཧͳͲ࣮Ͱ͖Δɻ w ௨ৗKTPOͰఆٛΛॻ͍͍͕ͯ͘ɺ"84$%,ͩͱ $POTUSVDU͕NFUIPEΛ͓ͬͯΓɺ؆୯ʹॻ͘͜ͱ͕Մ ೳ
ࢀߟ BXTDELSFGFSFODFBXTTUFQGVODUJPOUBTLT IUUQTEPDTBXTBNB[PODPNDELBQJMBUFTUEPDTBXTTUFQGVODUJPOTUBTLTSFBENFIUNM const firstTask = new sfn.Task(stack, `${stack.stackName}_CommitTask_${serviceName}`, {
task: new sfnTask.InvokeFunction(stepFunc) }).addRetry({ errors: failErrors, maxAttempts: 0, }).addRetry({ errors: retryErrors, interval: Duration.seconds(10), maxAttempts: 26, backoffRate: 1.3, }).addCatch(fail, { errors: failErrors }).addCatch(secondTask, { errors: retryErrors }); $POTUSVDUͷNFUIPEͰUBTLΛ৭ʑઃఆͰ͖Δ
w ॳճͷϦτϥΠ͘ɺͩΜͩΜ࣍ճϦτϥΠ࣌ؒΛ৳ͯ͠ ͍͘ϦτϥΠઃܭ w ࠷̎࣌ؒͷϦτϥΠִؒͰिؒଓ͚Δ༷ ϦτϥΠϑϩʔ
։ൃதʹग़ձͬͨนͨͪ 5JQTతͳ
DSPTTTUBDLࢀরͰΞοϓσʔτͰ͖ͳ͍ w "4UBDL͕#TUBDLʹґଘ͍ͯ͠Δ࣌ʹ$%,ͷΞοϓσʔτ ˠΤΫεϙʔτݩͰ͋ΔελοΫΤΫεϙʔτΛมߋ·ͨআͰ ͖ͳ͍͜ͱ͔Βൃੜ ˠൃੜ͠ͳ͍όʔδϣϯ·Ͱ$%,Λ͠ɺҰґଘؔͱղ͍͔ͯ ΒΞοϓσʔτ͢Δ͜ͱͰղܾ
$MPVE'PSNBUJPOͷ͕ࣝඞཁʹͳΔ߹ w "84$%,ͷDELTZOUI EFQMPZͰग़ྗ͞ΕΔΤϥʔ"84 $%,͕ग़͢Τϥʔ͋Εɺ$MPVE'PSNBUJPOͷΤϥʔ͕ͦ ͷ··ग़ྗ͞ΕΔ߹͋Δɻ w ͦͷ߹ɺϦϑΝϨϯε$MPVE'PSNBUJPOͷτϥϒϧ γϡʔςΟϯάʹͳΔͨΊɺܦݧ͕ͳ͍߹গۤ͠ઓ͢Δ ͔͠Εͳ͍ɻ
σΟϨΫτϦߏΛߟܾ͑ͯΊ͍ͯ͘ w جຊతʹ"84$%,ͰDELJOJU͢Δ߹ɺσΟϨΫτϦߏ ࠷ݶͷͷ͔͠Ͱ͖ͳ͍ͨΊɺαʔϏεͷߏͱݴޠͷಛ ੑΛՃຯͭͭ͠ɺܾΊ͍͔ͯͳ͚ΕͳΒͳ͍ɻ w ಛʹVOJUUFTUʹ֤ؔͯ͠-BNCEB͕ຊ൪ͱಉ͡ϥΠϒϥϦ ঢ়گͰಈ࡞͔ͤͨͬͨͨ͞ΊɺUTDPOpHͷQBUITͰMBZFS෦ ͷϥΠϒϥϦΛಡΈࠐΉͳͲ͕ඞཁɻ
├── README.md ├── bin │ └── credit-gateway.ts ├── cdk.json ├──
lib │ ├── credit-gateway-log-stack.ts │ ├── credit-gateway-stack.ts │ ├── schema │ │ └── credit-gateway-schema.ts │ └── util │ └── wafacl.ts ├── package-lock.json ├── package.json ├── src │ └── lambda │ ├── common │ ├── confirm-deletion │ ├── delete │ └── layer ├── test │ └── src │ └── lambda └── tsconfig.json
ࠓޙͷ՝
DELKTPO DPOUFYU ͷංେԽରࡦ w Γن͕େ͖͘ͳΕͳΔ΄ͲDPOUFYUʹ͍ͨͤͨ ใ૿͍͖͑ͯɺ͖࣋ͭใΛਫ਼͍ࠪͯ͘͠ඞཁ͕͋ Δɻ w $%,ଆͰෳͷDPOUFYUpMFΛಡΈࠐΉͷରԠ͍ͯ͠ ͳ͍ͨΊɺׂ͕͍͠ɻ
Ξοϓσʔτʹ͍͍͚ͭͯΔͩΖ͏͔ʜ w "84$%,։ൃ͕ΜͳͨΊɺ͍ͩͿଞͷπʔϧʹൺ ΔͱΞοϓσʔτ͕ૣ͍ɻ w ઌड़ͷ͕݅͋ͬͨͨΊɺΞοϓσʔτʹΑΔʹؾΛ ͚ͭͯ͜·Ίʹ֬ೝ͍ͯ͠Δ͕ɺWYYͰͲͷ͘Β͍ͷม ߋ͕͋Δ͔ʜ
ίʔυͷΈ͕ग़͖ͯͯɺਚ͖ͳ͍ɻ w Γɺ$MPVE'PSNBUJPOUFSSBGPSNͳͲΑΓॊೈʹ ίʔυ͕ॻ͚ΔɺΈ͕ਚ͖ͳ͍ɻ w ྫ͑"1*(BUFXBZʹඥ͍ͮͨ-BNCEBΛ࡞ͬͯ͘ΕΔ ؔͳͲ࡞ͬͯɺ͠ߏมߋ͕͋ͬͨ߹ʹɺ݁ہ ่͢ඞཁग़ͯ͘Δɻ
·ͱΊ
w *B$πʔϧ͕ෳग़͖ͯͨނɺνʔϜʹ߹ͬͨɺϓϩμΫ τʹ߹ͬͨπʔϧͷબ͕ඞཁʹͳ͖ͬͯͨɻ w "84$%,Λ͏ͱ$POTUSVDUΛͬͯɺΞʔΩςΫνϟ ʹؔΘΒͣɺޮతʹ4UBDLΛઃܭͰ͖ɺίϚϯυҰͭͰ ΠϯϑϥɺΞϓϦέʔγϣϯͷߏங͢Δ͜ͱ͕Ͱ͖Δɻ w "84ͰɺҰ͔ΒڥΛ࡞ΔͷͰ͋Εɺൈ܈ʹΦεε ϝɻ
Α͍$%,ϥΠϑΛʂ ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ