TerraformとMongoDb cloud managerでシャードをがーっと作る


この記事は。[MongoDB Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/mongodb)の１４日目の記事です。
本日個人的理由でへろへろなのですが、がーっと書いていきたいと思います。
職場で検証用のMongoDB環境を何度か作っていたので、それと似た手順でMongoDB Cloud Managerを使ってAWS上にお試しMongoDB shard clusterを作る手順を書きたいと思います。

## mmsアカウント作成

[MongoDB Cloud Manager - Management Made Easy | MongoDB](https://www.mongodb.com/cloud)から無料アカウント作成します。３０日間のトライアルアカウントが取得できます。
<code>Settings → Group Settings </code>よりGROUP IDとAGENT API KEYをメモっておいてください。

## キーペアの作成

ec2ダッシュボードよりキーペアを作成し、手元のパソコンの~/.ssh/と~/.ssh/configに接続情報を整えておきます。

## AMIを作りなおしてID埋める

[MMSエージェントインストール済のAMI ※]()からEC2インスタンスを作って、インスタンスにsshし<code>/etc/mongodb-mms/automation-agent.config</code> のREPLACEとしている箇所に先ほどのGROUP IDとAGENT API KEYを入れてAMI再作成してください。ami-idはメモっておいてください。
※まにあわず。後ほど公開するかも。といってもmmsエージェントが入っているだけです。

## access_key, secret整え

これから作成するAWSアカウントにてIAMより環境構築用にAdministratorAccessポリシーなどを付与したユーザを作成しawscliやterraformが使えるように<code>aws configure</code>しておいてください。

## ドメインの登録

mms上でmongocをインストールする際、CNAMEが必須のため、あらかめドメイン登録があると良いです。今回はRoute53のレジストラを使ってumiyosh.comというのをでっちあげました。金がもったいないなどの場合はGIPなどでもだいじょぶなはずです（後付の変更ができないので構成変更などできないなどになったりしますのでほんとお試し版という感じです）。

## terraform cloneして必要なところを追記する

すぐ動きそうなterraformをうｐしたのでそれをcloneしてきます。

``` bash
% git clone https://github.com/umiyosh/mmsInstall.git 
% cd mmsInstall
% vi variable.tf
```

variable.tfを書き換えます。REPLACEとしている<code>VPC ID</code>や<code>ZONE ID</code>や<code>hosted_zone</code>や<code>SUBNET ID</code>や<code>AMI ID(先ほど自分でさくせいしたやつ)</code>などを書き換えていきます。

## terraform plan

terraform操作するローカルcliで以下の環境変数をexportしておいてください。

``` bash
% export AWS_DEFAULT_REGION=ap-northeast-1
% export AWS_SECRET_ACCESS_KEY=シークレットアクセスキーに置き換えてください
% export AWS_ACCESS_KEY_ID=アクセスキーに置き換えてください
```

作成するまえにplanしAWS上に作成されるリソースを見ましょう。terraformは初期構築するだけならラクですが操作を間違うと大事なリソースを消したりなどあるのでなにもないAWSアカウントでやるのが良いです。

``` bash
% terraform plan --refresh=false
The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed.

Note: You didn't specify an "-out" parameter to save this plan, so when
"apply" is called, Terraform can't guarantee this is what will execute.

+ aws_iam_instance_profile.test_profile
    arn:              "" => "<computed>"
    create_date:      "" => "<computed>"
<<省略>>
```

こんな感じのが出てくればOKです。

## terraform apply

先にIAMリソースを作成しないとインスタンス作成時にIAM profileが存在しないのでインスタンス作成に失敗するという微妙問題があるみたいなので<code>-target</code>でIAMリソースを先に作成しておきます。あと有効になるのに
ちょっと時間を置く必要があるので時間をおきます。

``` bash
% terraform plan -target=aws_iam_role.test_role -target=aws_iam_role_policy.test_policy -target=aws_iam_instance_profile.test_profile --refresh=false
% terraform apply -target=aws_iam_role.test_role -target=aws_iam_role_policy.test_policy -target=aws_iam_instance_profile.test_profile
```

applyしリソースを作成します

``` bash
% terraform apply
```

MongoDB Cloud Managerの<code>Deployment → SERVERS → tileボタン</code>に作成したMMS Agentが登録されていればOKです。

## MongoDB Cloud Manager APIで作成

MongoDB Cloud Managerでポチポチやっても良いのですが、MMS APIで今回はやってみたいと思います。
<code>MongoDB Cloud Manage Settings → Group Settings → Enable Public API</code> を<code>YES</code>にします。
おなじく<code>MongoDB Cloud Manage Settings → Public API Access</code> よりAPI KeyをGenerateします。API KeyはPOST時に使うのでメモって置いてください。以下のようにcurlコマンドで疎通を確認します。

``` bash
% curl -u "<user@example.net>:<api_key>" --digest -i "https://cloud.mongodb.com/api/public/v1.0?pretty=true"
```

この環境だとprivate_ipを細かく切ってないのでMongoDB Cloud Manager側でどれがmongod,mongoc,mongosなのか判別つかないですね。ここを自動でやる良い方法ないか考えたのですが思いつかんかったです。Tag Nameには種別かいてあるのでawscliでがばっと取ってきてめもってshard.jsonに反映してください。例によってREPLACEと書かれたところとmongocのalias を変えてください。

``` bash
% aws ec2 describe-instances --profile umiyosh --filter "Name=instance-state-name,Values=running"| jq '.Reservations[].Instances[] | {PrivateDnsName,Tags }' -c
```

``` bash
% vi shard.json
% curl -u "<user@example.net>:<api_key>" -H "Content-Type: application/json" "https://cloud.mongodb.com/api/public/v1.0/groups/<group_id>/automationConfig" --digest -i -X PUT --data @shard.json
```

<code>Deployment Pcocess</code>を見るとデプロイされていると思います。


## shard確認

２つたてたmongosのうちどっちかにsshしてDBを作って enableshardingしたりして味見すると良いでしょう。

``` bash
% /var/lib/mongodb-mms-automation/mongodb-linux-x86_64-3.0.6/bin/mongo --host localhost --port 27000
```