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
組織におけるCCoEの役割とAWS活用事例
nrinetcom
PRO
4
120
CDKでカスタムランタイムを作成して、Lambdaをnode.js23+TypeScriptで動かしてみた
smt7174
2
110
Perlの生きのこり - エンジニアがこの先生きのこるためのカンファレンス2025
kfly8
2
270
遷移の高速化 ヤフートップの試行錯誤
narirou
6
1.1k
OCI Success Journey OCIの何が評価されてる?疑問に答える事例セミナー(2025年2月実施)
oracle4engineer
PRO
2
130
Raycast AI APIを使ってちょっと便利な拡張機能を作ってみた / created-a-handy-extension-using-the-raycast-ai-api
kawamataryo
0
210
役員・マネージャー・著者・エンジニアそれぞれの立場から見たAWS認定資格
nrinetcom
PRO
3
5.8k
わたしがEMとして入社した「最初の100日」の過ごし方 / EMConfJp2025
daiksy
14
4.9k
30→150人のエンジニア組織拡大に伴うアジャイル文化を醸成する役割と取り組みの変化
nagata03
0
130
Two Blades, One Journey: Engineering While Managing
ohbarye
4
1.9k
ウォンテッドリーのデータパイプラインを支える ETL のための analytics, rds-exporter / analytics, rds-exporter for ETL to support Wantedly's data pipeline
unblee
0
120
AIエージェント元年@日本生成AIユーザ会
shukob
1
200
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Into the Great Unknown - MozCon
thekraken
35
1.6k
4 Signs Your Business is Dying
shpigford
182
22k
The Cost Of JavaScript in 2023
addyosmani
47
7.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
7k
Designing Experiences People Love
moore
140
23k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Site-Speed That Sticks
csswizardry
4
400
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.1k
Designing for humans not robots
tammielis
250
25k
Building Applications with DynamoDB
mza
93
6.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ΛͬͯҰॹʹಇ͘ํΛืू͍ͯ͠·͢ʣ