SlideShare a Scribd company logo
LocalStack
クラウドサービスのモック環境
2017-06-17
第十九回 #渋谷java
Me
島本 多可子(@chibochibo03)
株式会社ビズリーチ CTO室
普段はScalaを書いてます
Apache PredictionIOのコミッタになりました
直近の著書です →
今日はなすこと
LocalStackってなに?
簡単な使い方
JUnitと統合できちゃう!
AWSをフル活用
弊社のサービスのほとんどにおいて活用
機械学習など一部対象外あり
特性や課金モデルを把握し使いたおす
AWSのサービスを活用する場合の課題
検証環境にあげないと動作確認できない
DynamoDBなどモックでは開発しづらいケースもある
仕様や制限を網羅するのは結構大変
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
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
これまで
DynamoDB Localやkinesaliteを組み込んだDockerfileを用意
ローカルでコンテナをビルドして使う
docker-composeでまとめて起動・停止できるようにしたり
これまで
DynamoDB Localやkinesaliteを組み込んだDockerfileを用意
ローカルでコンテナをビルドして使う
docker-composeでまとめて起動・停止できるようにしたり
(´・ω・`)ショボーン チョットメンドウ
使うサービスが増えると・・・
LocalStack
https://github.com/atlassian/localstack
A fully functional local AWS cloud stack
あなたのクラウドアプリケーションをオフラインで開発してテストしましょう!
LocalStack
クラウドサービスを使ったアプリの開発時に便利
直近はAWSのサービスに重点が置かれている
KCL for Pythonの実装を提供
使えるサービスがこんなにある!
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
数が多いだけじゃない!
エラーのインジェクション
実際の環境ではよく発生するエラーがある
たとえば ProvisionedThroughputExceededException
動作確認でわざとエラーを出すのは意外とめんどくさい
設定で簡単にできる! ( ・ㅂ・)‫و‬
数が多いだけじゃない!
プロセスはすべて独立しており、差し替え可能
デフォルトでは16サービスが有効
必要なサービスだけにすることも可能
設定で簡単にできる! ( ・ㅂ・)‫و‬
Setup
Running in Docker
$ git clone
https://github.com/atlassian/localstack.git
$ cd localstack/
$ docker-compose up
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 をインストールしておくこと
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 をインストールしておくこと
Dashboard
Dashboard
http://localhost:8080
簡易的なダッシュボードが付属
作った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
作った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
確認
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 をインストールしておくこと
魅力的なのがKinesis or DynamoDB
ProvisionedThroughputExceededException
リクエストが失敗した
なぜ?
ProvisionedThroughputExceededException
リクエストが失敗した
スループット超過
なぜ?
なぜ?
ProvisionedThroughputExceededException
リクエストが失敗した
スループット超過
確保している処理能力を超えた
なぜ?
なぜ?
避けて通れないスループット超過
ほんの一瞬の負荷によって失敗する可能性あり
スループット超過を想定しておく必要あり
アプリ側でリトライすることを前提にしておく
(´・ω・`)ショボーン チョットメンドウ
超過したときの動作確認・・・
設定で簡単にできる!
環境変数に以下を設定
$ export KINESIS_ERROR_PROBABILITY=0.5
$ docker-compose up
設定で簡単にできる!
環境変数に以下を設定
$ export KINESIS_ERROR_PROBABILITY=0.5
$ docker-compose up
0.0 (default) 〜 1.0の範囲
0.0 => エラーなし
1.0 => 常にエラー
注意
PutRecordsにしか対応してない
割合はすべてのリクエストに対して適用される
実際は独自のdocker-composeを作りたくなるケースが多そう
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」という名前のストリームを作成しておくこと
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」という名前のストリームを作成しておくこと
他にもこんな設定が
環境変数 説明
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で実行
Integration with JUnit
JUnitと統合できる
LocalstackTestRunner
テストを実行すると、すべての依存を自動でダウンロード
一時ディレクトリにインストール
Integration with JUnit
手順は ↓↓↓
https://github.com/atlassian/localstack#integration-with-javaju
nit
しかーし!!!!
注意
JUnitと統合できる
LocalstackTestRunner
テストを実行すると、すべての依存を自動でダウンロード
一時ディレクトリにインストール
注意
JUnitと統合できる
LocalstackTestRunner
テストを実行すると、すべての依存を自動でダウンロード
一時ディレクトリにインストール
git clone
注意
JUnitと統合できる
LocalstackTestRunner
テストを実行すると、すべての依存を自動でダウンロード
一時ディレクトリにインストール
git clone
make install (-"-;)ムム
注意
make、python、pip、npmなどが必要
(環境によって)makeでError
Connection refused !?
make infraを叩くとReady.が出ない
Elasticsearchのhealth checkに失敗
JUnit統合を使うときの心得
あたたかい気持ちで
pythonとお付き合いしましょう
Makefileを読みましょう
makeのエラーに対応しましょう
まとめ
AWSを使ったアプリもローカルで開発できる
LocalStackさえあればOK
既存のツールに欠けている機能を補う
例外のインジェクションなど
まとめ
サードパーティとの問題の切り分けがちょっと大変
LocalStack側の問題ではないこともある
真面目に触ると粗いと感じる部分がある
本物との差異

More Related Content

PDF
Crawler Commons
PDF
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
PDF
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
PDF
React系(別言語含む)の サーバーサイドレンダリング について考えよう
ODP
高トラフィックサイトをRailsで構築するためのTips基礎編
PPTX
20161208 Classmethod Codenize Tools
PDF
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
PPTX
AWS CLIでEC2の利用料金を節約する
Crawler Commons
localstackによるAWS Lambdaの開発環境を、miniconda上でつくったら簡単便利だった話
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
React系(別言語含む)の サーバーサイドレンダリング について考えよう
高トラフィックサイトをRailsで構築するためのTips基礎編
20161208 Classmethod Codenize Tools
17 E-5 震災とHackとクラウドと ━ URIベースのCSLB
AWS CLIでEC2の利用料金を節約する

What's hot (20)

PDF
S3 を単純ストレージとして 利用する手段の比較
PDF
Single Command Deployのための gradle-aws-plugin講座
PDF
Jenkinsとhadoopを利用した継続的データ解析環境の構築
PPT
[大図解]ピグライフはこう動いている
PDF
Reactとbabelで簡易タスク管理ツール作ってみた
PDF
Data Engineering at VOYAGE GROUP #jawsdays
PPTX
AKS と ACI を組み合わせて使ってみた
PDF
Re-frame and A-Frame
PDF
Babelで先取り次世代javascript
PPTX
LINE API × heroku ×selenium
PDF
Rancher Meetup Tokyo #4 Intro
PPTX
はじめての datadog
PDF
Service worker が拓く mobile web の新しいかたち
PPTX
Grunt入門
PDF
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
PPTX
Amazon EKS への道 ~ EKS 再入門 ~
PDF
JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0
PDF
MobingiALM でスポットインスタンスをいい感じに手なづけている裏側の話 / How to manage EC2 Spot Instances
PDF
Vsug day 2010 summer windows azure でやってみよう
PDF
S3 を単純ストレージとして 利用する手段の比較
Single Command Deployのための gradle-aws-plugin講座
Jenkinsとhadoopを利用した継続的データ解析環境の構築
[大図解]ピグライフはこう動いている
Reactとbabelで簡易タスク管理ツール作ってみた
Data Engineering at VOYAGE GROUP #jawsdays
AKS と ACI を組み合わせて使ってみた
Re-frame and A-Frame
Babelで先取り次世代javascript
LINE API × heroku ×selenium
Rancher Meetup Tokyo #4 Intro
はじめての datadog
Service worker が拓く mobile web の新しいかたち
Grunt入門
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
Amazon EKS への道 ~ EKS 再入門 ~
JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0
MobingiALM でスポットインスタンスをいい感じに手なづけている裏側の話 / How to manage EC2 Spot Instances
Vsug day 2010 summer windows azure でやってみよう
Ad

Viewers also liked (8)

PDF
スマホアプリ開発者のためのWeb api開発入門の入門
PDF
Web開発の技術選び、 好き嫌いでやってませんか 〜技術選びで注目すべきポイントとは〜
PDF
SolrとElasticsearchを比べてみよう
PDF
Elasticsearchと機械学習を利用したbot基盤
PDF
MySQLユーザ視点での小さく始めるElasticsearch
PPTX
リクルートを支える横断データ基盤と機械学習の適用事例
PDF
3000社の業務データ絞り込みを支える技術
PDF
こわくない Git
スマホアプリ開発者のためのWeb api開発入門の入門
Web開発の技術選び、 好き嫌いでやってませんか 〜技術選びで注目すべきポイントとは〜
SolrとElasticsearchを比べてみよう
Elasticsearchと機械学習を利用したbot基盤
MySQLユーザ視点での小さく始めるElasticsearch
リクルートを支える横断データ基盤と機械学習の適用事例
3000社の業務データ絞り込みを支える技術
こわくない Git
Ad

Similar to LocalStack (20)

PDF
Scraping withawsAWSを利用してスクレイピングの悩みを解決するチップス
PDF
現場開発者視点で答えるWindows Azure
PPTX
はじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたい
PPTX
インフラ系自主トレするならAWS
PDF
Amazon ec2とは何か?
PPTX
Windows azureって何
PDF
Azure Functionsでサーバーレスアプリケーション構築
PPTX
AWS活用のいままでとこれから -東急ハンズの事例-
PDF
Azure Functionsでサーバーレスアプリケーション構築
PPTX
Osc spring 20220311
PDF
仮想通貨取引所 bitbank の IaC の導入と実践
PDF
JAWS-UG鹿児島 初心者向け簡単講座
PDF
Microsoft Azure ~ Web開発 & モバイル開発者向け情報 ~
PDF
[MW11] OSS on Azure で構築する ウェブアプリケーション
PPTX
サーバ構築・デプロイが簡単に!Elastic beanstalk
PDF
これでAWSマスター!? 初心者向けAWS簡単講座
PPTX
PHP on Cloud
PDF
2011-04-21 クラウド勉強会
PDF
Elastic beanstalk
PDF
クラウド開発に役立つ OSS あれこれ
Scraping withawsAWSを利用してスクレイピングの悩みを解決するチップス
現場開発者視点で答えるWindows Azure
はじめての Bluemix でシングルサインオン ~ 雲間を越えて、つなげたい
インフラ系自主トレするならAWS
Amazon ec2とは何か?
Windows azureって何
Azure Functionsでサーバーレスアプリケーション構築
AWS活用のいままでとこれから -東急ハンズの事例-
Azure Functionsでサーバーレスアプリケーション構築
Osc spring 20220311
仮想通貨取引所 bitbank の IaC の導入と実践
JAWS-UG鹿児島 初心者向け簡単講座
Microsoft Azure ~ Web開発 & モバイル開発者向け情報 ~
[MW11] OSS on Azure で構築する ウェブアプリケーション
サーバ構築・デプロイが簡単に!Elastic beanstalk
これでAWSマスター!? 初心者向けAWS簡単講座
PHP on Cloud
2011-04-21 クラウド勉強会
Elastic beanstalk
クラウド開発に役立つ OSS あれこれ

More from chibochibo (13)

PDF
Tour of Apache PredictionIO in 10 Minutes
PDF
Deadly Code! (seriously) Blocking & Hyper Context Switching Pattern
PDF
Dynamic SQL in doobie
PDF
Is spark streaming based on reactive streams?
PDF
What is doobie? - database access for scala -
PDF
Quartzでcronを範囲検索したい
PDF
ビッグじゃなくても使えるSpark Streaming
PDF
nioで作ったBufferedWriterに変えたら例外になった
PDF
Spark Streaming on AWS -S3からKinesisへ-
PDF
Spark in small or middle scale data processing with Elasticsearch
PDF
What's a macro?: Learning by Examples
PDF
Spring Boot Introduction
PDF
Slick入門
Tour of Apache PredictionIO in 10 Minutes
Deadly Code! (seriously) Blocking & Hyper Context Switching Pattern
Dynamic SQL in doobie
Is spark streaming based on reactive streams?
What is doobie? - database access for scala -
Quartzでcronを範囲検索したい
ビッグじゃなくても使えるSpark Streaming
nioで作ったBufferedWriterに変えたら例外になった
Spark Streaming on AWS -S3からKinesisへ-
Spark in small or middle scale data processing with Elasticsearch
What's a macro?: Learning by Examples
Spring Boot Introduction
Slick入門

LocalStack