Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

LocalStack

1,000 views

Published on

mock framework for AWS services
第十九回 #渋谷java

  • Be the first to comment

LocalStack

  1. 1. LocalStack クラウドサービスのモック環境 2017-06-17 第十九回 #渋谷java
  2. 2. Me 島本 多可子(@chibochibo03) 株式会社ビズリーチ CTO室 普段はScalaを書いてます Apache PredictionIOのコミッタになりました 直近の著書です →
  3. 3. 今日はなすこと LocalStackってなに? 簡単な使い方 JUnitと統合できちゃう!
  4. 4. AWSをフル活用 弊社のサービスのほとんどにおいて活用 機械学習など一部対象外あり 特性や課金モデルを把握し使いたおす
  5. 5. AWSのサービスを活用する場合の課題 検証環境にあげないと動作確認できない DynamoDBなどモックでは開発しづらいケースもある 仕様や制限を網羅するのは結構大変
  6. 6. AWSのサービスのローカル実装が存在する AWSサービス ローカル実装 URL RDS MySQL等 Elasticsearch Elasticsearch ElasticCache memcached, Redis S3 s3rver https://github.com/jamhall/s3rver SQS elasticmq https://github.com/adamw/elasticmq Kinesis kinesalite https://github.com/mhart/kinesalite DynamoDB DynamoDB Local https://docs.aws.amazon.com/amazondynamodb/late st/developerguide/Tools.DynamoDBLocal.html
  7. 7. AWSのサービスのローカル実装が存在する AWSサービス ローカル実装 URL DynamoDB dynalite https://github.com/mhart/dynalite SNS fake_sns https://github.com/yourkarma/fake_sns CloudSearch nozama-cloudsearch https://github.com/oisinmulvihill/nozama-cloudsearch Lambda node-lambda https://github.com/motdotla/node-lambda
  8. 8. これまで DynamoDB Localやkinesaliteを組み込んだDockerfileを用意 ローカルでコンテナをビルドして使う docker-composeでまとめて起動・停止できるようにしたり
  9. 9. これまで DynamoDB Localやkinesaliteを組み込んだDockerfileを用意 ローカルでコンテナをビルドして使う docker-composeでまとめて起動・停止できるようにしたり (´・ω・`)ショボーン チョットメンドウ 使うサービスが増えると・・・
  10. 10. LocalStack https://github.com/atlassian/localstack A fully functional local AWS cloud stack あなたのクラウドアプリケーションをオフラインで開発してテストしましょう!
  11. 11. LocalStack クラウドサービスを使ったアプリの開発時に便利 直近はAWSのサービスに重点が置かれている KCL for Pythonの実装を提供
  12. 12. 使えるサービスがこんなにある! API Gateway http://localhost:4567 Kinesis http://localhost:4568 DynamoDB http://localhost:4569 DynamoDB Streams http://localhost:4570 Elasticsearch http://localhost:4571 S3 http://localhost:4572 Firehose http://localhost:4573 Lambda http://localhost:4574 SNS http://localhost:4575 SQS http://localhost:4576 Redshift http://localhost:4577 Elasticsearch Service http://localhost:4578 SES http://localhost:4579 Route53 http://localhost:4580 CloudFormation http://localhost:4581 CloudWatch http://localhost:4582
  13. 13. 数が多いだけじゃない! エラーのインジェクション 実際の環境ではよく発生するエラーがある たとえば ProvisionedThroughputExceededException 動作確認でわざとエラーを出すのは意外とめんどくさい 設定で簡単にできる! ( ・ㅂ・)‫و‬
  14. 14. 数が多いだけじゃない! プロセスはすべて独立しており、差し替え可能 デフォルトでは16サービスが有効 必要なサービスだけにすることも可能 設定で簡単にできる! ( ・ㅂ・)‫و‬
  15. 15. Setup Running in Docker $ git clone https://github.com/atlassian/localstack.git $ cd localstack/ $ docker-compose up
  16. 16. S3を使ってみる Create a bucket bash-4.3# aws --endpoint-url=http://localstack:4572 --region=us-east-1 s3 mb s3://pio_bucket bash-4.3# aws --endpoint-url=http://localhost:4572 s3 ls 2006-02-03 16:45:09 pio_bucket (注)AWS CLI をインストールしておくこと
  17. 17. S3を使ってみる Create a bucket bash-4.3# aws --endpoint-url=http://localstack:4572 --region=us-east-1 s3 mb s3://pio_bucket bash-4.3# aws --endpoint-url=http://localhost:4572 s3 ls 2006-02-03 16:45:09 pio_bucket (注)AWS CLI をインストールしておくこと
  18. 18. Dashboard
  19. 19. Dashboard http://localhost:8080 簡易的なダッシュボードが付属
  20. 20. 作ったbucketにput AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withPathStyleAccessEnabled(true) .withEndpointConfiguration(new EndpointConfiguration( "http://localhost:4572", Regions.US_EAST_1.getName())) .build(); ... s3.putObject("pio_bucket", "key1", new FileInputStream(file), metadata); aws-java-sdkを使ってput
  21. 21. 作ったbucketにput AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withPathStyleAccessEnabled(true) .withEndpointConfiguration(new EndpointConfiguration( "http://localhost:4572", Regions.US_EAST_1.getName())) .build(); ... s3.putObject("pio_bucket", "key1", new FileInputStream(file), metadata); aws-java-sdkを使ってput
  22. 22. 確認 Lists objects bash-4.3# aws --endpoint-url=http://localhost:4572 s3 ls s3://pio_bucket 2017-06-12 10:18:03 5411 key1 (注)AWS CLI をインストールしておくこと
  23. 23. 魅力的なのがKinesis or DynamoDB
  24. 24. ProvisionedThroughputExceededException リクエストが失敗した なぜ?
  25. 25. ProvisionedThroughputExceededException リクエストが失敗した スループット超過 なぜ? なぜ?
  26. 26. ProvisionedThroughputExceededException リクエストが失敗した スループット超過 確保している処理能力を超えた なぜ? なぜ?
  27. 27. 避けて通れないスループット超過 ほんの一瞬の負荷によって失敗する可能性あり スループット超過を想定しておく必要あり アプリ側でリトライすることを前提にしておく (´・ω・`)ショボーン チョットメンドウ 超過したときの動作確認・・・
  28. 28. 設定で簡単にできる! 環境変数に以下を設定 $ export KINESIS_ERROR_PROBABILITY=0.5 $ docker-compose up
  29. 29. 設定で簡単にできる! 環境変数に以下を設定 $ export KINESIS_ERROR_PROBABILITY=0.5 $ docker-compose up 0.0 (default) 〜 1.0の範囲 0.0 => エラーなし 1.0 => 常にエラー
  30. 30. 注意 PutRecordsにしか対応してない 割合はすべてのリクエストに対して適用される 実際は独自のdocker-composeを作りたくなるケースが多そう
  31. 31. KinesisにPutRecords 成功時 bash-4.3# aws --endpoint-url=http://localstack:4568 --region=us-east-1 kinesis put-records --stream-name foo --records Data=data1,PartitionKey=part1 Data=data2,PartitionKey=part2 { "FailedRecordCount": 0, "Records": [ { "ShardId": "shardId-000000000000", "SequenceNumber": "49574129433569033358902088269185075153412462741586706434" }, { "ShardId": "shardId-000000000000", "SequenceNumber": "49574129433569033358902088269186284079232077370761412610" } ] } (注)「foo」という名前のストリームを作成しておくこと
  32. 32. KinesisにPutRecords 何回かputしていると・・・ bash-4.3# aws --endpoint-url=http://localstack:4568 --region=us-east-1 kinesis put-records --stream-name foo --records Data=data1,PartitionKey=part1 Data=data2,PartitionKey=part2 { "FailedRecordCount": 1, "Records": [ { "ErrorCode": "ProvisionedThroughputExceededException", "ErrorMessage": "Rate exceeded for shard X in stream Y under account Z." }, { "ErrorCode": "ProvisionedThroughputExceededException", "ErrorMessage": "Rate exceeded for shard X in stream Y under account Z." } ] } (注)「foo」という名前のストリームを作成しておくこと
  33. 33. 他にもこんな設定が 環境変数 説明 DYNAMODB_ERROR_PROBA BILITY DynamoDB APIでスループット超過を出す割合 SERVICES 実行するサービスとポート DEFAULT_REGION AWSリージョン(デフォルト us-east-1) HOSTNAME ホスト名(デフォルト localhost) LAMBDA_EXECUTOR ラムダ関数の実行場所。docker or local LAMBDA_REMOTE_DOCKER docker runで実行 or docker create/cp/startで実行
  34. 34. Integration with JUnit JUnitと統合できる LocalstackTestRunner テストを実行すると、すべての依存を自動でダウンロード 一時ディレクトリにインストール
  35. 35. Integration with JUnit 手順は ↓↓↓ https://github.com/atlassian/localstack#integration-with-javaju nit
  36. 36. しかーし!!!!
  37. 37. 注意 JUnitと統合できる LocalstackTestRunner テストを実行すると、すべての依存を自動でダウンロード 一時ディレクトリにインストール
  38. 38. 注意 JUnitと統合できる LocalstackTestRunner テストを実行すると、すべての依存を自動でダウンロード 一時ディレクトリにインストール git clone
  39. 39. 注意 JUnitと統合できる LocalstackTestRunner テストを実行すると、すべての依存を自動でダウンロード 一時ディレクトリにインストール git clone make install (-"-;)ムム
  40. 40. 注意 make、python、pip、npmなどが必要 (環境によって)makeでError Connection refused !? make infraを叩くとReady.が出ない Elasticsearchのhealth checkに失敗
  41. 41. JUnit統合を使うときの心得 あたたかい気持ちで pythonとお付き合いしましょう Makefileを読みましょう makeのエラーに対応しましょう
  42. 42. まとめ AWSを使ったアプリもローカルで開発できる LocalStackさえあればOK 既存のツールに欠けている機能を補う 例外のインジェクションなど
  43. 43. まとめ サードパーティとの問題の切り分けがちょっと大変 LocalStack側の問題ではないこともある 真面目に触ると粗いと感じる部分がある 本物との差異

×