Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DMM 決済基盤で AWS CDK を使っている話
Search
HukurouKk
March 03, 2020
Programming
0
480
DMM 決済基盤で AWS CDK を使っている話
CDK meetup #2 @onlineで発表したスライドです。
HukurouKk
March 03, 2020
Tweet
Share
Other Decks in Programming
See All in Programming
TypeScriptを活用したi18n対応
minako__ph
8
1.5k
Automatisiere deine Prozesse mit GitHub Actions!
ahus1
0
260
ゼロからつくる 2D物理シミュレーション ~物理現象をコードに落とし込む方法~
infiniteloop_inc
0
110
Pure GoでアニメーションGIFのリサイズを実装する
logica0419
0
240
ReactNativeでスケジュール帳を作っている話
mokoshi
0
180
通信の不安定さに悩んでいたらシュッとプロキシを書けて改善できちゃった話
bellwood4486
2
340
record4s --- Extensible Records for Scala 3, and Domain Modeling with Structural Types
tarao
2
11k
RubyKaigi Effect 2023, and ...
tagomoris
1
510
ruby.wasm 最前線 2024 - wasmでMockServerをつくる #rubykaigi
lnit
2
440
ABEMA 画像配信基盤における Cloudflare Workers の活用
peaceiris
6
480
Goバックエンド標準化プロジェクトの取り組み
qualiarts
4
650
Implementing Domain Driven Design with Spring
maciejwalkowiak
2
1k
Featured
See All Featured
Clear Off the Table
cherdarchuk
87
310k
Code Review Best Practice
trishagee
57
16k
Into the Great Unknown - MozCon
thekraken
16
1.2k
Fireside Chat
paigeccino
23
2.7k
Building an army of robots
kneath
300
42k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
188
16k
4 Signs Your Business is Dying
shpigford
176
21k
Happy Clients
brianwarren
92
6.5k
Gamification - CAS2011
davidbonilla
77
4.7k
Visualization
eitanlees
137
14k
Unsuck your backbone
ammeep
664
57k
Build your cross-platform service in a week with App Engine
jlugia
227
17k
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ͰɺҰ͔ΒڥΛ࡞ΔͷͰ͋Εɺൈ܈ʹΦεε ϝɻ
Α͍$%,ϥΠϑΛʂ ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ