Slide 1

Slide 1 text

4FSWFSMFTT'SBNFXPSLͷ جૅͱ։ൃख๏

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

ࣗݾ঺հ %JHJUBM$VCF$P-UEͷΤϯδχΞ 4FSWFSMFTT'SBNFXPSL$PSF$POUSJCVUPS ओཁݴޠ /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

αʔόϨεΞʔΩςΫνϟͱ͸

Slide 8

Slide 8 text

αʔόϨεΞʔΩςΫνϟͱ͸ 'BB4 -BNCEB (PPHMF$MPVE'VODUJPOT "[VSF'VODUJPOTFUD ͱ
 ϚωʔδυαʔϏεΛ࢖ͬͯߏ੒͞ΕͨγεςϜ Ϣʔεέʔεɿ
 XFC ϞόΠϧ *P5ͳͲͷ"1*ͷόοΫΤϯυ
 σʔλϓϩηογϯά Πϕϯτۦಈܕ ϓϩηε͕ৗற͠ͳ͍ αʔό͕ແ͍ͱ͍͏͜ͱͰ͸ͳ͍ɻ
 αʔόͷ؅ཧΛΫϥ΢υϕϯμʔʹΞ΢τιʔε

Slide 9

Slide 9 text

ͳʹ͕͏Ε͍͠ͷ͔ʁ

Slide 10

Slide 10 text

ΠϕϯτυϦϒϯͰ͋Δ͜ͱ

Slide 11

Slide 11 text

ίετ

Slide 12

Slide 12 text

ϓϩηε͸ଘࡏ͠ͳ͍

Slide 13

Slide 13 text

εςʔτϨε

Slide 14

Slide 14 text

εέʔϥϏϦςΟ

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Ͳ͏΍Δͷ͔ʁ

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

4FSWFSMFTT'SBNFXPSLͷ֓ཁ

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

ϚϧνΫϥ΢υϓϩόΠμʔαϙʔτ QSPWJEFS OBNFBXT QSPWJEFS OBNFPQFOXIJTL QSPWJEFS OBNFB[VSF QSPWJEFS OBNFHPPHMF

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Πϯετʔϧ OQNJOTUBMMHTFSWFSMFTT

Slide 28

Slide 28 text

$SFEFOUJBMͷઃఆ TMTDPOpHDSFEFOUJBMTQSPWJEFS BXTLFZZPVSLFZŠTFDSFUZPVSTFDSFU

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

։ൃϑϩʔ

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 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 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 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 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 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 61

Slide 61 text

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

Slide 62

Slide 62 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 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

ܧଓతσϦόϦʔ $%

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 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 72

Slide 72 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 73

Slide 73 text

͓ΘΓ