DevelopersIO 2023のイベントで登壇した際の内容です。
AWS CDKͷ࠷ڧͷॻ͖ํΛ࣮ફͯ͠ΈΔ 2023൛2023/7/8CXࣄۀຊ෦ ࠤ౻ஐथ
View Slide
ࣗݾհ• ࠤ౻ஐथ• CXࣄۀຊ෦ ΞʔΩςΫτνʔϜ Ϛωʔδϟʔ• JAWS-UG CDKࢧ෦ ӡӦ• ڭһ໔ڐ ߴߍ/தֶֶ ใ• ͖ͳAWSαʔϏεɿLambdaɺCDK3@tmk2154tomoki10
ࠓճ͢͜ͱʢҰ୴հʣҎԼͷτϐοΫ͔ΒԿݸ͔͢41. جຊతͳCDKͷߏͷ͓͞Β͍2. CDKͰաͳநԽΛආ͚Δ3. StackͰͳ͘ConstructͰ͚Δ4. Construct L2(+α)ΛϝΠϯͰ͏5. ڥ͝ͱͷࠩΦϒδΣΫτΛ͏6. Stackఆٛͷग़͚͠7. ςετΛͲ͜·ͰΔ͔8. NodejsFunctionΛ͓͏ҕһձ9. ϞϊϨϙ͔ɺγϯάϧϨϙ͔
ࠓͷϋογϡλά 5ɹ #devio2023
࣍•νϣʔΫτʔΫͱ•ͳͥࠓ͢ͷ͔•͢͜ͱͷݩωλ•ࠓճ͢͜ͱ6
νϣʔΫτʔΫͱٕज़ઐࣝʹؔ͢ΔτϐοΫʹ͍ͭͯɺΤΩεύʔτઐՈ͕ࢀՃऀʹରͯ͠తʹઆ໌σϞϯετϨʔγϣϯΛߦ͍ͳ͕ΒɺରσΟεΧογϣϯΛߦ͏ΠϕϯτܗࣜͰ͢ɻνϣʔΫτʔΫͷಛɺࢀՃऀͱΤΩεύʔτͱͷؒͰରσΟεΧογϣϯ͕׆ൃʹߦΘΕΔ͜ͱͰ͢ɻࢀՃऀɺ࣭Λͨ͠ΓɺٙҙݟΛड़ͨΓ͢Δ͜ͱͰɺΤΩεύʔτͱͷ૬ޓ࡞༻Λ௨ͯ͡ΑΓਂ͍ཧղࣝΛಘΔ͜ͱ͕Ͱ͖·͢ɻ7
νϣʔΫτʔΫͱٕज़ઐࣝʹؔ͢ΔτϐοΫʹ͍ͭͯɺΤΩεύʔτઐՈ͕ࢀՃऀʹରͯ͠తʹઆ໌σϞϯετϨʔγϣϯΛߦ͍ͳ͕ΒɺରσΟεΧογϣϯΛߦ͏ΠϕϯτܗࣜͰ͢ɻνϣʔΫτʔΫͷಛɺࢀՃऀͱΤΩεύʔτͱͷؒͰରσΟεΧογϣϯ͕׆ൃʹߦΘΕΔ͜ͱͰ͢ɻࢀՃऀɺ࣭Λͨ͠ΓɺٙҙݟΛड़ͨΓ͢Δ͜ͱͰɺΤΩεύʔτͱͷ૬ޓ࡞༻Λ௨ͯ͡ΑΓਂ͍ཧղࣝΛಘΔ͜ͱ͕Ͱ͖·͢ɻ8
͍ͭͰ/ͲΜͳ࣭ͰWelcome!!9
CDKͬͯԿʁͿͬͪΌ͚ࠓϊϦͰདྷͨΜͰ10ྫ͑…
࣭CDKͬͨ͜ͱ͕͋Δਓʁɹɹɹ1. ࣄͰ2Ҏ্͍ͬͯΔɹɹɹ2. ࣄͰ1Ҏ্͍ͬͯΔɹɹɹ3. ϋϯζΦϯۀ֎Ͱࢼ͍ͯ͠Δɹɹɹ4. ͬͨ͜ͱ͕ͳ͍11
ͳͥࠓ͢ͷ͔ 12ੲͷࢿྉ
2021ͷࢿྉͰݕ౼ࣄ߲ྑ͍͕͑ݹ͘ͳ͖ͬͯͨͳͥࠓ͢ͷ͔ 13
ࠓճ͢͜ͱͷݩωλ 14
ࢿྉΞοϓϩʔυ͞Εͯ·͢ 15
͜ͷ໘ന͞ΘͬͯΔͷ͔ͳ͋ʁͬͱΊ͍ͨʂ16
ࠓճ͢͜ͱҎԼͷτϐοΫ͔ΒԿݸ͔͢171. جຊతͳCDKͷߏͷ͓͞Β͍2. CDKͰաͳநԽΛආ͚Δ3. StackͰͳ͘ConstructͰ͚Δ4. Construct L2(+α)ΛϝΠϯͰ͏5. ڥ͝ͱͷࠩΦϒδΣΫτΛ͏6. Stackఆٛͷग़͚͠7. ςετΛͲ͜·ͰΔ͔8. NodejsFunctionΛ͓͏ҕһձ9. ϞϊϨϙ͔ɺγϯάϧϨϙ͔
αϯϓϧϦϙδτϦhttps://github.com/tomoki10/cdk-best-design-202318
جຊతͳCDKͷߏͷ͓͞Β͍ 19DELKTPO03BQQPQUJPOFOUSZQPJOU
جຊతͳCDKͷߏͷ͓͞Β͍ 20
CDKͰաͳநԽΛආ͚Δखଓܕ͕ͩએݴܕతʹॻ͘21
CDKͰաͳநԽΛආ͚Δखଓܕ͕ͩએݴܕతʹॻ͘ ҎԼۃͳѱ͍ྫ22
CDKͰաͳநԽΛආ͚ΔIfɺforۃྗॻ͔ͳ͍ɺڥࠩҟجຊύϥϝʔλͰઃఆ ։ൃ/ຊ൪ؒͰͷϦιʔεଘࡏͷࠩҟۃྗ͑Δ※23※ ʮTwelve-Factor App ։ൃ/ຊ൪Ұகʯhttps://12factor.net/ja/dev-prod-parity
StackͰͳ͘ConstructͰ͚Δ 24PropsʹΑΔStackؒࢀর͕ݩڟͰCDK༻ऀͷ ΄΅100%͕ϋϚΔ᠘͍ͬͯͳ͍͋ΔCDKͷΫϩεελοΫؒࢀরͰ ٧·ͬͨ͜ͱ͋Γ·͔͢ʁ(Սۭ)https://dev.classmethod.jp/articles/aws-cdk-props-cross-stack-reference-problem-and-handle/
StackͰͳ͘ConstructͰ͚Δ 25
L1,2,3 Constructͷ͓͞Β͍ 26$POTUSVDUͷ-BZFSͷΠϝʔδ---&$4$%,$POTUSVDU&$3$%,$POTUSVDU71$$%,$POTUSVDU&$4$GO$POTUSVDU&$4$%,$POTUSVDU&$4$GO$POTUSVDU&$4$MPVE'PSNBUJPO&$41BUUFSOT&$4$MPVE'PSNBUJPOʜʜ-நԽରԠରԠநԽ
Construct L2(+α)ΛϝΠϯͰ͏ 27L2 + Security or Governance or Best SettingPlatform TeamSecurity TeamͳͲ͕ਪઃఆΛॻ͖ɺࢀর࣮͠
ڥ͝ͱͷࠩΦϒδΣΫτΛ͏ 28cdk.json:{"app": "npx ts-node --prefer-ts-exts bin/cdk-best-design-2023.ts”,"context": {"projectName": "hoge-fuga","dev": {"envName": "dev","env": {"account": "123456789012","region": "ap-northeast-1"}},"stg": {"envName": “stg",...}...}}σϓϩΠ࣌ͷίϚϯυɿcdk deploy -c environment=dev ~~ੲͷϕετϓϥΫςΟεɺcdk.jsonͰڥࠩΛઃఆ
ڥ͝ͱͷࠩΦϒδΣΫτΛ͏ 29parameter.tsbin/cdk-best-design-2023.ts
Stack ఆٛͷग़͚͠ 30
Stack ఆٛͷग़͚͠ 31
ςετΛͲ͜·ͰΔ͔ 32• Snapshot Test CloudFormationςϯϓϨʔτΛอଘ͠ɺࠩ֬ೝΛߦ͑Δ• GoodɿCDKΞοϓσʔτ࣌ͷมߋࠩΛ֬ೝͰ͖ͯ҆৺• BadɿS3ͳͲΞηοτͰఆҎ্ʹมߋ͕ࠩͰ͖ΔͷͰ੍͕͍Δ
assetsͷิʢCDKͷཪଆͷجຊతͳಈ͖ʣ 33Client CI/CD EnvSourcecodeAWSCloudFormationAWS accountORAWS CDKCfnTemplateStack(Resource State)CfnTemplate1.SynthesizeS3Bucketassets2.Upload3.Deploy 5.GenerateAWS LambdaAmazonAPI Gateway6.API Call4.Pull
ςετΛͲ͜·ͰΔ͔ 34• Fine-grained Assertions CloudFormation্ͷϦιʔε͕ఆͨ͠ঢ়ଶ͔֬ೝͰ͖Δ• Goodɿ੍ޚߏจΛ͏߹ʹಈ࡞֬ೝ͕Ͱ͖Δ• BadɿL2ϕʔεͰίʔυΛએݴతʹॻ͍͍ͯΕͦͦෆཁͳ߹ଟ͍
ςετΛͲ͜·ͰΔ͔ 35• Integration Test (Alpha) ϦιʔεΛ࣮ࡍͷΞΧϯτʹσϓϩΠͯ͠ɺσϓϩΠՄೳ͔ͷ֬ೝ σϓϩΠޙʹHTTPSϦΫΤετͷૄ௨֬ೝͳͲ͕Ͱ͖Δ CDKͷ෦࣮ͰओʹΘΕ͍ͯΔ• Goodɿ࣮ࡍͷڥͰఆͨ͠ಈ࡞Λ͢Δ͔֬ೝՄೳ• BadɿσϓϩΠ͕͋ΔͷͰςετύλʔϯ͕ଟ͍ͱςετ͕࣌ؒ͘ͳΔ
ςετΛͲ͜·ͰΔ͔ 36• cdk-nag AWSNIST.800.53ɺPCI DSSͳͲͷηΩϡϦςΟɾίϯϓϥΠΞϯεϧʔϧʹ ४ڌ͍ͯ͠Δ͔֬ೝͰ͖Δπʔϧ• GoodɿσϓϩΠલݕূͰηΩϡϦςΟͷγϑτϨϑτ͕࣮ݱͰ͖Δ• Badɿޡݕଟ੍͕݁͘ߏඞཁΒ͍͠• pdk-nag※ cdk-nagͷϥΠτ൛APAC(ओʹΦʔετϥϦΞ)ͷAWS Prototyping Team͕࡞※https://aws.github.io/aws-prototyping-sdk/developer_guides/pdk-nag/index.html
NodejsFunctionΛ͓͏ҕһձ 37LambdaͰNodejsΛ͏ࡍͷศརπʔϧ͕ἧ͍ͬͯΔ L2+͙Β͍ͷബ͍Construct ҎԼརͷҰ෦• όϯυϧ͕؆୯ɻesbuildΛೖΕΔ͚ͩ distσΟϨΫτϦͳͲதؒͷϑΝΠϧஔ͖ෆཁ• HotswapͰ࠷ͷσϓϩΠʢඵͰσϓϩΠ😆 ٳΉՋͳ͠😢ʣ• BundlingΦϓγϣϯͷcommandHooksͰҙίϚϯυϑοΫͳͲ͕Մೳʂ ͜ͷϑΝΠϧ͍ͭͰʹLambdaʹೖΕ͍ͨͱ͔OK• awsSdkConnectionReuse ͰTCPଓͷ͍ճ͠ΛαΫοͱઃఆ
ϞϊϨϙ͔ɺγϯάϧϨϙ͔ 38͓લΑΓ·্ͩͷੈք͕͋Δʂ💦ͳΜʜͩͱʜ
ϞϊϨϙ͔ɺγϯάϧϨϙ͔ 39ϦϙδτϦʢϞϊϨϙʣ
ϞϊϨϙ͔ɺγϯάϧϨϙ͔ 40ϦϙδτϦ ϦϙδτϦ ϦϙδτϦ
એ 41དྷि$%,ࢧ෦ͰΠϕϯτΓ·͢ʂ ਫʙhttps://jawsug-cdk.connpass.com/
Ξϯέʔτ͓ئ͍͠·͢ 42https://forms.gle/Upi2i5PsMTEUyJ6F8ຬ্ҐͷηογϣϯΛޙϒϩάͰެ։༧ఆʂճͷ͝ڠྗΛΑΖ͓͘͠ئ͍͠·͢ɻ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ43