本記事は、AWS Jr.Champions Adventcalendar 2024 19日目の記事になります。
はじめに
みなさんは Amazon OpenSearch Serviceを使用したまたはご存知ありますでしょうか。
Amazon OpenSearch Serviceとは、ログ分析、リアルタイム検索、ベクトル検索、RAGなどを安全に行うことが出来るAWSサービスです。
詳細は下記を参照ください!
そんなAmazon OpenSearch Serviceですが、私もベクトル検索を使用したシステム開発をした際にAmazon OpenSearch Serviceのお世話になり、苦しめられ、悩まされましたので、今回は特に苦労した接続部分について、ご紹介出来ればと思います。
遭遇した権限接続エラーについて
早速ですが、皆さんこのようなエラーに遭遇したことありますでしょうか?
{
"type": "security_exception",
"reason": "no permissions for [indices: data/read/search] and User [name=arn:aws:iam::XXXXXXXXXXXX: role/hogehuga1234567890,backend_roles=[name=arn:aws:iam::XXXXXXXXXXXX: role/hogehuga1234567890], requestedTenant=null]"
}
上記は、実際にLambdaからAmazon OpenSearch Serviceにリクエストを送った際にレスポンスとして返ってきた結果になります。
エラーの中身を見てみると、no permissionsと記載があるので何となく権限がないのだろう。そして、ロールについても記載されているのでロール関連の権限エラーだろうということが推測されます。
原因1
LambdaのロールがAmazon OpenSearch Serviceのきめ細かなアクセスコントロールに設定されていなかった。
原因2
きめ細かなアクセスコントロールに設定できるロールは1つだけということを知らずに複数設定していた。(マネージドコンソール上で複数回設定すると、上書きされるため最後に設定したロールが機能します。)
背景
そのため、原因1が分かってからひとまずマネージドコンソール上のきめ細かなアクセスコントロールで2つのロール(ロール:Post Lambda用とロール:Get Lambda用)を設定し動作確認しても、どちらか一方のLambdaは最初n紹介したエラーのレスポンスしか返ってきませんでした。
Amazon OpenSearch Serviceの権限&接続部分について
解消方法
原因1の解消方法について
CDK上できめ細かなアクセスコントロールに設定したいロールを実装してあげることで解消しました。
原因2の解消方法について
2つあったロールを1つのロールにまとめることで、両方のLambda(Post LambdaとGet Lambda)からAmazon OpenSearch Serviceにアクセスすることが出来ました。
(これがベストプラクティスでないかもしれませんが、、、)
おわりに
Amazon OpenSearch Serviceに限らず、AWSの権限エラーは中々原因を解消するのに時間がかかります。特に、Amazon OpenSearch Serviceのような馴染みのないサービスだと、とても苦労します。
ですが、権限周りはAWSを使用する上で避けては通れない道なので、これからもドキュメントと睨めっこしていきたいと思います。
この記事が少しでも参考になったら幸いです!!!