使用Terraform和MongoDB云管理器批量创建分片

这篇文章是关于MongoDB Advent Calendar 2015 – Qiita第14天的文章。
今天由于个人原因有点虚弱,但我还是想迅速写下来。
因为在工作中多次创建了MongoDB验证环境,所以我想写下使用类似步骤的MongoDB Cloud Manager在AWS上创建试用MongoDB分片集群的步骤。

创建mms账号

MongoDB Cloud Manager – 便捷的管理| 在MongoDB上创建免费账户。您可以获得一个为期30天的试用账户。
请在“设置”→“分组设置”中记录GROUP ID和AGENT API KEY。

创建密钥对

从EC2仪表板创建密钥对,并在本地计算机的~/.ssh/和~/.ssh/config中准备好连接信息。

重新创建AMI并填写ID

从已安装了MMS代理的AMI中创建EC2实例,然后SSH到实例并将先前提到的GROUP ID和AGENT API KEY作为”etc/mongodb-mms/automation-agent.config”的REPLACE部分,然后重新创建AMI。请记住AMI-ID。
备注:请务必记住。稍后可能会公开。即使只有mms代理被安装。

access_key, secret整え

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

域名注册

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

使用 Terraform 克隆并添加必要的配置信息。

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

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

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

进行 Terraform 计划

请在使用Terraform本地CLI时导出以下环境变量。

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

在创建之前,我们应该先计划并查看在AWS上将要创建的资源。虽然使用Terraform进行初始配置很方便,但如果操作错误,可能会导致删除重要的资源等问题,因此最好在一个空的AWS账户上进行操作。

% 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>"
<<省略>>

如果能一点点这样的感觉就可以了。

执行terraform应用

如果不先创建IAM资源,那么在创建实例时会遇到一个微妙的问题,即IAM配置文件不存在而导致实例创建失败。因此,我们会使用-target参数来先创建IAM资源。另外,需要等待一段时间才能生效,所以请等待一下。

% 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

创建一个应用程序资源。

% terraform apply

如果在 MongoDB Cloud Manager 的 Deployment → SERVERS → tile 按钮中注册了创建的 MMS Agent,那就可以了。

使用MongoDB Cloud Manager API进行创建

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

% 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的别名。

% aws ec2 describe-instances --profile umiyosh --filter "Name=instance-state-name,Values=running"| jq '.Reservations[].Instances[] | {PrivateDnsName,Tags }' -c
% 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

观察到Deployment Process,我认为已经部署完成。

确认碎片

你可以选择其中一台 mongos 服务器使用 SSH 登录并创建数据库,执行 enablesharding 等操作进行尝试。

% /var/lib/mongodb-mms-automation/mongodb-linux-x86_64-3.0.6/bin/mongo --host localhost --port 27000
广告
将在 10 秒后关闭
bannerAds