travis-ciを使って、DynamoDBの擬似版dynaliteのDockerイメージを作って公開してみよう！

## 目的

takezoeさんの記事、「[AWS上で動作するアプリケーションをいかにローカルで開発するか？](http://takezoe.hatenablog.com/entry/2016/02/12/090152)」に触発されて、
DynamoDBのDocker Imageを作成できるか試してみることにしました！

## 成果物

* https://github.com/tripleW/docker-dynalite
* https://hub.docker.com/r/letusfly85/dynalite/

## 参考資料

* https://docs.travis-ci.com/user/docker/
* https://github.com/mhart/dynalite

## 手順

### 1. GitHubでリポジトリを作成して、Dockerfileを用意する

https://github.com/tripleW/docker-dynalite

```Dockerfile
FROM node

RUN npm install -g dynalite

EXPOSE 4567

CMD ["dynalite"]
```

### 2. .travis.ymlを用意する

https://docs.travis-ci.com/user/docker/

上記を参考にして、.travis.ymlを実装しました。

```.travis.yml
sudo: required

language: node_js
node_js:
  - "4.1"

services:
  - docker

before_install:
  - docker build -t letusfly85/dynalite ./

script:
  - docker login -e="$DOCKER_EMAIL" -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
  - docker push letusfly85/dynalite
```

`docker push`ってどうやるのよ。。と思ったのですが、travis-ciのリポジトリの設定画面で環境変数を設定できたので、そこで、

* DOCKER_EMAIL
* DOCKER_USERNAME
* DOCKER_PASSWORD

を設定しました。

### 3. git pushをして、travis ciを走らせる

以下イメージです。

![スクリーンショット 2016-02-15 15.00.45.png](https://qiita-image-store.s3.amazonaws.com/0/49547/c8d26b5c-33cb-1d62-778c-4bd6fa0f833a.png)

![スクリーンショット 2016-02-15 15.01.12.png](https://qiita-image-store.s3.amazonaws.com/0/49547/a08e7ec1-be62-035e-55d5-96c09859f131.png)

割とさくっと、いけましたね。

イメージ自体が利用可能かどうかはこれから見てみようと思います^^;

## 利用方法

### 実行環境

* Client ローカルのMacOS
* Server どこかのAWSとかどこかのGCPとか
* node利用

### 1. npm install でaws-sdkを取得

```bash
npm install aws-sdk
```

### 2. dummyのcredentialファイルを作成

良い子のみなさんはインスタンスロールで対応できる方法を見つけてくださいね^^

```credential.json
{"accessKeyId": "XXXXXXXXXXXXXXXXXX", "secretAccessKey": "YYYYYYYYYYYYYYYYYYYYYYYYYYYY"}
```

### 3. アクセスするjsファイルを作成

```create.table.js
var AWS = require('aws-sdk')
AWS.config.loadFromPath('credential.json');

var dynamo = new AWS.DynamoDB({region: 'us-east-1', endpoint: 'http://*.*.*.*'})
dynamo.listTables(console.log.bind(console))

var params = {
    TableName : "Movies",
    KeySchema: [
        { AttributeName: "year", KeyType: "HASH"},  //Partition key
        { AttributeName: "title", KeyType: "RANGE" }  //Sort key
    ],
    AttributeDefinitions: [
        { AttributeName: "year", AttributeType: "N" },
        { AttributeName: "title", AttributeType: "S" }
    ],
    ProvisionedThroughput: {
        ReadCapacityUnits: 10,
        WriteCapacityUnits: 10
    }
};

dynamo.createTable(params, function(err, data) {
    if (err) {
        console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
    }
});

dynamo.describeTable(params, function(err, data) {
    if (err) {
        console.log(err, err.stack);
    } else {
        console.log(data);
        // php.var_dump(data);
    }
});
```

### 4. 実行

```bash
node create.table.js
```

### 5. 結果

```bash
{ [MultipleValidationErrors: There were 3 validation errors:
* UnexpectedParameter: Unexpected key 'KeySchema' found in params
* UnexpectedParameter: Unexpected key 'AttributeDefinitions' found in params
* UnexpectedParameter: Unexpected key 'ProvisionedThroughput' found in params]
  message: 'There were 3 validation errors:\n* UnexpectedParameter: Unexpected key \'KeySchema\' found in params\n* UnexpectedParameter: Unexpected key \'AttributeDefinitions\' found in params\n* UnexpectedParameter: Unexpected key \'ProvisionedThroughput\' found in params',
  code: 'MultipleValidationErrors',
  errors:
   [ { [UnexpectedParameter: Unexpected key 'KeySchema' found in params]
       message: 'Unexpected key \'KeySchema\' found in params',
       code: 'UnexpectedParameter',
       time: Mon Feb 15 2016 15:50:15 GMT+0900 (JST) },
     { [UnexpectedParameter: Unexpected key 'AttributeDefinitions' found in params]
       message: 'Unexpected key \'AttributeDefinitions\' found in params',
       code: 'UnexpectedParameter',
       time: Mon Feb 15 2016 15:50:15 GMT+0900 (JST) },
     { [UnexpectedParameter: Unexpected key 'ProvisionedThroughput' found in params]
       message: 'Unexpected key \'ProvisionedThroughput\' found in params',
       code: 'UnexpectedParameter',
       time: Mon Feb 15 2016 15:50:15 GMT+0900 (JST) } ],
  time: Mon Feb 15 2016 15:50:15 GMT+0900 (JST) } ''
null { TableNames: [] }
Created table. Table description JSON: {
  "TableDescription": {
    "AttributeDefinitions": [
      {
        "AttributeName": "year",
        "AttributeType": "N"
      },
      {
        "AttributeName": "title",
        "AttributeType": "S"
      }
    ],
    "TableName": "Movies",
    "KeySchema": [
      {
        "AttributeName": "year",
        "KeyType": "HASH"
      },
      {
        "AttributeName": "title",
        "KeyType": "RANGE"
      }
    ],
    "TableStatus": "CREATING",
    "CreationDateTime": "2016-02-15T06:50:15.599Z",
    "ProvisionedThroughput": {
      "NumberOfDecreasesToday": 0,
      "ReadCapacityUnits": 10,
      "WriteCapacityUnits": 10
    },
    "TableSizeBytes": 0,
    "ItemCount": 0,
    "TableArn": "arn:aws:dynamodb:us-east-1:000000000000:table/Movies"
  }
}
null { TableNames: [ 'Movies' ] }
```

使えないこともなさそうな印象ですね！

## おまけ

scalaからも呼び出しできました。

https://github.com/letusfly85/use-dynalite_scala-example