Amazon OpenSearch Service に入門したいな〜💡っていうときに活用できる公式チュートリアル「Creating a search application with Amazon OpenSearch Service」を最近仕事で紹介する機会があって,今回改めて自分でも試しつつ,さらに LocalStack で動かせるようにしてみた❗️
Amazon OpenSearch Service に入門したいけどコストが気になる〜という話をたまに聞くことがあって,LocalStack なら AWS アカウントがなくてもローカル環境でサクッと試せるので便利なのだ💪
何をするか
Amazon API Gateway と AWS Lambda 関数で Amazon OpenSearch Service から「映画」の検索結果を返す API を実装する🎥さらに簡易的なウェブサイトから API を実行して検索結果を表示する.ザッとアーキテクチャ図を描くと以下のようになる.
手順
チュートリアルの手順は以下のような感じ📝 Amazon OpenSearch Service ドメインをセットアップしてある前提になっているけど,今回は AWS SAM (AWS CloudFormation) でセットアップする.あと LocalStack で試すため IAM 関連は細かく気にしなくて OK👌
- Step 1: Index sample data
- Step 2: Create and deploy the Lambda function
- Step 3: Create the API in API Gateway
- Step 4: (Optional) Modify the domain access policy
- Step 5: Test the web application
追加課題
チュートリアルを楽しむために今回は個人的な追加課題として以下にも取り組んだ💪
- LocalStack で動かせるようにする
- AWS Lambda 関数のランタイムを Python 3.9 → Python 3.12 に変更する
- マネジメントコンソールを使わずに AWS SAM でデプロイする
- AWS Lambda 関数コードの Amazon OpenSearch Service ドメイン設定を環境変数経由にする
試したコードと手順は GitHub にまとめてある❗️
👾 template.yaml
AWS SAM で Amazon OpenSearch Service / Amazon API Gateway / AWS Lambda 関数をデプロイする.Amazon OpenSearch Service の詳細な設定はせず,単純にドメイン名のみ指定している👌
AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: OpenSearch: Type: AWS::OpenSearchService::Domain Properties: DomainName: movies Function: Type: AWS::Serverless::Function Properties: FunctionName: opensearch-function CodeUri: ./src Handler: app.lambda_handler Runtime: python3.12 Architectures: - x86_64 Environment: Variables: DOMAIN_ENDPOINT: !Sub http://${OpenSearch.DomainEndpoint} Events: Api: Type: Api Properties: Method: GET Path: / Outputs: ApiId: Value: !Ref ServerlessRestApi
👾 src/app.py
AWS Lambda 関数コードは基本的にそのまま使いつつ,Amazon OpenSearch Service ドメイン設定を書き換える部分は環境変数で自動的に設定されるようにした✔️
-host = '' # The OpenSearch domain endpoint with https:// and without a trailing slash +host = os.environ['DOMAIN_ENDPOINT'] # The OpenSearch domain endpoint with https:// and without a trailing slash
動作確認
LocalStack を起動して,Amazon OpenSearch Service / Amazon API Gateway / AWS Lambda 関数をデプロイする.
$ samlocal build $ samlocal deploy
そして curl
コマンドで映画データセットを投入して,Amazon API Gateway に HTTP リクエストを送信するウェブサイトの JavaScript を修正すれば OK👌
$ curl -X POST -s -H 'Content-Type: application/json' http://movies.ap-northeast-1.opensearch.localhost.localstack.cloud:4566/_bulk \ --data-binary @datasets/sample-movies.bulk
以下は iron man
と検索した結果で Amazon OpenSearch Service を使った検索アプリケーションを LocalStack で動かせた❗️
やったー \( 'ω')/
Amazon OpenSearch Service に入門したいけどコストが気になる〜という場合は LocalStack を使ってみたら良いかも〜😀