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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yuji Takaesu
July 20, 2017
Technology
950
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
40
IT筋トレを続けるための技術
yusabana
0
280
テスト導入支援
yusabana
0
110
社内向けgyazo
yusabana
0
190
社内開発環境/テスト環境
yusabana
0
130
hubotを使ったチャット環境
yusabana
0
82
Other Decks in Technology
See All in Technology
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
480
AI Coding Agent時代のcdk-nagガードレール 〜組織ルールを強制CIで守り抜く設計の挑戦〜
mhrtech
3
420
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
3.5k
実践!既存 Project への AI-Driven Development 適用〜 一ヶ月で Project 唯一のフロントエンドエンジニアを作り出せ〜
lycorptech_jp
PRO
0
230
Kaggleで成長するために意識したこと
prgckwb
2
410
AI Driven AI Governance
pict3
0
490
SoccerMaster: A Vision Foundation Model for Soccer Understanding
kzykmyzw
0
140
脱金融のフューチャー・デザイン / Future Design Beyond Finance
ks91
PRO
0
160
「早く出す」より「事業に効く」 ── 顧客の業務サイクルから逆算するAI時代の二重ループ開発と「変化の設計者」 / devsumi2026
rakus_dev
1
380
CSに"SLO"は要らない、経営層に"99.9%"は伝わらない - SREを全社に"翻訳"する3原則
cscengineer
PRO
1
5k
誤解だらけの開発生産性 / Myths and Misconceptions about Developer Productivity
i35_267
2
800
Alphaモジュール使っていいのかい!?いけないのかい!?どっちなんだいっ!?
watany
1
280
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
370
Un-Boring Meetings
codingconduct
0
350
Into the Great Unknown - MozCon
thekraken
41
2.6k
The SEO Collaboration Effect
kristinabergwall1
1
510
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.6k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Being A Developer After 40
akosma
91
590k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
170
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Become a Pro
speakerdeck
PRO
31
6k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.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ΛͬͯҰॹʹಇ͘ํΛืू͍ͯ͠·͢ʣ