Amazon OpenSearch Service を使ってみてハマったところまとめ
Amazon OpenSearch Service を導入しようとしてハマったところをまとめます。
記事を残してくれた数多くの人に感謝です。
ハマったところいっぱいあったんですが、
逐一メモっていなかったので思い出した順に書いていきます。
↓ 前回の Amazon OpenSearch Service 関連の記事
CloudWatch Logs を OpenSearch に送る Lambda 処理でエラーが出る件
『CloudWatch Logs データの Amazon OpenSearch Service へのストリーミング - Amazon CloudWatch Logs』に従って進めて、
CloudWatch から OpenSearch Service にログを流すサブスクリプションフィルターを作ったあと、
最初はまずログが出せなくて困りました。
Lambda の Role に AWSLambdaBasicExecutionRole Policy をアタッチして解決しました。
いつも Lambda を新規作成する場合は勝手に作られるからその作業抜けてた。
で、ログ出すようになったら困ったのが以下のようなエラーが出ること。
どうも権限周りの話らしい。
{ "errorType": "Error", "errorMessage": "{\"statusCode\":403,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456781234:role/ControlOpenSearchTestFromLambda, backend_roles=[arn:aws:iam::123456781234:role/ControlOpenSearchTestFromLambda], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456781234:role/ControlOpenSearchTestFromLambda, backend_roles=[arn:aws:iam::123456781234:role/ControlOpenSearchTestFromLambda], requestedTenant=null]\"},\"status\":403}}", "stack": [ "Error: {\"statusCode\":403,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456781234:role/ControlOpenSearchTestFromLambda, backend_roles=[arn:aws:iam::123456781234:role/ControlOpenSearchTestFromLambda], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456781234:role/ControlOpenSearchTestFromLambda, backend_roles=[arn:aws:iam::123456781234:role/ControlOpenSearchTestFromLambda], requestedTenant=null]\"},\"status\":403}}", " at _homogeneousError (/var/runtime/CallbackContext.js:12:12)", " at postError (/var/runtime/CallbackContext.js:29:54)", " at done (/var/runtime/CallbackContext.js:58:7)", " at fail (/var/runtime/CallbackContext.js:70:7)", " at Object.fail (/var/runtime/CallbackContext.js:106:16)", " at /var/task/index.js:43:25", " at IncomingMessage.<anonymous> (/var/task/index.js:177:13)", " at IncomingMessage.emit (events.js:326:22)", " at endReadableNT (_stream_readable.js:1241:12)", " at processTicksAndRejections (internal/process/task_queues.js:84:21)" ] }
https://aws.amazon.com/jp/premiumsupport/knowledge-center/opensearch-troubleshoot-cloudwatch-logs を読んだら解決方法が書いてあって、
OpenSearch の管理画面から all_access
Role に User と Backend role の両方で
AWS Role を当ててあげると解決するらしいので修正。
ちなみに、Backend role だけ割り当てると次に紹介するエラーが起こるので注意。
とりあえず上手くいって、じゃあ次に他のロググループからも同様に OpenSearch にデータを送ろうと思いました。
同名の Lambda は作れないので、最初と違って
『Create Amazon OpenSearch Service subscription filter』ではなく
『Lambda サブスクリプションフィルターを作成』を選ぶ点に注意。
じゃあそれで作成して上手くいくかと思いきや、以下のエラーが!
原因が……わからない……!!!
{ "errorType": "Error", "errorMessage": "{\"statusCode\":200,\"responseBody\":{\"took\":6,\"errors\":true}}", "stack": [ "Error: {\"statusCode\":200,\"responseBody\":{\"took\":6,\"errors\":true}}", " at _homogeneousError (/var/runtime/CallbackContext.js:12:12)", " at postError (/var/runtime/CallbackContext.js:29:54)", " at done (/var/runtime/CallbackContext.js:58:7)", " at fail (/var/runtime/CallbackContext.js:70:7)", " at Object.fail (/var/runtime/CallbackContext.js:106:16)", " at /var/task/index.js:43:25", " at IncomingMessage.<anonymous> (/var/task/index.js:177:13)", " at IncomingMessage.emit (events.js:412:35)", " at endReadableNT (internal/streams/readable.js:1317:12)", " at processTicksAndRejections (internal/process/task_queues.js:82:21)" ] }
ステータスコードが 200 なのにエラー……なかなか奥が深い状態です。
しばらく謎だったんですが、
こちら ↓ の記事が解答に導いてくれました。
複数の type を送れないようです。
ここを記事にあるように書き換えても、ロググループの名称は @log_group
から取得できるのでご安心ください。
AWS コンソールから見られない箇所がある
AWSコンソールで OpenSearch Service の「クラスターの状態」が表示されない問題がありました。
とはいえ、これは明らかに権限エラーだと表示されていたのですぐ解決できました。
OpenSearch の Role の all_access に、IAMユーザー名を User としてマッピングすれば解決です。
こういうの。 arn:aws:iam::123456781234:user/nekonenene
ただ、IAMユーザーを1つずつ割り当てるのは面倒なので、
IAM Role と IAM Group を活用していい感じに出来るのでは、などと思ったりします。
Amazon OpenSearch Service のヘルスエラー
これはあるあるのようですが、
『Elasticsearchのshardとreplica - なんかかきたい』の記事にあるように、
デフォルトだと number_of_shards
の数が多いために
『割り当てられていないシャード』が多く発生し、
AWSコンソールで Amazon OpenSearch Service のヘルスエラーが表示されます。
対応は簡単で、Dev Tools から例えば
POST _template/cwl-2021.11.12 { "index_patterns": ["cwl-*"], "order": 1, "settings": { "index": { "number_of_shards" : 2 } } }
のようにおこない、 number_of_shards を減らします。
もちろん、本番運用でなくテスト運用の場合です。
本番運用する場合のオススメの設定については AWS が書いているので、以下の記事を参考にしましょう。
Amazon Elasticsearch Service ドメインを設定するベストプラクティス | Amazon Web Services ブログ
インデックスの登録場所がわかりにくい
Stack Management > Index patterns の順に進みます。
未来の自分も忘れそう。
インデックスの自動削除(Rotation)の仕方がわからない
Index Management > State management policies のページでポリシーを作成するのですが、
JSONで書かなければならず、マジでよくわかんなかったです。
- Amazon OpenSearch Service でのインデックスステート管理 - Amazon OpenSearch Service
- SIEM on Amazon ES で生成されるインデックスに対して Index State Management を使ったライフサイクル設定をしてみた | DevelopersIO
この2つの記事のおかげで、無事に設定ができました。
Kibana を使ったことある方なら知っていることも多いんでしょうが、
自分は経験ないので大変でした。なんとか、なんとなくでやってます……ムズい……。
ようやくいろいろが終わって、データ分析に使えそうです。