Slide 1

Slide 1 text

4FSWFSMFTT'SBNFXPSLͷ جૅͱ։ൃख๏͔Β $*$%ύΠϓϥΠϯͷߏங·Ͱ

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

ࣗݾ঺հ %JHJUBM$VCF$P-UEͷΤϯδχΞ 4FSWFSMFTT'SBNFXPSL։ൃ
 νʔϜϝϯόʔ ओཁݴޠ /PEFKT 1)1

Slide 4

Slide 4 text

4FSWFSMFTT4UFQ'VODUJPOT IUUQTHJUIVCDPNIPSJLFTFSWFSMFTTTUFQGVODUJPOT

Slide 5

Slide 5 text

4IJGUFS IUUQTHFUTIJGUFSJP

Slide 6

Slide 6 text

2JJUB IUUQRJJUBDPNIPSJLF

Slide 7

Slide 7 text

4FSWFSMFTT'SBNFXPSLͷ֓ཁ

Slide 8

Slide 8 text

4FSWFSMFTT'SBNFXPSLͱ͸ αʔόʔϨεΞʔΩςΫνϟʹ͓͚Δ։ൃ΍σϓϩΠΛ
 αϙʔτͯ͘͠ΕΔίϚϯυϥΠϯπʔϧ ZBNMʹΑΔΞʔΩςΫνϟͷߏ੒؅ཧ ϚϧνΫϥ΢υϓϩόΠμʔαϙʔτ 044ͱͯ͠(JU)VC্Ͱ։ൃ ϓϥάΠϯʹΑΔ֦ு

Slide 9

Slide 9 text

࣮૷͞Ε͍ͯΔओͳίϚϯυ TMTDSFBUF ϓϩδΣΫτͷ࡞੒ TMTEFQMPZ ϩʔΧϧ؀ڥ͔ΒΫϥ΢υ΁ͷσϓϩΠ TMTJOWPLF ϑΝϯΫγϣϯͷ࣮ߦ TMTJOGP σϓϩΠ͞Εͨߏ੒ͷ৘ใΛදࣔ TMTMPHT ϑΝϯΫγϣϯͷ࣮ߦϩάͷ֬ೝ TMTSFNPWF σϓϩΠ͞Εͨߏ੒ͷ࡟আ

Slide 10

Slide 10 text

ϓϩδΣΫτͷϑΝΠϧߏ੒؅ཧ /PEFKT ᵓᴷTFSWFSMFTTZNM ᵋᴷIBOEMFSKT ΞʔΩςΫνϟશମͷߏ੒Λ ఆٛ͢ΔϑΝΠϧ ϑΝϯΫγϣϯͰ࣮ߦ͞ΕΔ ϓϩάϥϜ

Slide 11

Slide 11 text

:".-ϑΝΠϧʹΑΔߏ੒؅ཧ QSPWJEFS OBNFBXT SVOUJNFOPEFKT JBN3PMF4UBUFNFOUT &⒎FDU"MMPX "DUJPO EZOBNPEC GVODUJPOT DSFBUF IBOEMFSUPEPTDSFBUFDSFBUF FWFOUT IUUQ QBUIUPEPT NFUIPEQPTU DPSTUSVF ϑΝϯΫγϣϯʹΞλον͢Δ ݖݶͷઃఆ ࢖༻͢ΔΫϥ΢υϓϩόΠμʔٴͼ ϥϯλΠϜ؀ڥͷࢦఆ ϑΝϯΫγϣϯͷ࣮ߦϑΝΠϧͷ ࢦఆ ϑΝϯΫγϣϯΛ࣮ߦͤ͞Δ Πϕϯτͷࢦఆ

Slide 12

Slide 12 text

ϚϧνΫϥ΢υϓϩόΠμʔαϙʔτ ($1 ։ൃதɻۙ೔ϦϦʔε༧ఆ QSPWJEFS OBNFBXT QSPWJEFS OBNFPQFOXIJTL QSPWJEFS OBNFB[VSF

Slide 13

Slide 13 text

044ͱͯ͠(JU)VC্Ͱ։ൃ

Slide 14

Slide 14 text

ϓϥάΠϯʹΑΔػೳ֦ு QMVHJOT TFSWFSMFTTTUFQGVODUJPOT TFSWFSMFTTP⒐JOF IUUQTHJUIVCDPNTFSWFSMFTTQMVHJOT

Slide 15

Slide 15 text

Πϯετʔϧ͔Βॳظઃఆ·Ͱ

Slide 16

Slide 16 text

Πϯετʔϧ OQNJOTUBMMHTFSWFSMFTT

Slide 17

Slide 17 text

$SFEFOUJBMͷઃఆ TMTDPOpHDSFEFOUJBMTQSPWJEFS BXTLFZZPVSLFZŠTFDSFUZPVSTFDSFU

Slide 18

Slide 18 text

$SFEFOUJBMͷઃఆ "84ͷ৔߹ɺ"ENJOJTUSBUPS"DDFTTͷϙϦγʔΛ BUUBDI͢Δ͜ͱ͕ެࣜυΩϡϝϯτʹهࡌ͞Ε͍ͯΔ IUUQTTFSWFSMFTTDPNGSBNFXPSLEPDTQSPWJEFSTBXTHVJEFDSFEFOUJBMT

Slide 19

Slide 19 text

$SFEFOUJBMͷઃఆ &⒎FDU"MMPX "DUJPO< JBN(FU3PMF JBN$SFBUF3PMF JBN%FMFUF3PMF JBN1VU3PMF1PMJDZ JBN%FMFUF3PMF1PMJDZ JBN1BTT3PMF MPHT T MBNCEB DMPVEGPSNBUJPO BQJHBUFXBZ > 3FTPVSDF< > ΦϑΟγϟϧʹ͸ެ։͞Εͯͳ͍͕ɺ ࠷௿ݶ͜ͷ͋ͨΓͷϦιʔεʹ ڐՄ͕͋Ε͹ಈ࡞͢Δ

Slide 20

Slide 20 text

$SFEFOUJBMͷઃఆ IUUQTHJUIVCDPNTFSWFSMFTTTFSWFSMFTTJTTVFT "ENJO$SFEFOUJBMΛ࢖Θͳ͍ηοτΞοϓํ๏͸ݱࡏٞ࿦த

Slide 21

Slide 21 text

։ൃϑϩʔ

Slide 22

Slide 22 text

αʔϏεͷ ࡞੒ TFSWFSMFTTZNM ΁ͷΞʔΩςΫνϟ ఆٛ σϓϩΠ Ϋϥ΢υ্ Ͱͷςετ ։ൃͷϫʔΫϑϩʔ ϩʔΧϧͰͷ GVODUJPO։ൃ

Slide 23

Slide 23 text

αʔϏεͷ࡞੒ TMTDSFBUFUFNQMBUFBXTOPEFKT ֤ϓϩόΠμʔͷϥϯλΠϜ؀ڥʹ߹Θͤͨ ελʔλʔςϯϓϨʔτΛࣗಈͰ࡞੒ͯ͘͠ΕΔ

Slide 24

Slide 24 text

ରԠ͍ͯ͠ΔϥϯλΠϜ؀ڥ "84 BXTOPEFKT BXTQZUIPO BXTKBWBHSBEMF BXTKBWBNBWFO BXTTDBMBTCU BXTDTIBSQ "[VSF OPEFKT 0QFO8IJTL PQFOXIJTLOPEFKT

Slide 25

Slide 25 text

TFSWFSMFTTZNM΁ͷΞʔΩςΫνϟఆٛ αʔϏεͷϓϩόΠμʔ΍ϥϯλΠϜ؀ڥͷఆٛ ϑΝϯΫγϣϯͱͦΕΛൃՐ͢ΔͨΊͷΠϕϯτΛఆٛ ࢖༻͢ΔΫϥ΢υϦιʔεͷఆٛ TFSWFSMFTTZNM͕αʔϏεશମͷઃܭਤͱͳΔ

Slide 26

Slide 26 text

TFSWFSMFTTZNM΁ͷΠϕϯτఆٛ GVODUJPOT VTFS$SFBUF IBOEMFSMJCVTFS$SFBUFIBOEMFS FWFOUT IUUQ QBUIVTFST NFUIPEQPTU IUUQΠϕϯτͷఆٛ

Slide 27

Slide 27 text

TFSWFSMFTTZNM΁ͷΠϕϯτఆٛ GVODUJPOT SFTJ[F IBOEMFSSFTJ[FIBOEMFS FWFOUT T CVDLFUQIPUPT FWFOUT0CKFDU$SFBUFE SVMFT QSFpYVQMPBET TV⒏YKQH 4Πϕϯτͷఆٛ

Slide 28

Slide 28 text

TFSWFSMFTTZNM΁ͷΠϕϯτఆٛ GVODUJPOT NZ4LJMM IBOEMFSNZ4LJMMIBOEMFS FWFOUT BMFYB4LJMM "MFYB4LJMMΠϕϯτͷఆٛ

Slide 29

Slide 29 text

ରԠ͍ͯ͠ΔΠϕϯτ "84 "1*(BUFXBZ ,JOFTJT%ZOBNP%# 4 4DIFEVMF 4/4 "MFYB4LJMM *P5 $MPVE8BUDI&WFOU "[VSF )551 5JNFS 2VFVF4UPSBHF 4FSWJDF#VT &WFOU)VCT #MPC4UPSBHF 0UIFS#JOEJOHT 0QFO8IJTL "1*(BUFXBZ 5SJHHFST 4DIFEVMF

Slide 30

Slide 30 text

ϩʔΧϧͰͷ։ൃ TMTJOWPLFMPDBMŠGVODUJPOϑΝϯΫγϣϯ໊ ϩʔΧϧ؀ڥͰ-BNCEB౳ͷϑΝϯΫγϣϯΛ ٖࣅతʹ࣮ߦͯ͘͠ΕΔίϚϯυ

Slide 31

Slide 31 text

ϩʔΧϧ࣮ߦͷରԠঢ়گ "84 BXTOPEFKT BXTQZUIPO 0QFO8IJTL PQFOXIJTLOPEFKT

Slide 32

Slide 32 text

ϩʔΧϧ։ൃΛαϙʔτ͢ΔϓϥάΠϯ΍πʔϧ 4FSWFSMFTT TJNVMBUJPO QMVHJO "1*(BUFXBZͱ-BNCEBΛ ϩʔΧϧͰγϡϛϨʔτ IUUQTHJUIVCDPN HFSUKWSTFSWFSMFTT QMVHJOTJNVMBUF 4FSWFSMFTT %ZOBNPEC -PDBM %ZOBNP%#ΛϩʔΧϧͰ γϡϛϨʔτ IUUQTHJUIVCDPN YUTFSWFSMFTT EZOBNPECMPDBM 4FSWFSMFTT 0⒐JOF "1*(BUFXBZΛϩʔΧϧͰ γϡϛϨʔτ IUUQTHJUIVCDPN EIFSBVMUTFSWFSMFTT P⒐JOF ,JOFTBMJUF ,JOFTJTΛϩʔΧͰγϡϛ Ϩʔτ IUUQTHJUIVCDPN NIBSULJOFTBMJUF

Slide 33

Slide 33 text

Ϋϥ΢υ؀ڥ΁ͷσϓϩΠ TMTEFQMPZŠTUBHFεςʔδ໊WFSCPTF TFSWFSMFTTZNMͰఆٛͨ͠ΞʔΩςΫνϟ ٴͼϑΝϯΫγϣϯͷιʔεΛσϓϩΠ͢Δ

Slide 34

Slide 34 text

εςʔδͷ࢓૊Έ EFWεςʔδ ϩʔΧϧ QSPEVDUJPO εςʔδ ςετ؀ڥͱຊ൪؀ڥͱ͍ͬͨ࢖͍෼͚͕࣮ݱͰ͖Δ ֤εςʔδ͸ޓ͍ʹӨڹΛٴ΅͠߹Θͳ͍ ඞཁͳ͚ͩεςʔδ͸࡞੒Մೳ

Slide 35

Slide 35 text

σϓϩΠͷॲཧͷྲྀΕ TMTEFQMPZίϚϯυͷൃߦ 4FSWFSMFTT͕ TFSWFSMFTTZNMΛύʔε σϓϩΠύοέʔδ ΛTFSWFSMFTT഑Լʹग़ྗ ֤ϓϩόΠμʔͷํࣜʹैͬͯ σϓϩΠ "84ͳΒ$MPVE'PSNBUJPO

Slide 36

Slide 36 text

σϓϩΠࣦഊ࣌ͷσόοά TMTEFQMPZŠOP%FQMPZ TFSWFSMFTT഑ԼʹσϓϩΠύοέʔδͷΈग़ྗ ͜ΕΛݩʹௐࠪՄೳ

Slide 37

Slide 37 text

σϓϩΠޙͷ࣮ߦ TMTJOWPLFŠGVODUJPOϑΝϯΫγϣϯ໊ŠMPHT Ϋϥ΢υʹσϓϩΠࡁΈͷϑΝϯΫγϣϯͷ࣮ߦ

Slide 38

Slide 38 text

ϩάͷ֬ೝ TMTMPHTŠGVODUJPOϑΝϯΫγϣϯ໊ ϑΝϯΫγϣϯͷ࣮ߦϩάͷ֬ೝ

Slide 39

Slide 39 text

σϓϩΠޙमਖ਼ TMTEFQMPZGVODUJPOŠGVODUJPOϑΝϯΫγϣϯ໊ ϑΝϯΫγϣϯ୯ମͷσϓϩΠ͕Մೳ

Slide 40

Slide 40 text

σϓϩΠޙͷϩʔϧόοΫ TMTEFQMPZMJTU TMTSPMMCBDLUJNFTUBNQUJNFTUBNQ TMTEFQMPZΛલճ࣮ࢪͨ͠ঢ়ଶ·ͰϩʔϧόοΫ ͯ͘͠ΕΔ

Slide 41

Slide 41 text

$*$%ύΠϓϥΠϯࣗಈԽ

Slide 42

Slide 42 text

ͳͥɺ$*$% σϓϩΠͷଐਓԽɺϛεΛແ͘͢ 13ۦಈͷ։ൃʹ͓͚Δ඼࣭ͷ୲อ ςετͷࣗಈԽʹΑΔޮ཰Խ

Slide 43

Slide 43 text

$*$%ύΠϓϥΠϯߏ੒

Slide 44

Slide 44 text

ܧଓతΠϯςάϨʔγϣϯ $*

Slide 45

Slide 45 text

$*ύΠϓϥΠϯߏ੒ -JOUʹΑΔιʔείʔυͷ੩తղੳ Ϣχοτςετ ΠϯςάϨʔγϣϯςετ

Slide 46

Slide 46 text

-JOUʹΑΔιʔείʔυͷ੩తղੳ ίʔυ࣮ߦલʹγϯλοΫεΤϥʔΛݕ஌Ͱ͖Δ ίʔυͷελΠϧ͕౷Ұ͞ΕΔͨΊɺ
 ෳ਺ਓͰͷϝϯςφϯεੑ͕޲্͢Δ

Slide 47

Slide 47 text

Ϣχοτςετ ϓϩάϥϜΛߏ੒͢Δݸʑͷػೳ͕ਖ਼͘͠ಈ͘͜ͱΛݕূ͢Δςετ ςετίʔυΛಡΉͱͦͷιϑτ΢ΣΞ͕Ͳ͏ಈ͘΂͖͔
 ͦͷ࢓༷͕Θ͔Δ ͩΕ͕ϓϧϦΫΤετΛૹͬͯ΋ಉ͡ج४Ͱࣗಈςετ͕ߦ͑Δ ɹ඼࣭͕୲อ͞ΕΔ

Slide 48

Slide 48 text

-BNCEBͰߦ͏Ϣχοτςετ ᵓᴷIBOEMFSKT ᵋᴷMJC ᵓᴷIFMMPDMBTTKT ᵋᴷIFMMPDMBTTUFTUKT -BNCEBͰ࣮ߦ͞ΕΔ ϝΠϯͷϑΝΠϧ ϏδωεϩδοΫ Ϣχοτςετͷίʔυ

Slide 49

Slide 49 text

const Hello = require(‘./lib/hello.class.js'); const hello = new Hello(); module.exports.hello = (event, context, callback) => { const response = { statusCode: 200, body: JSON.stringify({ message: hello.say(), input: event, }), }; callback(null, response); }; -BNCEBͰߦ͏Ϣχοτςετ ςετ͕΍Γ΍͍͢Α͏ʹ-BNCEBΛ ࣮ߦ͢ΔϝΠϯͷϑΝΠϧ͔ΒΫϥε Ͱ੾Γग़ͯ͋͛͠Δ IBOEMFSKT

Slide 50

Slide 50 text

-BNCEBͰߦ͏Ϣχοτςετ class Hello { say() { return 'Your function executed successfully!'; } } module.exports = Hello; IFMMPDMBTTKT

Slide 51

Slide 51 text

-BNCEBͰߦ͏Ϣχοτςετ const expect = require('chai').expect; const Hello = require('./hello.class.js'); describe('Hello', () => { let hello; beforeEach(() => { hello = new Hello(); }); describe('say', () => { it('should return the value', () => expect(hello.say()) .to.be.equal('Your function executed successfully!')); }); }); ΫϥεͰ੾Γग़ͨ͠ϏδωεϩδοΫ ʹରͯ͠ςετίʔυΛఆٛ IFMMPDMBTTUFTUKT

Slide 52

Slide 52 text

Ϣχοτςετʹ͓͚ΔBXTTELͷѻ͍ beforeEach(() => { awsStub = sinon.stub(aws.provider, 'request') .returns(BbPromise.resolve({})); }); ςετ಺ͰΫϥ΢υ؀ڥʹ͸ΞΫηε͠ͳ͍ ελϒԽɻBXTTEL͸ϢχοτςετͷൣғͰ͸ͳ͍ IUUQTHJTUHJUIVCDPNIPSJLFBCECGFDGDBCFG

Slide 53

Slide 53 text

ΠϯςάϨʔγϣϯςετ TFSWFSMFTTZNMͰఆٛͨ͠ߏ੒ٴͼϑΝϯΫγϣϯΛ
 ࣮ࡍͷΫϥ΢υ؀ڥ΁σϓϩΠͯࣗ͠ಈͰ݁߹ςετΛߦ͏

Slide 54

Slide 54 text

"1*(BUFXBZΠϕϯτͷςετͷϑϩʔ "1*(BUFXBZΠϕ ϯτͷσϓϩΠ BXTTELͷ EFTDSJCF4UBDLTʹΑΓ "1*ΤϯυϙΠϯτΛऔಘ "1*ͷฦΓ஋ ΛνΣοΫ "1*ʹ IUUQϦΫΤετ IUUQTHJUIVCDPNIPSJLFTFSWFSMFTTBQJJOUFHSBUJPOUFTUTBNQMFCMPCNBTUFS JOUFHSBUJPOUFTUUFTUKT--

Slide 55

Slide 55 text

4Πϕϯτͷςετͷϑϩʔ 4Πϕϯτͷ σϓϩΠ σϓϩΠࡁΈͷόέοτ ΁ͷΦϒδΣΫτૢ࡞ $MPVE8BUDI-PHT ͰΠϕϯτ͕ൃՐ͔ͨ͠ νΣοΫ IUUQTHJUIVCDPNIPSJLFTFSWFSMFTTBQJJOUFHSBUJPOUFTUTBNQMFCMPCNBTUFS JOUFHSBUJPOUFTUUFTUKT--

Slide 56

Slide 56 text

ܧଓతσϦόϦʔ $%

Slide 57

Slide 57 text

$%ύΠϓϥΠϯߏ੒ EFWFMPQNFOUϒϥϯνQVTI࣌ͷςετͷ࣮ߦ
 ੒ޭ࣌ʹςετεςʔδʹσϓϩΠ NBTUFSϒϥϯνΛ࠷৽ιʔεͷू໿৔ॴͱͯ͠ɺ
 QVTI࣌ʹςετͷΈ࣮ߦ UBHΛ੾ͬͯQVTI͢ΔͱϦϦʔε ςετ࣮ߦͯ͠੒ޭ͢Ε͹ຊ൪εςʔδʹσϓϩΠ

Slide 58

Slide 58 text

$%ύΠϓϥΠϯߏ੒ (JU %FQMPZNFOU CSBODINBTUFS CSBODIEFWFMPQNFOU UBHYYY EFWFMPQNFOUTUBHF QSPETUBHF

Slide 59

Slide 59 text

$%ύΠϓϥΠϯߏ੒ CSBODINBTUFS CSBODIEFWFMPQNFOU UBHYYY -JOU -JOU -JOU Ϣχοτ ςετ Ϣχοτ ςετ Ϣχοτ ςετ ΠϯςάϨʔ γϣϯςετ ΠϯςάϨʔ γϣϯςετ

Slide 60

Slide 60 text

language: node_js node_js: - '4.3' env: global: - AWS_REGION=us-east-1 - SLS_DEBUG=true - secure: lSxO7tZ0….BEVm - secure: LIh0lkl….7fM= before_install: - chmod +x ./bin/deploy.sh - npm i -g serverless install: - travis_retry npm install script: - npm run lint - npm run test - if [[ $TRAVIS_BRANCH == "master" ]] || [[ $TRAVIS_TAG ]]; then npm run integration-test; fi after_success: - ./bin/deploy.sh USBWJTZNMͷઃఆ "84ͷDSFEFOUJBMΛ҉߸Խͯ͠ઃఆ 5SBWJT͔Β"84؀ڥ΁઀ଓΛՄೳͱ͍ͯ͠Δ NBTUFSϒϥϯνͱUBH΁ͷQVTI࣌ͷΈ
 ΠϯςάϨʔγϣϯςετ͕૸Δ ੒ޭ͢Ε͹σϓϩΠεΫϦϓτ͕૸Δ

Slide 61

Slide 61 text

EFQMPZTI QVTIઌʹԠͯ͡TUBHFΛઃఆ σϓϩΠޠ͸ෆཁͳOQNύοέʔδͷ૟আ σϓϩΠ #!/bin/bash set -e if [[ $TRAVIS_TAG ]]; then STAGE="production" elif [[ $TRAVIS_BRANCH == 'dev' ]]; then STAGE="development" fi echo "Deploying from branch $BRANCH to stage $STAGE" npm prune --production #remove devDependencies sls deploy --stage $STAGE --region $AWS_REGION

Slide 62

Slide 62 text

͓ΘΓ