ハトネコエ Web がくしゅうちょう

プログラミングやサーバー・Web制作、チームマネジメントなど得た技術のまとめ

Amazon OpenSearch Service を使ってみてハマったところまとめ

Amazon OpenSearch Service を導入しようとしてハマったところをまとめます。
記事を残してくれた数多くの人に感謝です。

ハマったところいっぱいあったんですが、
逐一メモっていなかったので思い出した順に書いていきます。

↓ 前回の Amazon OpenSearch Service 関連の記事

nekonenene.hatenablog.com

CloudWatch Logs を OpenSearch に送る Lambda 処理でエラーが出る件

f:id:nekonenene:20211113064330p:plain

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 を当ててあげると解決するらしいので修正。

f:id:nekonenene:20211113065312p:plain

ちなみに、Backend role だけ割り当てると次に紹介するエラーが起こるので注意。

とりあえず上手くいって、じゃあ次に他のロググループからも同様に OpenSearch にデータを送ろうと思いました。
同名の Lambda は作れないので、最初と違って
『Create Amazon OpenSearch Service subscription filter』ではなく
『Lambda サブスクリプションフィルターを作成』を選ぶ点に注意。

f:id:nekonenene:20211113065658p:plain

じゃあそれで作成して上手くいくかと思いきや、以下のエラーが!
原因が……わからない……!!!

{
    "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 なのにエラー……なかなか奥が深い状態です。

しばらく謎だったんですが、
こちら ↓ の記事が解答に導いてくれました。

qiita.com

複数の type を送れないようです。

ここを記事にあるように書き換えても、ロググループの名称は @log_group から取得できるのでご安心ください。

f:id:nekonenene:20211113070141p:plain

AWS コンソールから見られない箇所がある

AWSコンソールで OpenSearch Service の「クラスターの状態」が表示されない問題がありました。
とはいえ、これは明らかに権限エラーだと表示されていたのですぐ解決できました。

OpenSearch の Role の all_access に、IAMユーザー名を User としてマッピングすれば解決です。

こういうの。
arn:aws:iam::123456781234:user/nekonenene

f:id:nekonenene:20211113070654p:plain

ただ、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で書かなければならず、マジでよくわかんなかったです。

この2つの記事のおかげで、無事に設定ができました。

Kibana を使ったことある方なら知っていることも多いんでしょうが、
自分は経験ないので大変でした。なんとか、なんとなくでやってます……ムズい……。
ようやくいろいろが終わって、データ分析に使えそうです。