やったこと

案件を立ち上げる際に毎回マネージメントコンソールより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

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ファイルを読み込み、ファイル数分ループ処理を行う。
1ファイルでも良かったが、案件によってIndexingしたい項目、外したい項目、増やしたい項目がある可能性があるため1ファイルずつとした。

また案件毎に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

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

status.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

まとめ

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

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

今回できなかったこと

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

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.