API Gateway / Lambda / Kinesis を使ったストリーミングなバッチ実行基盤の実装

API Gateway / Lambda / Kinesis を使ったストリーミングなバッチ実行基盤の実装

AWSモバイル/IoTサービス徹底攻略!!
http://classmethod.connpass.com/event/22060/
2015年11月21日(土)

06febd004d7cc9c9f6a4e0272b686bc7?s=128

Takeshi Shinoda

November 21, 2015
Tweet

Transcript

  1. 2.

    ࣗݾ঺հ w ࣰా݈ ͠ͷ͚ͩͨ͠  w !UBLFTIJOPEB w 3VCZJTU w

    "TBLVTBSC w גࣜձࣾϦϒηϯε w EPPS௞ିϓϩμΫτάϧʔϓάϧʔϓϦʔμ
  2. 7.

    ෺݅਺֦େͱڞʹ๚ΕΔਏΈ ֤෺݅৘ใ ఏڙݩ ը૾഑৴ αʔό ֤छ%# ॲཧ" ॲཧ# ॲཧ$ ֤ࣾҧ͏ϑΥʔϚοτ

    ऴΘΒͳ͍લஈδϣϒ αʔόͷ͓कΓ ϩʔυ࣌ؒͷ֦େ લஈδϣϒʹґଘͨ͠ ॲཧ಺༰
  3. 8.

    ༷ʑͳ՝୊ͷൃੜ w ֤ࣾϑΥʔϚοτΛѻ͏͜ͱʹΑΔʰҧ͍ͷٵऩ૚ʱͷෳࡶԽ w Φʔόʔϔουߴͯ͘΋ྑ͍ͷͰ෼ࢄॲཧ͍ͤͨ͞ w δϣϒ͕ஈ֊Λ͍࣋ͬͯΔͷͰεέʔϧͤ͞ʹ͍͘ w ଟॏ࣮ߦ࣌ͷ଴ͪ߹Θͤͱͦͷ࢓૊ΈͷՄൖੑ w

    ͚ͨ͜ͱ͖ͷϦϥϯͷෳࡶԽ w લஈδϣϒʹґଘͨ͠ॲཧػߏͷͨΊɺαʔϏεվળ͕େม w ΤϯςΟςΟͰ਺ඦສ෺݅ͷ֤छσʔλετΞϛυϧ΢ΣΞͷ σʔλͷೖΕସ͑ w αʔόϝϯςφϯεͷෳࡶԽ w όονʹΑΔαʔϏε಺༰ͷྼԽ
  4. 15.

    ઃܭҊओʹ&MBTUJD#FBOTUBMLͷ8PSLFSΛ࢖͏ 4ʹதؒॲཧ݁ՌΛ֨ೲ͠ɺ෼ࢄͷ୯Ґ͸4ʹ֨ೲ͞Εͨ ΦϒδΣΫτͷ਺Ͱ੍ޚ͢Δ ޙड़ ɻ ॲཧྔͷͿΕ͸424ͰٵऩͰ͖Δɻ ֤෺݅৘ใ ఏڙݩ ࿈ܞαʔό ݩσʔλ

    ม׵δϣϒ# ม׵݁Ռ &MBTUJD#FBOTUBML 8PSLFS δϣϒ$ ม׵݁Ռ ɾɾɾ 3%4 ը૾഑৴4 $MPVE4FBSDI ม׵δϣϒ" 165 165 δϣϒ% ม׵݁Ռ ॻ͖ࠐΈ δϣϒ
  5. 16.

    ઃܭҊQSPTDPOT QSPT w &#Λ࢖͏ͷͰར༻ݴޠͳͲ͕ൺֱతࣗ༝ w &#Λ࢖͏ͷͰϓϩϏδϣχϯά͸࠷௿ݶͰ͢Ή w 4ʹॲཧ݁Ռ͕֨ೲ͞Ε͍ͯΔͷͰͦͷؾʹͳΕ͹Ϧϥϯͷ࢓૊Έ Λ࡞Γ΍͍͢ DPOT

    w ॲཧ෼ࢄͷ୯Ґ͕4ͷΦϒδΣΫτ୯Ґʹͳͬͯ͠·͍ɺ4ΦϒδΣ Ϋτͦͷ΋ͷʹ੍ޚͷҙຯΛՃ͑ͯ͠·͏͜ͱͰɺγεςϜશମͷ ཧղ΍੍ޚʹෳࡶੑΛ΋ͨΒͦ͠͏ w &#σϑΥϧτͰͳΜͱͳΔࣄ͸গͳ͘ɺ݁ہFCFYUFOTJPOTͷԼ͕ ໘౗ͳ͜ͱʹͳΔ͜ͱ͕༧૝͞ΕΔ w &$͕୔ࢁཱ͓͕͔͔ͬͯۚΔ
  6. 19.

    ઃܭҊQSPTDPOT QSPT w αʔόͷϓϩϏδϣχϯά͸ෆཁ w 424͕ແͯ͘΋ॲཧྔ͸͋Δఔ౓༨༟ݟͯϦϛοτղআ͓͚ͯ͠͹ ͍͍ w ҰͭͷॲཧΛ؆ܿʹ؅ཧग़དྷΔ w

    ॲཧͷଟॏ౓͸࣍ஈͷ-BNCEBͷݺͼํͰ੍ޚͰ͖Δ ·ͱΊͯΤ ϯςΟςΟ͚ͩ౉͔͢ΤϯςΟςΟʹ͢Δ͔ DPOT w ॲཧ͕ଟ͘ͷ-BNEBΛଟஈͰར༻͢ΔͷͰςετ͕େม w ϩΪϯάͷ࢓૊ΈΛ੔͓͔͑ͯͳ͍ͱΤϥʔ࣌ͷ௥੻͕େม w -BNCEBຖʹϦϙδτϦΛ෼͚ͳ͍ͱ$*$%͕େม w ॻ͖ࠐΈετϨʔδ͕૿͑ΔͳͲͰɺ࣍ஈͷ-BNEB͕૿͑Δͱݩ -BNCEBʹखΛՃ͑ͳ͍ͱ͍͚ͳ͍
  7. 22.

    ֤෺݅৘ใ ఏڙݩ ࿈ܞαʔό ݩσʔλ -BNCEB ॲཧ$ 3%4 ը૾഑৴4 $MPVE4FBSDI ม׵ॲཧ"

    165 ॲཧ% ม׵ॲཧ# ॻ͖ࠐΈ ॲཧ "1*(BUFXBZ ೖྗ૚ ΞϓϦέʔγϣϯͷϨΠϠʔΛҙࣝͤ͞Δ αʔϏε૚ ετΞ૚ ,JOFTJT
  8. 23.

    ઃܭҊQSPTDPOT QSPT w ઃܭҊͷར఺ΛڗडͰ͖Δ w ϨΠϠʔΛҙࣝͤ͞Δ͜ͱ͕Ͱ͖ɺΞϓϦέʔγϣϯͷෳࡶԽΛ཈੍Ͱ ͖Δ w ॻ͖ࠐΈ෦෼͸ετϨʔδͷੑೳʹ߹ΘͤͯLJOFTJTͰྲྀྔΛௐ੔Ͱ͖Δ w

    "1*(8Λ௥Ճ͢Δ͜ͱͰɺόονͰ͸ແ͍࿈ܞػೳΛ௥Ճ͢Δඪ४Խ ͞ΕͨΠϯλʔϑΣʔεΛఆٛͰ͖Δ DPOT w ॲཧ͕ଟ͘ͷ-BNEBΛଟஈͰར༻͢ΔͷͰςετ͕େม w ϩΪϯάͷ࢓૊ΈΛ੔͓͔͑ͯͳ͍ͱΤϥʔ࣌ͷ௥੻͕େม w -BNCEBຖʹϦϙδτϦΛ෼͚ͳ͍ͱ$*$%͕େม
  9. 25.

    શମతͳQSPTDPOT QSPT w όονશମͷॲཧ࣌ؒ͸Φʔόϔου෼૿Ճ͢Δ͕ɺ࿈ܞ࣌ࠁΛ߹ ΘͤΔඞཁ͕ͳ͘ͳΓɺஞ࣍ॲཧग़དྷΔΑ͏ʹͳΔͨΊʹɺݟͨ໨ ͷ࿈ܞ଎౓্͕͕Δɻ w ݸผͷ࿈ܞॲཧɾڞ௨ͷॲཧɾετΞॲཧɺͦΕͧΕʹ͍ͭͯ؆୯ ʹεέʔϧΛద੾ʹͰ͖Δɻ w

    ϦΞϧλΠϜॲཧ΁ͷҠߦ͕؆୯ɻ DPOT w ॲཧ͕ଟ͘ͷ-BNEBΛଟஈͰར༻͢ΔͷͰςετ͕େม w ϩΪϯάͷ࢓૊ΈΛ੔͓͔͑ͯͳ͍ͱΤϥʔ࣌ͷ௥੻͕େม w -BNCEBຖʹϦϙδτϦΛ෼͚ͳ͍ͱ$*$%͕େม
  10. 29.

    σʔλͷ෼ׂͱॲཧͷଟॏԽ ֤෺݅৘ใ ఏڙݩ ࿈ܞαʔό -BNCEB ෼ׂ ݸผॲཧ શೖྗσʔλ $47 ඇಉظݺͼग़͠

    w શೖྗσʔλΛద౰ͳαΠζʹTQMJU ͯ͠ɺඇಉظͰ࣍ஈͷ-BNCEBΛݺ ͼग़͢ɻ w ଟॏ౓ͳͲ͸TQMJUαΠζͰௐ੔͢ Δɻ
  11. 32.

    ֤෺݅৘ใ ఏڙݩ ࿈ܞαʔό -BNCEB ॲཧ 3%4 ෼ׂ "1*(BUFXBZ ೖྗ૚ αʔϏε૚

    ετΞ૚ ,JOFTJT ݸผॲཧ ॲཧ શೖྗσʔλ ద౰ͳσʔλ਺ ʹ෼͚ͯඇಉظݺͼग़͠ όοναΠζͰ όϧΫϩʔυ ࣍ஈͷݺͼग़ཻ͠౓Ͱ-BNCEBͷଟॏ౓Λ੍ޚ͢Δ
  12. 33.

    -BNCEB͕ෆ޲͖ͳॲཧ෦෼ w શೖྗσʔλΛద౰ͳαΠζʹ੾ͬͯ ݸผॲཧʹ౉͢෦෼͸ɺσʔλΛͳΊ ΔͷͰ୯ൃͷॲཧΛ૝ఆͨ͠-BNCEB ʹ͸޲͍ͯͳ͍ɻ ࣍ͷΑ͏ͳղܾࡦʁ ઌͷ3F*OWFOUͰλΠϜΞ΢τ ෼ ͕৳

    ͼͨͷͰɺؒʹ߹͏ɻ ෼ׂ਺ͳͲͰௐ੔͢Δɻ ͚ͩ͜͜&$ͳͲʹ͢Δɻ ֤෺݅৘ใ ఏڙݩ ࿈ܞαʔό -BNCEB ෼ׂ ݸผॲཧ શೖྗσʔλ $47 ඇಉظݺͼग़͠
  13. 37.

    εςʔτϨεͳߏ੒Λҡ֦࣋ͯ͠ுੑΛ࢒͢  -BNCEB ॲཧ 3%4 "1*(BUFXBZ ,JOTTJT ೖྗ૚ αʔϏε૚ ετΞ૚

    w෭࡞༻͸ετΞ૚Ҏ ֎Ͱ͸ى͜͞ͳ͍ wॱং΍࠶࣮ߦͰΤϯ ςΟςΟͷJE͕มΘ Βͳ͍Α͏ʹ͢Δ wຊ݅Ͱ͸ɺஈ໨ͰΤϯςΟςΟΛ ֬ఆͰ͖ΔͨΊʹɺஈ໨ͷ -BNCEBͰೖྗσʔλͷҰ෦Λ࢖͍ɺ 66*% 4)"ϋογϡ Λ࢖ͬͯ*% Λੜ੒ͨ͠ɻ ஈ໨
  14. 38.

    -BNCEB ॲཧ 3%4 "1*(BUFXBZ ,JOTTJT ೖྗ૚ αʔϏε૚ ετΞ૚ wεςʔτϨεʹ͢ΔͨΊʹɺ࣋ͪճ͢σʔλ͸ΤϯςΟ ςΟ୯ҐͰ࣋ͪճ͢ɻ

    wςʔϒϧ୯ҐͳͲͰཻ౓Λࡉ͔࣋ͪ͘ճ͢ͱɺͲ͔͜ ͷετΞ૚Λࢀর͠ͳ͚Ε͹ͳΒͣɺॻ͖ࠐ·Εͨࣄ ͷ֬ೝ΍ঢ়گͷ௥੻͕ඞཁʹͳΓɺશମͷෳࡶੑ͕ߴ ·Δɻ εςʔτϨεͳߏ੒Λҡ֦࣋ͯ͠ுੑΛ࢒͢ 
  15. 39.

    -BNCEB ॲཧ" 3%4 "1*(BUFXBZ ,JOFTJT ೖྗ૚ αʔϏε૚ ετΞ૚ εςʔτϨεͳߏ੒Λҡ֦࣋ͯ͠ுੑΛ࢒͢ 

    ॲཧ# ॲཧ$ wؒʹLJOFTJTΛೖΕΔ͜ͱͰɺॲཧͷ֦ுΛ-BNCEBͷ ௥Ճ͚ͩͰՄೳʹ͢Δɻ wଞͷ-BNCEBͷঢ়ଶΛؾʹͤͣॲཧΛ௥Ճɻ wͨͩ͠࠷ऴతͳετΞઌʹ͍ͭͯ͸ߟྀ͕ཁΔɻ ,JOFTJT
  16. 41.

    σʔλετΞ΁ͷྲྀ͠ࠐΈΛू໿ 3%4 ը૾഑৴4 $MPVE4FBSDI ,JOFTJT w ֤छετΞ૚ʹӬଓԽ͢Δͱ͜ΖͰ͸ɺ ΤϯςΟςΟ͝ͱʹ,JOFTJTܦ༝Ͱ -BNCEBΛ࢖͍ॻ͖ࠐΉɻ w

    όοναΠζΛఆٛͰ͖ΔͷͰɺॻ͖ࠐ Έॲཧ଎౓ʹ߹Θͤͯॻ͖ࠐΉɻ w ӬଓԽϛυϧ΢ΣΞ͕૿͑ͨͱͯ͠΋ɺ ,JOFTJTʹ-BNCEBΛ͚ͭΔ͚ͩͰ௥Ճग़ དྷΔɻ
  17. 43.
  18. 47.

    { lambda_params: { default: { handler: 'index.handler', description: 'sample', timeout:

    60, // seconds memorySize: 128, // MB role: 'arn:aws:iam::.....' // arn }, staging: { region: 'ap-northeast-1', functionName: 'lambda-test-staging', }, production: { region: 'ap-northeast-1', functionName: 'lambda-test-production', }, }, app: { default: { lambdaName: ‘Hogehoge', # Circle CI の環境変数 databaseUrl: (() => process.env.DATABASE_URL)() }, staging: { secret: 'aaa' }, production: { secret: 'bbb' } } } ͜͏͍͏ͷ༻ҙͯ͠
  19. 48.

    gulp.task('configure', () => { # AP_ENV => Circle CI の環境変数

    let env = process.env.AP_ENV || 'test' let src = configure.build(env) return file('config.js', `module.exports = ${JSON.stringify(src)}\n`, { src: true }) .pipe(gulp.dest('dist')) }) ͜͏͍͏λεΫΛ࡞ͬͯʜ
  20. 49.

    { "lambda_params": { "handler": "index.handler", "description": "sample", "timeout": 60, "memorySize":

    128, "role": "arn:aws:iam::.....", "region": "ap-northeast-1", "functionName": "lambda-test-staging" }, "app": { "databaseUrl": “postgresql://...../” "lambdaName": "Hogehoge", "secret": "aaa" } } σϓϩΠ࣌ʹಉࠝ͢Δ