4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CloudSearchのIndexingをsh化する

Last updated at Posted at 2018-04-16

やったこと

案件を立ち上げる際に毎回マネージメントコンソールより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化すること!**をやっていきたい。

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

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?