kakakakakku blog

Weekly Tech Blog: Keep on Learning!

OpenSearch Service に入門できるチュートリアル「Creating a search application with Amazon OpenSearch Service」を LocalStack で試そう

Amazon OpenSearch Service に入門したいな〜💡っていうときに活用できる公式チュートリアル「Creating a search application with Amazon OpenSearch Service」を最近仕事で紹介する機会があって,今回改めて自分でも試しつつ,さらに LocalStack で動かせるようにしてみた❗️

Amazon OpenSearch Service に入門したいけどコストが気になる〜という話をたまに聞くことがあって,LocalStack なら AWS アカウントがなくてもローカル環境でサクッと試せるので便利なのだ💪

docs.aws.amazon.com

何をするか

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 にまとめてある❗️

github.com

👾 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 を使ってみたら良いかも〜😀