こんにちは、アスクルのユウです。
Amazon OpenSearch ServiceにSudachiプラグインのカスタム辞書をインポートする際に、予想外の問題に遭遇しました。
今回はその問題と解決方法について記載します。
概要
Amazon OpenSearch ServiceにS3へアップロードしたSudachiプラグインのカスタム辞書をインポートしようとしました。
しかし、ステータスが コピーに失敗しました(ステータスにフォーカスすると Internal Error)になりエラーが発生しました。
また、CSV形式のカスタム辞書はインポートできるものの、パッケージの参照パスが sudachi/ にならないという問題がありました。
そのため、バイナリ化した辞書をインポートする必要がありましたが、エラーが発生しました。
バイナリ化については Sudachiのチュートリアル を参考に実施しています。
構成
- Amazon OpenSearch Service v3.3
- sudachi-0.7.5-executable.zip
- sudachi-dictionary-20250825-core.zip
問題の原因
バイナリ化した辞書をOpenSearchにインポートする場合、Content-Typeが binary/octet-stream である必要があります。
しかし、S3にアップロードした辞書ファイルのContent-Typeが binary/octet-stream 以外になっていたため、インポート時にエラーが発生していました。
また、binary/octet-stream でないといけない制限は公式ドキュメントに記載がありませんでした。
そのため、AWSサポートに問い合わせたところ、Content-Typeが binary/octet-stream でないとエラーになるとの回答をいただきました。
解決方法
1. Content-Typeの確認
まず、S3にアップロードされている辞書ファイルのContent-Typeを確認します。
aws s3api head-object \ --bucket [bucket_name] \ --key user_custom.dic \ --region ap-northeast-1 \ --query 'ContentType' \ --output text
2. Content-Typeの変更
Content-Typeが binary/octet-stream でない場合は、次のコマンドで変更します。
aws s3 cp \ s3://[bucket_name]/user_custom.dic \ s3://[bucket_name]/user_custom.dic \ --content-type "binary/octet-stream" \ --metadata-directive REPLACE \ --region ap-northeast-1
上記コマンドを実行後、再度OpenSearchで正常にインポートできました。
アップロード時の対応
アップロードするタイミングでContent-Typeを指定することで、この問題を回避できます。
aws s3 cp \ ./user_custom.dic \ s3://[bucket_name]/user_custom.dic \ --content-type "binary/octet-stream"
最後に
S3にファイルをアップロードする際には、Content-Typeを意識する必要があることを改めて学びました。
特にバイナリファイルを扱う場合は、適切なContent-Typeを設定することが重要です。
同じような問題に遭遇した方の参考になれば幸いです。
それでは。