狠狠撸

狠狠撸Share 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

LocalStack