CloudSearchのIndexingをsh化する

## やったこと
案件を立ち上げる際に毎回マネージメントコンソールよりCloudSearchのIndexingを登録していて、時間と手間がかかるので今回を機にShellScriptにて実行できるようにする。
あくまでもIndexingだけをsh化する。

## 事前準備
### 1. aws-cliのインストール
Amazon Linuxの場合、Defaultでインストールされているはずです。

```
$ sudo pip install awscli
```
### 2. インストール確認
```
$ aws --version

 ↓　バージョンが確認できればOK

aws-cli/1.11.83 Python/2.7.12 Linux/4.9.77-31.58.amzn1.x86_64 botocore/1.5.46
```
### 3. Access Key, Secret Keyの発行
マネージメントコンソールのIAMよりAccess Key, Secret Keyを発行する

![スクリーンショット 2018-04-16 20.22.16.png](https://qiita-image-store.s3.amazonaws.com/0/72180/77b7122c-c41d-74f9-6e6e-a810dddd5a49.png)

### 4. aws configure設定
コマンドラインよりAWSにアクセスするための、アカウントの認証情報を登録する

```
$ aws configure
AWS Access Key ID [None]: アクセスキー
AWS Secret Access Key [None]: シークレットキー
Default region name [None]: リージョン　※Tokyoリージョンの場合は「ap-northeast-1」
Default output format [None]: json　※今回はjsonを指定　textなども設定可
```

### 5. CloudSearch構築
マネージメントコンソールより箱のみを作成する。
検索カラムなどの設定は不要。
次へ次へと進むのみでOK。

## ココからが本題
ようやくコマンドラインよりAWSへのアクセスができるようになりましたので、これからIndexingするためのShellScriptと実行する際に必要なjsonファイルを作っていきます。



## ShellScript作成＆jsonファイル作成
### import.sh作成
Indexingしたい項目の設定が記載されているjsonファイルを読み込み、ファイル数分ループ処理を行う。
１ファイルでも良かったが、案件によってIndexingしたい項目、外したい項目、増やしたい項目がある可能性があるため１ファイルずつとした。

また案件毎にDomain Nameが異なるため、毎回ShellScriptの中身を編集するのも手間なので引数でIndexingを行う対象Domain Nameを指定できるようにする。


**import.sh**

```
CMDNAME=`basename $0`
DIRNAME=`cd $(dirname $0) && pwd`

files=$DIRNAME"/jsons/*"
for filepath in $files; do
  aws cloudsearch define-index-field --domain-name $1 --cli-input-json file://$filepath
done
aws cloudsearch index-documents --domain-name $1

```
### jsonファイル（サンプル）
サンプルとして投稿データを検索対象とするために、タイトル（caption）、掲載ステータス（status）をIndexingするためのjsonファイルを作る。

**caption.json**

```json
{
    "IndexField": {
        "TextOptions": {
            "SortEnabled": true,
            "HighlightEnabled": true,
            "ReturnEnabled": true,
            "AnalysisScheme": "_ja_default_"
        },
        "IndexFieldType": "text",
        "IndexFieldName": "caption"
    }
}
```
**status.json**

```json
{
    "IndexField": {
        "IntOptions": {
            "FacetEnabled": true,
            "SortEnabled": true,
            "SearchEnabled": true,
            "ReturnEnabled": true
        },
        "IndexFieldType": "int",
        "IndexFieldName": "status"
    }
}
```

## 実行
コマンドラインよりShellScriptを実行する。
実行後はjsonファイルの中身が出力され、エラーが無ければOK。

```
$ /bin/bash /var/www/[docroot]/aws/cloudsearch/indexing/import.sh [domain name]

{
    "IndexField": {
        "TextOptions": {
            "SortEnabled": true,
            "HighlightEnabled": true,
            "ReturnEnabled": true,
            "AnalysisScheme": "_ja_default_"
        },
        "IndexFieldType": "text",
        "IndexFieldName": "caption"
    }
}

{
    "IndexField": {
        "IntOptions": {
            "FacetEnabled": true,
            "SortEnabled": true,
            "SearchEnabled": true,
            "ReturnEnabled": true
        },
        "IndexFieldType": "int",
        "IndexFieldName": "status"
    }
}
```

## 確認
マネージメントコンソールよりIndexingの確認をする。
jsonファイル内で記載した「IndexFieldType」「IndexFieldName」などが反映されていることを確認

![スクリーンショット 2018-04-16 21.11.12.png](https://qiita-image-store.s3.amazonaws.com/0/72180/ea9deea0-e448-4de4-22a6-95154ffadcc9.png)


## まとめ
今回サンプルとして２カラムのみのIndexingとしましたが、本来は20~30カラムぐらいあり、それを毎回手動で登録していたことを考えると、**「作業効率は格段によくなりました！」**

ShellScriptはIndexingする項目のjsonファイルをループで読み込んでいるため、追加したいものがあればjsonファイル追加するだけで、ShellScript自体の修正は不要です。

## 今回できなかったこと
本当であればCloudSearchの箱を構築するところから全てShellScriptで実施したかったのですが、CloudSearchの箱を構築する際に使用できるまで１０〜２０分ぐらい待たないとならない点や、その時間をShellScriptで待機させる点などを調べる時間がなく断念。
今後はCloudSearchの構築をイチから全てできるようにしていきたい（時代はElasticsearchですかねｗ？）
また別件ですが、**CloudFrontのBehaviorも同じようにsh化すること！**をやっていきたい。


少しでも参考になれば嬉しいです！
ありがとうございました！！