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
0
860
サーバーレスのテストを取り巻く環境
サーバーレスに入門したので、
サーバーレスのテストを取り巻く開発環境についての考察を書いてみました
Yuji Takaesu
July 20, 2017
Tweet
Share
More Decks by Yuji Takaesu
See All by Yuji Takaesu
IT筋トレを続けるための技術
yusabana
0
260
テスト導入支援
yusabana
0
97
社内向けgyazo
yusabana
0
150
社内開発環境/テスト環境
yusabana
0
110
hubotを使ったチャット環境
yusabana
0
61
Other Decks in Technology
See All in Technology
ソフトウェアエンジニアと仕事するときに知っておいたほうが良いこと / Key points for working with software engineers
pinkumohikan
1
130
プロダクトエンジニア 360°フィードバックを実施した話
hacomono
PRO
0
130
The Future of SEO: The Impact of AI on Search
badams
0
250
抽象化をするということ - 具体と抽象の往復を身につける / Abstraction and concretization
soudai
27
14k
利用終了したドメイン名の最強終活〜観測環境を育てて、分析・供養している件〜 / The Ultimate End-of-Life Preparation for Discontinued Domain Names
nttcom
2
350
Two Blades, One Journey: Engineering While Managing
ohbarye
2
490
Iceberg Meetup Japan #1 : Iceberg and Databricks
databricksjapan
0
230
ESXi で仮想化した ARM 環境で LLM を動作させてみるぞ
unnowataru
0
140
php-conference-nagoya-2025
fuwasegu
0
120
【内製開発Summit 2025】イオンスマートテクノロジーの内製化組織の作り方/In-house-development-summit-AST
aeonpeople
1
250
Potential EM 制度を始めた理由、そして2年後にやめた理由 - EMConf JP 2025
hoyo
2
1.3k
エンジニアリング価値を黒字化する バリューベース戦略を用いた 技術戦略策定の道のり
kzkmaeda
4
950
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
47
7.3k
How GitHub (no longer) Works
holman
314
140k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Building a Scalable Design System with Sketch
lauravandoore
461
33k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.3k
Visualization
eitanlees
146
15k
Practical Orchestrator
shlominoach
186
10k
Building Your Own Lightsaber
phodgson
104
6.2k
How to Think Like a Performance Engineer
csswizardry
22
1.4k
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ΛͬͯҰॹʹಇ͘ํΛืू͍ͯ͠·͢ʣ