Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RSpec for AWSフルマネージドサービス

Avatar for yotaro yotaro
November 21, 2017

RSpec for AWSフルマネージドサービス

■イベント
【福岡】GMOペパボ × Sansan合同勉強会 「歴史ある大規模サービスがまだなお成長する秘訣」
https://sansan.connpass.com/event/71727/

■登壇概要
タイトル:RSpec for AWSフルマネージドサービス
登壇者:Eight事業部 サーバサイドエンジニア 藤井洋太郎

Avatar for yotaro

yotaro

November 21, 2017
Tweet

More Decks by yotaro

Other Decks in Technology

Transcript

  1. ᶃ ໊ࢗΛεΩϟϯ ᶅ OCRॲཧˍΦϖϨʔλʔೖྗ OCRͱΦϖϨʔλʔʹΑΔଟॏೖྗ ᶆ σʔλϕʔεԽ • ςΩετσʔλ •

    ը૾σʔλ ᶇ ΞϓϦέʔγϣϯͰ׆༻ ໊ࢗͷݕࡧɾӾཡɾฤू ᶄσʔλૹ৴ Πϯλʔωοτ ͓٬༷ Database ໊ࢗΛ “ࢿ࢈”ͱͯ͠؅ཧ ໊ࢗΛ ࢿ࢈ͱͯ͠؅ཧ ೖྗαʔϏε Ϋϥ΢υαʔ Ϗε 4BOTBOͷ࢓૊Έ
  2. D I D KPI D D N B P P

    A B/ I N W D W Recommendation Feed AWSʹΰϦοΰϦʹґଘ💊 AWS100αʔϏεͷ͏ͪͷ ໿൒਺Λར༻
  3. Aurora Mysql5.6 Redshift Postgres DynamoDB DynamoDB Local SQS ElasticMQ S3

    FakeS3 Elasticsearch Service Elasticsearch ElastiCache Memcached & Redis CloudSearch nozama-cloudsearch "84αʔϏε⾩'BLFܥରԠҰྫ
  4. ϩʔΧϧͰಈ࡞·Ͱͷجຊ4UFQ  ֤'BLFܥΞϓϦέʔγϣϯΛ%PXOMPBE*OTUBMM جຊ044ͱͯ͠ެ։͞Ε͍ͯΔͷͰແঈͰར༻Ͱ͖Δ   ΞϓϦέʔγϣϯ 3BJMT ॳظԽॲཧͰ֤"XT$MJFOUͷ޲͖ઌΛ Ͱ্ཱͪ͛ͨϓϩηεͷFOEQPJOUʹมߋ

    ~/con fi g/initializers/aws.rb if Rails.env.test? || Rails.env.development? Aws.con fi g[:dynamodb] = { endpoint: 'http://localhost:8000', access_key_id: 'fake_akid', secret_access_key: ‘fake_secret’, } … end
  5. ϩʔΧϧͰಈ࡞·Ͱͷجຊ4UFQ  ͜Ε͚ͩͰEFWFMPQNFOU؀ڥ͸ಈ͘🎉  34QFD౳Ͱಈ͔ͨ͢ΊʹɺσʔλॳظԽॲཧΛ௥Ճ ɾ%ZOBNP%#ͷ৔߹ҎԼͷΑ͏ͳॲཧΛ௥Ճ  dTQFDTVQQPSUEZOBNPECSC౳Λ༻ҙ  ACFGPSF

    TVJUF AͰςετ༻ςʔϒϧ࡞੒ॲཧ  QSFQFOE@CFGPSF FBDI Ͱσʔλ࡟আॲཧ  BQQFOE@BGUFS TVJUF Ͱςετ༻ςʔϒϧ࡟আॲཧ ίʔυ͸ https://qiita.com/yotaro/items/caff6dc4c6b6ed2b19ee Λࢀߟʹ
  6. ςετ؀ڥߏங࣌ͷ஫ҙ఺  8FC.PDL౳Λ࢖͍ͬͯΔ৔߹͸࢖༻͢ΔαʔϏεΛڐՄͯ͋͠ ͛Δඞཁ͕͋Δ    αʔϏεʹΑͬͯ͸σʔλ࡟আ͢Δ"1*͕ແ͍ͷͰࣗ࡞͠ͳ͚Ε ͹ͳΒͳ͍ɻ%ZOBNP%#-PDBMͷ৔߹ con

    fi g.before(:suite) do … WebMock.disable_net_connect!( allow_localhost: true, allow: [‘http://127.0.0.1:8000'], # DynamoDB Local΁ͷΞΫηεΛڐՄ ) end  શςʔϒϧΛTDBOͯ͠JUFNऔಘ  औಘͨ͠JUFNͷ࡟আ"1*Λίʔϧ
  7. 34QFDͷλάػೳ🔖 RSpec.con fi gure do |con fi g| con fi

    g.prepend_before(:each, :dynamodb) do # dynamodbͱ͍͏λά͕෇͚ΒΕͨ # ςετέʔε͚ͩॳظԽॲཧΛߦΘͤΔ͜ͱ͕Մೳ ... end end describe 'DynamoDBʹର͢Δૢ࡞', :dynamodb do # dynamodbͷॳظԽॲཧ͕ߦΘΕΔ … end describe 'DynamoDB͕ؔ܎ͳ͍ૢ࡞' do # dynamodbͷॳظԽॲཧ͸ߦΘΕͳ͍ɻ # itemͷଘࡏ༗ແ͕ςετͷ݁ՌʹӨڹ͠ͳ͍৔߹͸ॳظԽ͠ͳ͍ɻ … end ॳ ظ Խ ॲ ཧ ֤ ς ε τ έ ᴺ ε
  8. ࢖༻͞ΕͨςʔϒϧͷϝϞԽ📝 module UsedTableRecorder def used_tables @used_tables ||= [] end def

    clear_used_tables @used_tables = [] end [:put_item, :update_item].each do|method| de fi ne_method method do|*args, &block| request_item = args[0] used_tables << request_item[:table_name] super(*args, &block) end end [:batch_write_item].each do|method| de fi ne_method method do|*args, &block| request_items = args[0][:request_items] used_tables.concat(request_items.keys) super(*args, &block) end client = Aws::DynamoDB::Client.new( stub_responses: false ) client.extend(UsedTableRecorder) RSpec.con fi gure do |con fi g| con fi g.prepend_before(:each, :dynamodb) do # ॳظԽ͢Δର৅ͷςʔϒϧͷΈऔಘ truncate_tables = client.used_tables.uniq.compact # ্هςʔϒϧͷΈॳظԽॲཧ ... end end
  9. &JHIUͷ։ൃ༻AEPDLFSDPNQPTFZNMA version: '2' services: dynamodb: image: ['ECRʹ্͛ͨimageΛࢦఆ'] ports: - "8000:8000"

    restart: always elasticmq: image: ['ECRʹ্͛ͨimageΛࢦఆ'] ports: - "9324:9324" restart: always redis: image: redis:alpine ports: - "6379:6379" restart: always mysqld: image: mysql:5.6 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: rootpass restart: always elasticsearch: image: elasticsearch:5.3 ports: - "9200:9200" - "9300:9300" environment: - "ES_JAVA_OPTS=-Xms300m -Xmx500m" restart: always fakes3: image: ['ECRʹ্͛ͨimageΛࢦఆ'] ports: - "4569:4569" restart: always fakes3test: image: ['ECRʹ্͛ͨimageΛࢦఆ'] ports: - "4570:4569" restart: always memcached: image: memcached:alpine ports: - "11211:11211" restart: always cloudsearch: image: ['ECRʹ্͛ͨimageΛࢦఆ'] links: - mongo:mongo_for_cs_1 - elasticsearch:elasticsearch_for_cs_1 ports: - "15808:15808" restart: always mongo: image: mongo ports: - "27017:27017" restart: always postgres: image: postgres:alpine ports: - "5432:5432" restart: always
  10. AWS Service FakeܥαʔϏε Docker Hub ެࣜImage༗ແ Aurora Mysql5.6 ‒ Redshift

    Postgres ‒ DynamoDB DynamoDB Local ✕ SQS ElasticMQ ✕ S3 FakeS3 ✕ Elasticsearch Service Elasticsearch ‒ ElastiCache Memcached & Redis ‒ CloudSearch nozama-cloudsearch ✕