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
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
サーバーレスのテストを取り巻く環境
サーバーレスに入門したので、
サーバーレスのテストを取り巻く開発環境についての考察を書いてみました
Yuji Takaesu
July 20, 2017
More Decks by Yuji Takaesu
See All by Yuji Takaesu
データ基盤統合への歩み - ハッカーズチャンプルー2025前夜祭
yusabana
2
38
IT筋トレを続けるための技術
yusabana
0
280
テスト導入支援
yusabana
0
110
社内向けgyazo
yusabana
0
190
社内開発環境/テスト環境
yusabana
0
130
hubotを使ったチャット環境
yusabana
0
81
Other Decks in Technology
See All in Technology
人材育成分科会.pdf
_awache
4
300
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
2
680
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
5
1.5k
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
3k
FPGAの開発コンペでZephyrを使ってみた
iotengineer22
0
140
AIチャット検索改善の3週間
kworkdev
PRO
2
140
AIはどのように 組織のアジリティを変えるのか?
junki
4
1k
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
1.3k
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
320
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
140
2026TECHFRESH畢業分享會 - Lightning Talk - E起 See See : 電商推薦讀心術? 數據說了算
line_developers_tw
PRO
0
1.3k
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.3k
Featured
See All Featured
HDC tutorial
michielstock
2
720
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
210
We Are The Robots
honzajavorek
0
250
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
390
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
460
Code Review Best Practice
trishagee
74
20k
Site-Speed That Sticks
csswizardry
13
1.2k
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ΛͬͯҰॹʹಇ͘ํΛืू͍ͯ͠·͢ʣ