Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
サーバーレスのテストを取り巻く環境
Search
Yuji Takaesu
July 20, 2017
Technology
940
0
Share
サーバーレスのテストを取り巻く環境
サーバーレスに入門したので、
サーバーレスのテストを取り巻く開発環境についての考察を書いてみました
Yuji Takaesu
July 20, 2017
More Decks by Yuji Takaesu
See All by Yuji Takaesu
データ基盤統合への歩み - ハッカーズチャンプルー2025前夜祭
yusabana
2
37
IT筋トレを続けるための技術
yusabana
0
280
テスト導入支援
yusabana
0
110
社内向けgyazo
yusabana
0
180
社内開発環境/テスト環境
yusabana
0
130
hubotを使ったチャット環境
yusabana
0
80
Other Decks in Technology
See All in Technology
「強制アップデート」か「チームの自律」か?エンタープライズが辿り着いたプラットフォームのハイブリッド運用/cloudnative-kaigi-hybrid-platform-operations
mhrtech
0
180
変化の激しい時代をゴキゲンに生き抜くために 〜ストレスマネジメントのススメ〜
kakehashi
PRO
5
1.3k
そのSLO 99.9%、本当に必要ですか? 〜優先度付きSLOによる責任共有の設計思想〜 / Is that 99.9% SLO really necessary? Design philosophy of shared responsibility through prioritized SLOs
vtryo
0
560
ボトムアップ限界を越える - 20チームを束る "Drive Map" / Beyond Bottom-Up: A 'Drive Map' for 20 Teams
kaonavi
0
180
サンプリングは「作る」のか「使う」のか? 分散トレースのコストと運用を両立する実践的戦略 / Why you need the tail sampling and why you don't want it
ymotongpoo
4
170
How to learn AWS Well-Architected with AWS BuilderCards: Security Edition
coosuke
PRO
0
120
エージェント時代の UIとAPI、CLI戦略
coincheck_recruit
0
170
Tachikawa.any 運営挨拶
daitasu
0
150
全社統制を維持しながら現場負担をどう減らすか〜プラットフォームチームとセキュリティチームで進めたSecurity Hub活用によるAWS統制の見直し〜/secjaws-security-hub-custom-insights
mhrtech
1
370
AI駆動開発で生産性を追いかけたら、行き着いたのは品質とシフトレフトだった
littlehands
0
490
CyberAgent YJC Connect
shimaf4979
1
180
Modernizing Your HCL Connections Experience: Visual Report to chain, Profile Enhancements, and AI Integration
wannesrams
0
300
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
140
Test your architecture with Archunit
thirion
1
2.2k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
500
HDC tutorial
michielstock
2
650
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
300
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
Six Lessons from altMBA
skipperchong
29
4.2k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
790
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
240
Crafting Experiences
bethany
1
140
Scaling GitHub
holman
464
140k
Transcript
© Serverworks Co., Ltd. All right reserved. αʔόʔϨεʹೖͨ͠ͷͰɺ αʔόʔϨεͷςετΛऔΓר͘։ൃڥ 2017/7/14
͞ΘͷʮΘʯ#1 αʔόʔϨεςετೖʢԾʣ ٕज़4՝ ߴߐऱ ༞࣏ʢ͔ͨ͑͢ Ώ͏͡ʣ
© Serverworks Co., Ltd. All right reserved. Who am I
• גࣜձࣾαʔόʔϫʔΫε ٕज़4՝ • େࡕΦϑΟεɺೖࣾ3ϲ݄ͱͪΐͬͱ • ͖ͳݴޠ • Ruby • લ৬ͰRailsͰͷΞϓϦέʔγϣϯ։ൃΛओʹ͍ͬͯ·ͨ͠ • ͖ͳAWSαʔϏε • S3 • Twitter: @yusabana Facebook: yu.takaesu 2
ຊ͢͜ͱ •αʔόʔϨεͰͳ͍ڥͱʁ •αʔόʔϨεͱʁ •αʔόʔϨε։ൃͷςελϏϦςΟ •αʔόʔϨεςετڥͷ՝ •·ͱΊ 3
◆αʔόʔϨεͰͳ͍ڥͱʁ 4
αʔόʔϨεͰͳ͍ڥྫ 5
։ൃͰ༻͢Δπʔϧ • OSSͷϛυϧΣΞ • DB: MySQL, PostgreSQL • Cache: Redis,
Memcached • Mail: Postfix • OSSͷϓϩάϥϛϯάݴޠɺϑϨʔϜϫʔΫ • PHP,Laravel • Ruby, Rails • nodejs • … etc 6
Developmentڥ •ϩʔΧϧͷPCڥʹϛυϧΣΞؚΊͯߏங͢Δ •Vagrant Docker Λར༻ͯ͠Ծڥ্ʹߏங͢Δ • ͜͏͍͏هࣄΛॻ͖·ͨ͠ ։ൃڥ͚ϛυϧΣΞෳόʔδϣϯཧͱͯ͠ͷDocker -
Qiita http://qiita.com/yusabana/items/3267775fdf7249e33e1b 7
Productionڥ •खॱॻΛΈͳ͕ΒखಈͰαʔόʔʹϩάΠϯͯ͠ڥߏங͢Δ •ChefAnsibleͳͲͷϓϩϏδϣχϯάπʔϧΛ༻͍ͯࣗಈߏஙͷ ΈΛ࡞ͬͯڥߏங͢Δ 8
ڥߏஙʹ͍ͭͯ •OSSϕʔεͷπʔϧͰ͋ΕɺDockerͰڥΛ࡞͓͚ͬͯϙʔ λϏϦςΟੑ͋ΓɺґଘੑΛগͳ͘DevProductionڥΛ༻ҙ Ͱ͖Δ •OSSͰͳ͍πʔϧͰϥΠηϯε͑͞क͍ͬͯΕϩʔΧϧͷ ڥߏஙՄೳ 9 ؤுΕී௨ʹڥߏஙͰ͖Δ
՝ •Productionڥͷαʔόӡ༻͕େม •αʔόʔϛυϧΣΞͷՄ༻ੑεέʔϥϒϧͳڥΛߏங ͢Δͷ͘͠ɺઐͷ͕ࣝඞཁͱͳΔ •σΟεΫͷރׇ •ϝϞϦϦʔΫ 10
◆αʔόʔϨεͱʁ 11
AWS Lambdaͷ͜ͱʁʁ 12
αʔόʔϨεఆٛʢ͜͜Ͱͷʣ •αʔόϨε৭ʑͳఆ͕ٛ͞Ε͍ͯΔ •֤ࣾͷαʔϏε͔Βݟ͑ΔServerlessͷຊ࣭ͱԿ͔ http://marcy.hatenablog.com/entry/2016/04/01/152751 13 αʔόʔΛཧͤͣʹϚωʔδυͳαʔϏεΛ ར༻ͯ͠ΞϓϦέʔγϣϯΛ࣮ߦ͢Δ γεςϜͷશମɺ·ͨҰ෦
14 ग़య: https://d0.awsstatic.com/events/jp/2017/summit/slide/D2T1-2.pdf
αʔόϨεͷϝϦοτ •͚͔͓ͬͨͩۚ͠ΛΘͳ͍ʢ࣌ؒ՝ۚͳ͍ʣ •ӡ༻ͷෳࡶ͞Λղফ •εέʔϦϯάϓϥοτϑΥʔϜଆͰ࣮ࡁΈ •Մ༻ੑʢΞϕΠϥϏϦςΟʣϓϥοτϑΥʔϜଆͰ࣮ࡁΈ •αʔϏεͷ͍ํΛ֮͑Ε͙͢ʹར༻Մೳ 15
αʔόʔϨεͷσϝϦοτ •֤ϚωʔδυαʔϏεʹ੍͕͋Δ •੍Λ͑ͨεέʔϥϏϦςΟ͍͠ ➡େͷαʔϏεͦ͜·ͰεέʔϥϏϦςΟʹͳ͍ •ར༻͢ΔϚωʔδυαʔϏε͕૿Ճͯ͠ෳࡶ͕૿͢Մೳੑ͕͋Δ ʢϚΠΫϩαʔϏεΞʔΩςΫνϟʣ •API Gateway, Lambda, S3,
DynamoDB, SQS …etc •ૄ݁߹͕Ώ͑ʹ࿈ܞ͢Δ෦ͳͲ࣮ʗςετ͕͍͠ 16
◆αʔόʔϨε։ൃͷςελϏϦςΟ 17
ςετʹ͍͍ͭͯͨ͜͠ͱશͯॻ͔Ε͍ͯ·͢ʢಈը͋Γʣ 18 εϥΠυ: https://speakerdeck.com/twada/testable-lambda-working-effectively-with-legacy-lambda ಈը: https://www.youtube.com/watch?v=C0zNc4bdWhY
ςετͱ •खಈςετ •ΤΫηϧͳͲʹఆٛͨ͠ɺςετ༷ॻΛϕʔεʹਓ͕ؒߦ͏ ςετ •ࣗಈςετ •ςετίʔυΛͱʹԿ͔͠Βͷػց͕ߦ͏ςετ 19 αʔόϨεʢϚωʔδυαʔϏεʣͰ ࣗಈςετ͕͍ͨ͠!!
ͱ͍͑՝͕ɺɺɺ DynamoDB S3 SQSͳͲͷϚωʔδυαʔϏεΛProductionͰ ར༻͍ͯ͠Δ͕ɺϩʔΧϧ͓ΑͼςετڥͰͲ͏͢Δ?? 20 ϚωʔδυαʔϏεϩʔΧϧϚγϯ্Ͱ ࣮ߦͰ͖ͳ͍
ղܾҊ1 - ϚωʔδυαʔϏεΛར༻ͨ͠߹ͷςετͲ͏͢Δ͔ • ϩʔΧϧ(ςετ)ڥϩʔΧϧͰ࠶ݱՄೳͳͷͰΓସ͑Δ • ྫʣϑΝΠϧͷΞοϓϩʔυͷ߹ɺProductionS3Ξοϓϩʔυ ͞ΕΔ͕ɺϩʔΧϧ(ςετ)ڥϩʔΧϧϚγϯ্ͷσΟϨΫτϦ ʹΞοϓϩʔυ͢Δ •
• ϩʔΧϧͱຊ൪Ͱ࣮͕ҟͳͬͯ͠·͏ͷͰ༧ظͤ͵ෆ۩߹͕ൃੜ͢ Δ͓ͦΕ͕͋Δ 21
ղܾҊ2 - ϚωʔδυαʔϏεΛར༻ͨ͠߹ͷςετͲ͏͢Δ͔ •ϩʔΧϧ։ൃ͚ͱςετڥ͚ͷAWSڥΛ༻ҙ͢Δ •։ൃऀ͝ͱʹAWSڥΛ༻ҙ •ڞ༗ͷ։ൃڥͱͯ͠AWSڥΛ༻ҙ • •AWSڥͷIAMͷΞΧϯτͷཧ͕େมʹͳΔ •AWSͷར༻ྉ͕ۚൃੜ͢Δɺར༻ྉۚͷཧ 22
FakeObjectͱ͍͏Ҋ •ղܾҊ1Λ֦ுͨ͠ײ͡ •ຊͱಉ͡Α͏ͳڍಈΛ͢Δ୯७ͳผ࣮ •ͯ͢ͷػೳΛຬ͍ͨͯ͠ΔΘ͚Ͱͳ͍ •ϩʔΧϧڥ্ͰϚωʔδυαʔϏεͷػೳ͕࠶ݱͰ͖ΔͷͰ ཧ͢Δඞཁ͕ͳָͯ͘ •ϩʔΧϧͰMySQLαʔόΛ্ཱͪ͛Δͷͱಉ͡Α͏ͳײ͡ 23
LocalStack 24
LocalStackͷରԠαʔϏε 25
LocalStackʹ͍ͭͯ • ಛఆͷϙʔτͰ֤छαʔϏεͷFakeͱͳΔαʔϏε͕ىಈ͢Δ • ΤϯυϙΠϯτΛAWS͔ΒLocalStackͰىಈͨ͠FakeαʔϏεͷΤϯυϙΠ ϯτΓସ͑Δ͜ͱͰར༻Մೳ • ʮhttp://localhost:8080ʯʹΞΫηε͢ΔͱσϓϩΠ͍ͯ͠ΔLocalStackͷαʔ ϏεͷμογϡϘʔυ͕ར༻Ͱ͖Δ •
ϚωδϝϯτίϯιʔϧͷΑ͏ͳUIͳ͍ɻcli sdk Λͬͯૢ࡞͢Δ • AWSΞΧϯτ͕ͳͯ͘؆୯ʹϩʔΧϧͰϚωʔδυαʔϏεΛࢼ͢͜ͱ ͕Ͱ͖Δ 26
LocalStackͷΠϯετʔϧ • Πϯετʔϧํ๏READMEʹ • https://github.com/localstack/localstack#installing • DockerΛͬͯىಈ͢Δͱ؆୯ʢDockerΠϯετʔϧࡁΈΛఆʣ • ࣍ͷ2ͭͷίϚϯυΛଧ͚ͭͩ •
ىಈͨ͠Β http://localhost:8080 ͰμογϡϘʔυʹΞΫηε 27 $ git clone https://github.com/localstack/localstack $ docker-compose up MacΛར༻͍ͯ͠Δ߹ҎԼͰىಈ͢Δ $ TMPDIR=/private$TMPDIR docker-compose up
LocalStack্ͷS3Λaws-sdkͰ৮ͬͯΈΔ 28 [όέοτΛ࡞Δ] $ aws --endpoint-url=http://localhost:4572 s3 mb s3://mytest/ make_bucket:
mytest [όέοτͷଘࡏ֬ೝ] $ aws --endpoint-url=http://localhost:4572 s3 ls 2006-02-04 01:45:09 mytest [ϑΝΠϧΛΞοϓϩʔυ] $ aws --endpoint-url=http://localhost:4572 s3 cp test.png s3://mytest upload: ./test.png to s3://mytest/test.png [ϑΝΠϧͷଘࡏ֬ೝ] $ aws --endpoint-url=http://localhost:4572 s3 ls s3://mytest 2017-07-18 21:12:10 0 test.png
29 μογϡϘʔυ http://localhost:8080
ςετίʔυΛॻ͍ͯΈΑ͏ 30
PythonΛͬͨDynamoDBΞΫηε͢Δ(ϓϩμΫγϣϯίʔυ) 31 import boto3 class Dynamodb(): def __init__(self, table_name): self.origindb
= boto3.resource( 'dynamodb', region_name=‘ap-northeast-1', endpoint_url='http://localhost:4569' ) self.table = self.create_table(table_name) def create_table(self, table_name): table = self.origindb.create_table( #….লུ def put_item(self, item): return self.table.put_item(Item=item) # ଓ͘ # ଓ͖ def get_item(self, year, title): res = self.table.get_item( Key={ 'year': year, 'title': title, }, ) if 'Item' in res: return res['Item'] else: return None def drop_table(self): self.table.delete()
PythonΛͬͨDynamoDBΞΫηε͢Δֶशςετ(ςετίʔυ) 32 import unittest import decimal from dynamodb import Dynamodb
class TestDynamodbOps(unittest.TestCase): def setUp(self): self.db = Dynamodb('Movies') self.db.put_item( { 'year': 2017, 'title': 'The Movie', 'info': { 'rating': decimal.Decimal(0) } } ) def tearDown(self): self.db.drop_table() #ଓ͘ #ଓ͖ def test_valid_get_item(self): item = self.db.get_item(2017, 'The Movie') assert item is not None def test_invalid_get_item(self): item = self.db.get_item(2017, 'InvalidTitle’) assert item is None if __name__ == "__main__": unittest.main()
ֶशςετΛॻ͍ͯΈͯ •ίʔυҎԼͷgithubʹ͓͍͍ͯ·͢ɻ • https://github.com/yusabana-sandbox/localstack-sample/tree/master/python ʢPython͕ෆ׳ΕͳͷͰ…ʣ •LocalStackΛཱͯΔ͜ͱͰDynamoDBͱ͍͏AWSͷϚωʔδυ αʔϏεΛPython SDK(boto3)Λ؆୯ʹࢼ͢͜ͱ͕Ͱ͖ɺػೳΛς ετ͢Δͷʹద͍ͯ͠Δ •ςετΛॻ͘͜ͱͰ࣮ࡍʹಈ͔ͯ֬͠ೝͰ͖ΔͷͰ҆৺ײ͕͋Δ
33
◆αʔόʔϨεςετڥͷ՝ 34
αʔόʔϨεςετڥͷ՝ • ·ͩ·ͩൃల్্ • LocalStack201611݄͘Β͍ʹ։ൃ͕࢝·͔ͬͨΓ • όάͬΆ͍ڍಈ݁ߏ͋Δ • ຊޠͳͲͷϚϧνόΠτจࣈؔ࿈Λ͏ͱಈ͔ͳ͔ͬͨΓ… •
ίϯτϦϏϡʔτνϟϯε • ඞཁʹԠͯ͡ςετίʔυ্ͰϞοΫελϒΛ͏ • ελϒɾϑΣΠΫɾϞοΫͱ http://d.hatena.ne.jp/a-hisame/20090212/1234450327 35
◆·ͱΊ 36
·ͱΊ •αʔόʔϨεʢϚωʔδυʣαʔϏεΛར༻͢Δ߹Ͱࣗಈςετ ͕Ͱ͖Δͱ͍͍Ͱ͢Ͷ •FakeObjectʢLocalStackʣΛར༻ͯ͠ςετͰ͖Δͱָ •·ͩൃల్্ͳͱ͜Ζ͕͋ΔͷͰ՝ଟ͍ •t-wadaࢯͷAWSαϛοτ2017ͰͷಈըͱεϥΠυ͍͢͝Θ͔Γ ͘͢ɺͱͯࢀߟʹͳΔ εϥΠυ: https://speakerdeck.com/twada/testable-lambda-working-effectively-with-legacy-lambda ಈը:
https://www.youtube.com/watch?v=C0zNc4bdWhY 37
t-wadaࢯͷݟղ 38 ग़య: https://speakerdeck.com/twada/testable-lambda-working-effectively-with-legacy-lambda
© Serverworks Co., Ltd. All right reserved. ͋Γ͕ͱ͏͍͟͝·ͨ͠ ʢαʔόʔϫʔΫεͷେࡕͰAWSΛͬͯҰॹʹಇ͘ํΛืू͍ͯ͠·͢ʣ