Amazon EC2でsolr cloudを構築してみる

solr cloudのバージョンUP検証をAmazon EC2を利用してやってみる。
<span class="red">※実行するとEC2の利用料金が掛かります。</span> 
[利用料金詳細はこちら](https://aws.amazon.com/jp/ec2/pricing/ "EC2料金")

## 必要なもの
+ AWSアカウント／Amazon EC2 のシークレットキー／キーペア

+ Amazon VPC(172.31.0.0/16)
VPCの作成はプロビジョニング対象から外しています

+ 以下、使用するツールのインストール

## 使用するツール
+ [TerraForm](https://www.terraform.io/ "TerraForm") 
インフラ(EC2)のセットアップを行う

+ [Ansible](http://docs.ansible.com/ansible/ "Ansible")　
アプリのセットアップ行う

## 手順
1. EC2のセットアップ(2台)

1. EC2インスタンスへsolr cloudセットアップ

## EC2セットアップ
TerraformでEC2のプロビジョニングを行う。
[サンプルソース](https://github.com/Thirosue/terraform-sample/tree/master/aws_ec2/ "サンプルソース")   

+ tfファイルを作成  
プロビジョニング設定の.tfファイルを作成する  

```
variable "access_key" {}
variable "secret_key" {}

provider "aws" {
    access_key = "${var.access_key}"
    secret_key = "${var.secret_key}"
    region = "ap-northeast-1"
}

resource "aws_instance" "solr1" {
    ami = "ami-b1b458b1"
    key_name = "devenv-key"
    instance_type = "t2.small"
    vpc_security_group_ids = [
        "${aws_security_group.allow_local.id}"
    ]
    private_ip = "172.31.1.1"
}

resource "aws_instance" "solr2" {
    ami = "ami-b1b458b1"
    key_name = "devenv-key"
    instance_type = "t2.small"
    vpc_security_group_ids = [
        "${aws_security_group.allow_local.id}"
    ]
    private_ip = "172.31.1.2"
}

resource "aws_security_group" "allow_local" {
    name = "allow_local"
    description = "Allow Only Local traffic"
    ingress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["xxx.xxx.xxx.xxx/32","172.31.0.0/16"]
    }
    egress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }
}
```
※ securityグループでインターネット接続元のGrobal IPとVPC内の接続のみ許可

+ tfvarsファイルを作成  
AWS CLIを利用できるようにアクセスキー／シークレットキーを.tfvarsに記載する  

```
access_key="[AWS accessKeyを記載]"
secret_key="[AWS secretKeyを記載]"
```

+ EC2のプロビジョニングを検証

```sh
terraform plan -var-file=secret.tfvars
```

+ EC2のプロビジョニングを実行

```sh
terraform apply -var-file=secret.tfvars
```

## Solr Cloud構築
AnsibleでSolr Cloudの構築を行う。
[サンプルソース](https://github.com/Thirosue/ansible-samples/tree/master/solr-cloud-aws/ "サンプルソース")  

+ hostsの作成

```
[solr]
solr1 ansible_ssh_host=[AWSで払い出されたGrobal Ipを記載] ansible_ssh_user=ec2-user local_ip=172.31.1.1 myid=1
solr2 ansible_ssh_host=[AWSで払い出されたGrobal Ipを記載] ansible_ssh_user=ec2-user local_ip=172.31.1.2 myid=2
```  

+ ymlの作成  
アプリセットアップ用のyml作成

```yml
- hosts: solr
  become: yes
  vars:
    solr_version: 6.0.1
    zookeeper_version: 3.4.8
  tasks:a
    - name: wget install
      yum: name=wget state=installed

    - name: jdk download #headerを利用し、認証スキップ
      shell: 'wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm'
      when: install_skip is undefined

    - name: jdk install
      shell: rpm -ivh jdk-8u91-linux-x64.rpm
      when: install_skip is undefined

    - name: solr dowonload
      get_url: url=http://archive.apache.org/dist/lucene/solr/{{solr_version}}/solr-{{solr_version}}.tgz dest=/opt/ mode=0755
      when: install_skip is undefined

    - name: solr unarchive
      unarchive: src=/opt/solr-{{solr_version}}.tgz dest=/opt/ copy=no

    - name: zookeeper dowonload
      get_url: url=http://ftp.jaist.ac.jp/pub/apache/zookeeper/zookeeper-{{zookeeper_version}}/zookeeper-{{zookeeper_version}}.tar.gz dest=/opt/ mode=0755
      when: install_skip is undefined

    - name: zookeeper unarchive
      unarchive: src=/opt/zookeeper-{{zookeeper_version}}.tar.gz dest=/opt/ copy=no
      when: install_skip is undefined

    - name: create zookeeper data dir
      file: path=/var/zookeeper state=directory owner=root

    - name: write myid file #zookeeper myidファイル作成
      template: src=myid dest=/var/zookeeper

    - name: setting zookeeper conf ##zookeeper設定ファイル作成
      template: src=zoo.cfg dest=/opt/zookeeper-{{zookeeper_version}}/conf/
```

+ セットアップ実行（※AWSキーペアを用意しておくこと）

```sh
ansible-playbook -i hosts --private-key=devenv-key.pem provisioning.yml -v
```  

+ solr cloud起動  

```sh
#zookeeper起動
/opt/zookeeper-{{zookeeper_version}}/bin/zkServer.sh start
#solr起動
/opt/solr-{{solr_version}}/bin/solr start -c -z 172.31.1.1:2181,172.31.1.2:2181
```  

+ solr セットアップ  
割愛（※以下、Solr APIを利用してセットアップ）  
[Collection API](https://cwiki.apache.org/confluence/display/solr/Collections+API/ "Collection API")　  

## EC2インスタンスの削除
TerraformでEC2の削除を行う。

+ 検証

```bash
terraform plan -destroy -out=./terraform.tfstate -var-file=secret.tfvars
```

+ EC2インスタンスの削除実行

```bash
terraform apply ./terraform.tfstate
```

## 最後に
cloud、toolを使えば、サクッと様々なバージョンの挙動が検証できました。
今回はawsの勉強も兼ねているため、vagrantではなくec2を利用してみました。