AtlassianのLocalStackを使ってみてなんとなく理解するまでのお話

Atlassianが「LocalStack」なんてとても便利そうなものを出していたけど、なかなか使い方を解説しているページが見つからなかったので、とりあえず使いながらなんとなく中身を理解するまでのお話。

※2017/08/12 リポジトリが変更になった、と情報をいただきましたので更新します。おそらくdockerコマンドで使っているリポジトリの書き方とかも変わっていると思います。最新情報は新しいリポジトリから確認をお願いします。
https://github.com/localstack/localstack
![スクリーンショット 2017-04-23 17.53.59.png](https://qiita-image-store.s3.amazonaws.com/0/102769/07c8f380-8a15-7977-f31f-50f904269fcd.png)

# 起動
いくつかGithubで利用方法が紹介されていますが、今回はdockerでの利用をしてみます。

```
$ docker run -it -p 4567-4578:4567-4578 -p 8080:8080 atlassianlabs/localstack
2017-04-23 08:50:15,876 INFO supervisord started with pid 1
2017-04-23 08:50:16,879 INFO spawned: 'dashboard' with pid 7
2017-04-23 08:50:16,885 INFO spawned: 'infra' with pid 8
(. .venv/bin/activate; bin/localstack web --port=8080)
. .venv/bin/activate; exec localstack/mock/infra.py
Starting local dev environment. CTRL-C to quit.
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
 * Restarting with stat
Starting local Elasticsearch (port 4571)...
Starting mock ES service (port 4578)...
Starting mock S3 server (port 4572)...
Starting mock SNS server (port 4575)...
Starting mock SQS server (port 4576)...
Starting mock API Gateway (port 4567)...
Starting mock DynamoDB (port 4569)...
Starting mock DynamoDB Streams (port 4570)...
Starting mock Firehose (port 4573)...
Starting mock Lambda (port 4574)...
Starting mock Kinesis (port 4568)...
Starting mock Redshift server (port 4577)...
 * Debugger is active!
2017-04-23 08:50:18,537 INFO success: dashboard entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2017-04-23 08:50:18,538 INFO success: infra entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
 * Debugger PIN: 844-652-544
Ready.
```
とりあえず起動はしたみたい。で、``` http://localhost:8080/ ```にアクセスしてみたけど、こんな感じで何も表示されず。

![スクリーンショット 2017-04-23 17.59.04.png](https://qiita-image-store.s3.amazonaws.com/0/102769/b6db3e73-e93e-40f8-6210-f5c55249da97.png)

使ってみてわかりましたが、要は本当に各種サービスが以下のアドレスで利用できるようにしてくれたもののようです。

- API Gateway at http://localhost:4567
- Kinesis at http://localhost:4568
- DynamoDB at http://localhost:4569
- DynamoDB Streams at http://localhost:4570
- Elasticsearch at http://localhost:4571
- S3 at http://localhost:4572
- Firehose at http://localhost:4573
- Lambda at http://localhost:4574
- SNS at http://localhost:4575
- SQS at http://localhost:4576
- Redshift at http://localhost:4577
- ES (Elasticsearch Service) at http://localhost:4578
- SES at http://localhost:4579
- Route53 at http://localhost:4580
- CloudFormation at http://localhost:4581

全部試すのもアレなので、とりあえず馴染み深いDynamoDBとS3を使ってみる。

# DynamoDBのテーブル作成
全然関係ないですが、```http://localhost:4569/```にアクセスすると以下のレスポンスをもらえます。デフォルトはus-east-1で動いている想定のようで。（Githubページにも書いてあった。バインドすればいくつか設定を変更できるようですね。）

```
healthy: dynamodb.us-east-1.amazonaws.com 
```
では早速テーブルをCLIから作ってみます。一応作成前にlist-tablesをしてみますが、もちろん何も登録されていません。

```
$ aws --endpoint-url=http://localhost:4569 dynamodb list-tables
{
    "TableNames": []
}
```

[こちら](http://blog.dalt.me/301)を参考にさせていただいて、create-tableコマンドを発行します。

```
$ aws --endpoint-url=http://localhost:4569 dynamodb create-table --table-name test --attribute-definitions AttributeName=testId,AttributeType=S --key-schema AttributeName=testId,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
{
    "TableDescription": {
        "TableArn": "arn:aws:dynamodb:us-east-1:000000000000:table/test", 
        "AttributeDefinitions": [
            {
                "AttributeName": "testId", 
                "AttributeType": "S"
            }
        ], 
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0, 
            "WriteCapacityUnits": 1, 
            "ReadCapacityUnits": 1
        }, 
        "TableSizeBytes": 0, 
        "TableName": "test", 
        "TableStatus": "CREATING", 
        "KeySchema": [
            {
                "KeyType": "HASH", 
                "AttributeName": "testId"
            }
        ], 
        "ItemCount": 0, 
        "CreationDateTime": 1492937089.534
    }
}

```
なんか作られたっぽいですね。もう一度list-tablesをしてみます。

```
$ aws --endpoint-url=http://localhost:4569 dynamodb list-tables
{
    "TableNames": [
        "test"
    ]
}
```

出来上がってますね。なるほど、本当にAWS上でやる操作をEndpointURLを変更するだけで操作できてしまうようです。これは思っていたよりも便利かも。

# S3のバケットを作成してみる
S3のバケットも作成できるのか試してみます。まずバケットのリストを見てみますが、当然何もありません。

```
$ aws --endpoint-url=http://localhost:4572 s3 ls
（何も表示されず）
```

では作成してみます。

```
$ aws --endpoint-url=http://localhost:4572 s3 mb s3://kojiisd-test/
make_bucket: s3://kojiisd-test/
$ aws --endpoint-url=http://localhost:4572 s3 ls
2006-02-04 01:45:09 kojiisd-test
```

まじか、これは便利。ただdockerでサービス起動したら停止時に中身が消えてしまうから、できれば作成したものが残るような起動方法の方が色々試そうとしたら適していそうですね。
（作成時間がはちゃめちゃですが、とりあえずそこまで問題にはならないかな）

ちなみにDynamoDBのテーブルとS3のバケットを作成してから気づきましたが、```http://localhost:8080/```にアクセスしたら、作成したものが表示されていました。なるほど、そのためのDashBoardだったのか。素敵。

![スクリーンショット 2017-04-23 18.20.02.png](https://qiita-image-store.s3.amazonaws.com/0/102769/19e7669e-9d74-0aba-aedb-d58b5c1f6bcd.png)


# まとめ
どれくらいどこまで何ができるのかは気になりますが、一般的なことであればだいたいローカルでできるような気がします。しかもEndpointURLを変更するだけで良さそうなので、これはかなり便利かも。今度作成したアプリを全てLocalStackで動かしてみるとかやってみようかな。

とりあえず、**もっとこれは知られるべき**と、思いました。