Slide 1

Slide 1 text

(?:Perl MongersͷͨΊͷ)? AWS CDKೖ໳ Japan.pm 2021 id:karupanerura

Slide 2

Slide 2 text

@karupanerura • ୅දཧࣄ @ Japan Perl Association • ΤϯδχΞ @ DeNA, Co,. LTD. • Perl/Go/Type Script/Java/etc… • PAUSE: KARUPA

Slide 3

Slide 3 text

͸ͳ͢͜ͱ • AWS CDKͱͦͷ࢓૊Έ • AWS CDKͷֶͼํ • AWS CDKͷצॴ • ·ͱΊ

Slide 4

Slide 4 text

AWS CDKͱͦͷ࢓૊Έ

Slide 5

Slide 5 text

AWS CDK #ͱ͸

Slide 6

Slide 6 text

AWS Cloud Development Kit https://aws.amazon.com/jp/cdk/

Slide 7

Slide 7 text

AWS Cloud Development Kit • ΞϓϦέʔγϣϯΫϥ΢υϦιʔεΛఆٛ͢ΔϑϨʔϜϫʔΫ • TypeScript, JavaScript, Python, Java, C# Ͱ࢖͑Δ • TypeScript͔Β֤ݴޠʹτϥϯεύΠϧ͞Ε͍ͯΔҝ • AWS CloudFormationΛ࢖ͬͯϓϩϏδϣχϯά͢Δ

Slide 8

Slide 8 text

AWS CloudFormation?

Slide 9

Slide 9 text

AWS CloudFormation (Cfn) https://aws.amazon.com/jp/cloudformation/

Slide 10

Slide 10 text

AWS CloudFormation (Cfn) • ܾΊΒΕͨܗࣜͷYAML(ςϯϓϨʔτ)ͰAWSϦιʔεΛఆٛ • ͦΕΛ࣮ࡍͷϦιʔεͱͯ͠ϓϩϏδϣχϯά • Ϧιʔεͷঢ়ଶΛAWS্ʹอ࣋͢Δ • มߋ͸ͦͷࠩ෼͚ͩΛ൓ө

Slide 11

Slide 11 text

ͭ·Γ

Slide 12

Slide 12 text

AWS CDK͸͜͏ಈ͘ "84$%, "84 $MPVE'PSNBUJPO "843FTPVSDFT ςϯϓϨʔτੜ੒ ϓϩϏδϣχϯά

Slide 13

Slide 13 text

AWS CDK͸ AWS CloudFormationͷςϯϓϨʔτΛ ಈతʹੜ੒͢Δଠ࿠

Slide 14

Slide 14 text

ςϯϓϨʔτΤϯδϯ͡ΌΜ

Slide 15

Slide 15 text

ʢͪΐͬͱҧ͍·͢ʣ

Slide 16

Slide 16 text

ͳʹ͕ҧ͏ͷ͔

Slide 17

Slide 17 text

ςΩετͷϨϕϧͰ ͋Ε͜Ε΍ΔΘ͚Ͱ͸ͳ͍

Slide 18

Slide 18 text

AWS CDKͷಛ௃ • ίʔυͰந৅తʹϦιʔε΍ͦͷґଘؔ܎ͳͲΛදݱ͢Δ • ConstructͱStackͱ͍͏֓೦Λ༻͍Δ • Construct: ࣮ࡍʹߏ੒͢ΔϦιʔε܈ͷந৅දݱ • Stack: ϓϩϏδϣχϯά͢Δ୯Ґͷදݱ

Slide 19

Slide 19 text

ͭ·ΓͲ͏͍͏͜ͱͳͷ͔

Slide 20

Slide 20 text

࣮ࡍͷߏ੒ྫ

Slide 21

Slide 21 text

cdk init app --language=typescript . !"" README.md !"" bin # %"" foo.ts !"" cdk.json !"" jest.config.js !"" lib # %"" foo-stack.ts !"" package-lock.json !"" package.json !"" test # %"" foo.test.ts %"" tsconfig.json 3 directories, 9 files

Slide 22

Slide 22 text

. !"" README.md !"" bin # %"" foo.ts !"" cdk.json !"" jest.config.js !"" lib # %"" foo-stack.ts !"" package-lock.json !"" package.json !"" test # %"" foo.test.ts %"" tsconfig.json 3 directories, 9 files ࣮ߦͷى఺ Stackͷఆٛ cdk init app --language=typescript

Slide 23

Slide 23 text

bin/${project}.ts • ࣮ߦͷى఺ͱͳΔϑΝΠϧ • StackΦϒδΣΫτΛ࡞੒͢Δ • ͜ΕʹΑͬͯStackͷIDΛCDK͕ೝࣝͰ͖ΔΑ͏ʹͳΔ • ίϯετϥΫλʹύϥϝʔλΛ౉͢͜ͱ΋Ͱ͖Δ

Slide 24

Slide 24 text

lib/${project}-stack.ts • StackͷఆٛΛ͢Δ • ͜ͷStackͰͲͷConstructΛߏ੒͢Δͷ͔Λදݱ͢Δ • StackͷίϯετϥΫλ͔Βߏ੒͢ΔConstructͷΠϯελϯε Λੜ੒͢Δ

Slide 25

Slide 25 text

import * as cdk from '@aws-cdk/core'; export class ${Project}Stack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // The code that defines your stack goes here } } lib/${project}-stack.ts

Slide 26

Slide 26 text

ConstructΛ࡞͍ͬͯͳ͍ ۭͷStackʹͳ͍ͬͯΔ

Slide 27

Slide 27 text

ެࣜʹఏڙ͞Ε͍ͯΔConstructΛ௥Ճ

Slide 28

Slide 28 text

import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; export class FooStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new s3.Bucket(this, "SampleBucket", { encryption: s3.BucketEncryption.S3_MANAGED, bucketName: 'japan-pm-2021-sample-bucket', publicReadAccess: true, websiteIndexDocument: 'index.html', accessControl: s3.BucketAccessControl.PUBLIC_READ, }) } } lib/${project}-stack.ts

Slide 29

Slide 29 text

import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; export class FooStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new s3.Bucket(this, "SampleBucket", { encryption: s3.BucketEncryption.S3_MANAGED, bucketName: 'japan-pm-2021-sample-bucket', publicReadAccess: true, websiteIndexDocument: 'index.html', accessControl: s3.BucketAccessControl.PUBLIC_READ, }) } } lib/${project}-stack.ts FooStackͷείʔϓͰ࡞੒

Slide 30

Slide 30 text

import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; export class FooStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new s3.Bucket(this, "SampleBucket", { encryption: s3.BucketEncryption.S3_MANAGED, bucketName: 'japan-pm-2021-sample-bucket', publicReadAccess: true, websiteIndexDocument: 'index.html', accessControl: s3.BucketAccessControl.PUBLIC_READ, }) } } lib/${project}-stack.ts SampleBucketͬͯIDͰѻ͏

Slide 31

Slide 31 text

import * as cdk from '@aws-cdk/core'; import * as s3 from '@aws-cdk/aws-s3'; export class FooStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); new s3.Bucket(this, "SampleBucket", { encryption: s3.BucketEncryption.S3_MANAGED, bucketName: 'japan-pm-2021-sample-bucket', publicReadAccess: true, websiteIndexDocument: 'index.html', accessControl: s3.BucketAccessControl.PUBLIC_READ, }) } } lib/${project}-stack.ts ͲͷΑ͏ͳ΋ͷ͔ৄࡉΛࢦఆ

Slide 32

Slide 32 text

࣮ࡍʹ࡞ͬͯΈΔ (DEMO) http://japan-pm-2021-sample-bucket.s3-website-ap-northeast-1.amazonaws.com/

Slide 33

Slide 33 text

ͳʹΛͨ͠ͷ͔

Slide 34

Slide 34 text

npm run cdk -- bootstrap • CDK toolkit stackΛAWS্ʹ࡞੒͢Δ • cdk͕ಈ࡞͢ΔͨΊʹඞཁͳϦιʔεΛ࡞੒ • ར༻͢ΔϦʔδϣϯຖʹ࠷௿1౓͸࣮ߦ͢Δඞཁ͕͋Δ • ॳΊͯར༻͢Δ৔߹͸·࣮ͣߦ͢Δඞཁ͕͋Δ

Slide 35

Slide 35 text

npm run cdk -- deploy FooStack • FooStackΛϓϩϏδϣχϯά͢Δ • FooStackΛCloudFormation্ʹ࡞੒͢Δ • FooStackͷঢ়ଶͱࠩ෼ΛऔΓɺࠩ෼ΛϓϩϏδϣχϯά͢Δ • ੒ޭͨ͠ΒFooStackͷঢ়ଶΛ࠷৽ͷঢ়ଶʹߋ৽͢Δ

Slide 36

Slide 36 text

ͭ·Γ

Slide 37

Slide 37 text

Constructͱ͸ͳΜͩͬͨͷ͔ • Construct͸ʮΫϥ΢υίϯϙʔωϯτʯΛදݱ͢Δ֓೦ • جຊ͸ s3.Bucket ͳͲެࣜʹఏڙ͞Ε͍ͯΔ΋ͷΛ࢖͏ • ಺෦తʹ͸ෳ਺ͷϦιʔεΛ࡞͍ͬͯΔ΋ͷ΋͋Δ • ந৅౓͸ConstructʹΑͬͯҟͳΔ

Slide 38

Slide 38 text

Constructͱ͸ͳΜͩͬͨͷ͔ • ࠷΋ந৅౓͕௿͍Construct͸Cfnͷදݱͱ΄ͱΜͲಉ͡ • ͨͱ͑͹ s3.CfnBucket ͳͲ͕ଘࡏ͢Δ • શͯͷConstruct͸࠷ऴతʹCfnͷConstructΛߏ੒͢Δ

Slide 39

Slide 39 text

Stackͱ͸ͳΜͩͬͨͷ͔ • AWS CDK (Cfn) ʹ͓͚ΔσϓϩΠͷ୯Ґ • 1ͭͷStack͸1ͭͷ୯ҐͰϓϩϏδϣχϯά͞ΕΔ • ೚ҙͷ਺ͷStackΛఆٛ͢Δ͜ͱ͕Ͱ͖Δ • StackؒͰConstructʹґଘؔ܎Λ΋ͨͤΔ͜ͱ΋Ͱ͖Δ

Slide 40

Slide 40 text

AWS CDKͷֶͼํ

Slide 41

Slide 41 text

AWS CDKͷֶशϦιʔε • ެࣜυΩϡϝϯτ • https://docs.aws.amazon.com/cdk/latest/guide/ getting_started.html • CDK Workshop • https://cdkworkshop.com/

Slide 42

Slide 42 text

ެࣜυΩϡϝϯτ • ࠷΋৴པͰ͖Δ಺༰͕ࡌ͍ͬͯΔʢ͸ͣʣ • Concepts ʹ͸ͦΕͧΕͷཁૉͷ֓೦͕ࡌ͍ͬͯΔ • Stack΍ConstructͳͲͷ֓೦͸͜͜ΛಡΊ͹ཧղͰ͖Δ • ΄͔ʹ΋৭ʑͳ΋ͷ͕͋Δ

Slide 43

Slide 43 text

CDK Workshop • CDKΛ࣮ࡍʹ࢖ͬͯΈΔνϡʔτϦΞϧ • खݩͰίϚϯυ΍ίʔυΛ࣮ࡍʹଧͬͨΓॻ͍ͨΓͯ͠ࢼ͢ • ͻͱͱ͓ΓͷࣄΛ͞ΒͬͱֶͿ͜ͱ͕Ͱ͖Δ • ࣮ࡍʹCDKΛ৽نʹ࢖ͬͯΈΔ৔໘Ͱ͸ྑ͍ڭࡐͱͳΔ

Slide 44

Slide 44 text

ͦͷଞ

Slide 45

Slide 45 text

AWS Construct library • AWS͕ެࣜʹఏڙ͢ΔجૅతͳConstructू • https://docs.aws.amazon.com/cdk/api/latest/docs/aws-construct-library.html • ΄ͱΜͲͷαʔϏε͕໢ཏ͞Ε͍ͯΔ • جຊతʹ͸͜ΕΛ࢖ͬͯߏ੒͢Δ • ந৅౓͸΋ͷʹΑ༷ͬͯʑͳͷͰΑ͘આ໌ΛಡΉඞཁ͕͋Δ

Slide 46

Slide 46 text

AWS Solutions Constructs • AWS͕ެࣜʹఏڙ͢ΔఆܗύλʔϯͷConstructू • https://aws.amazon.com/jp/solutions/constructs/patterns/ • Α͘࢖͏AWS Resourceͷ૊Έ߹ΘͤΛఏڙ • ͦΕͳΓʹந৅౓͕ߴ͍΋ͷ͕ଟ͍ • S3ͱLambdaͷηοτͳͲ

Slide 47

Slide 47 text

cdk.out • cdk deployͷࡍʹStackͷCfn TemplateΛ͜͜ʹੜ੒͢Δ • cdk synth $Stack Ͱੜ੒͚ͩ͢Δ͜ͱ΋Ͱ͖Δ • ࣮ࡍͷCfn TemplateͱίʔυΛಡΈൺ΂ͯཧղΛਂΊΔ • Construct͕ͳʹΛந৅Խ͍ͯ͠Δͷ͔ཧղ͢Δͷʹ໾ཱͭ

Slide 48

Slide 48 text

AWS CDKͷצॴ

Slide 49

Slide 49 text

KANDOKORO • CloudFormationͷཧղ • Constructͷந৅౓ • Stackͷڥք • ςετ

Slide 50

Slide 50 text

CloudFormation NO RIKAI • ࠷ऴతʹ͸CloudFormationʹߦ͖ண͘ • ͲΜͳτϥϒϧ΋CloudFormationͷTemplateΛಡΊ͹෼͔Δ • CloudFormationΛखܰʹѻ͏ͨΊͷCDKͱ͍͏ؾ࣋ͪͩͱָ • CloudFormationͰग़དྷͳ͍͜ͱ͸ग़དྷͳ͍

Slide 51

Slide 51 text

Constructͷந৅౓ʹ஫ҙ͢Δ • AWS Construct library͸༷ʑͳந৅౓ͷConstructΛఏڙ • ΍Γ͍ͨࣄ΍ίϯτϩʔϧ͍ͨ͠ϨϕϧʹԠͯ͡࢖͍෼͚ • TIMTOWDY • ந৅౓ͷίϯτϩʔϧ͕CDKʹΑΔಡΈ΍͍͢IaCͷΧΪ

Slide 52

Slide 52 text

StackͷڥքΛίϯτϩʔϧ͢Δ • Stackؒͷؔ܎ੑ͸ޙ͔Βม͑ʹ͍͘ → ઃܭ͕ඞཁ • ద੾ʹ෼͚ΔͨΊͷߟ͑ํͷྫ • ϓϩϏδϣχϯάͷΦϖϨʔγϣϯΛͲͷ୯ҐͰߦ͏͔ • ෳ਺ͷStackͷߏ੒ʹڞ௨ͯ͠ґଘ͢ΔϦιʔε͸Կ͔

Slide 53

Slide 53 text

StackͷڥքΛίϯτϩʔϧ͢Δ (Tips) • StackؒͰϦιʔεͷґଘؔ܎Λ࡞Δ͜ͱ͕Ͱ͖Δ • ͨͱ͑͹ɺStackͷϓϩύςΟͷConstructΛೖΕͯڞ༗Ͱ͖Δ • ଞͷStackͷConstructʹߦͬͨมߋ͸ͦΕΛ࣋ͭStackʹ൓ө • ഁյతͳૢ࡞͕Ͱ͖ͳ͍Α͏ʹInterfaceܕͰڞ༗͢Δ΂͠

Slide 54

Slide 54 text

ςετ • Snapshotςετ͚ͩͰ΋े෼ಋೖ͢ΔՁ஋͸͋Δ • յͣ͞ʹϦϑΝΫλϦϯάͰ͖Δ͔֬ೝͰ͖Δ • ΫϦςΟΧϧͳͱ͜Ζ͸ݸผͷςετ΋ॻ͍͓ͯ͘ͱΑΓ҆৺ • cdk.Contextͷmock͕ඞཁʹͳΔ৔߹΋͋ΔͷͰ஫ҙ • طଘϦιʔεͷimportΛߦ͏৔߹͸contextʹґଘ͢Δҝ

Slide 55

Slide 55 text

·ͱΊ

Slide 56

Slide 56 text

·ͱΊ • CDK͸CloudFormationΛखܰʹ࢖͑Δπʔϧ • ಠࣗͷ֓೦͕৭ʑͱొ৔͢ΔͷͰͪΌΜͱཧղͯ͠ѻ͏ͱྑ͍ • ಛʹConstruct͸ͲͷΑ͏ʹந৅Խ͞Ε͍ͯΔ͔ཧղ͕ඞཁ • ઃܭΛؒҧ͏ͱޙ໭Γ͠ʹ͍͘ͷͰಛʹStackઃܭ͸৻ॏʹ

Slide 57

Slide 57 text

͓·͚

Slide 58

Slide 58 text

ϦϑΝΫλϦϯάͷ͓ڙʹ͸ PerlͷϫϯϥΠφʔΛॻ͘ͱ ศརͩͧ

Slide 59

Slide 59 text

OWARI