CFNでOpenSearch入門

目次

CloudFormationでOpenSearchに入門する構成

OpenSearchはElasticsearchからフォークして作成された検索および分析スイートです。
今回は入門ということで、CloudFormationを使用してOpenSearchの基本的な環境を構築します。

構築する環境

Diagram of introduction to OpenSearch with CloudFormation.

OpenSearchドメインを作成します。
AWS公式チュートリアルで紹介されている構成を再現します。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/gsgcreate-domain.html

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/042

テンプレートファイルのポイント解説

OpenSearchドメイン用テンプレート

Resources:
  Domain:
    Type: AWS::OpenSearchService::Domain
    Properties:
      AccessPolicies:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              AWS: "*"
            Action: es:*
            Resource: !Sub "arn:aws:es:${AWS::Region}:${AWS::AccountId}:domain/${DomainName}/*"
      AdvancedSecurityOptions:
        Enabled: true
        InternalUserDatabaseEnabled: true
        MasterUserOptions:
          MasterUserName: !Ref MasterUserName
          MasterUserPassword: !Ref MasterUserPassword
      ClusterConfig:
        DedicatedMasterEnabled: false
        InstanceCount: !Ref InstanceCount
        InstanceType: !Ref InstanceType
        WarmEnabled: false
        ZoneAwarenessEnabled: false
      CognitoOptions:
        Enabled: false
      DomainEndpointOptions:
        CustomEndpointEnabled: false
        EnforceHTTPS: true
        TLSSecurityPolicy: Policy-Min-TLS-1-0-2019-07
      DomainName: !Ref DomainName
      EBSOptions:
        EBSEnabled: true
        VolumeSize: !Ref VolumeSize
        VolumeType: gp2
      EncryptionAtRestOptions:
        Enabled: true
        KmsKeyId: !Ref Key
      EngineVersion: !Ref EngineVersion
      NodeToNodeEncryptionOptions:
        Enabled: true
Code language: YAML (yaml)

パラメータを順番に確認します。

AccessPoliciesプロパティでOpenSearchドメインに対するアクセスを制限を設定できます。
制限はIAMポリシー形式で設定します。
今回はマスターユーザーを作成し、ユーザー情報で認証を行います。
そのため本プロパティでは、作成するリソースに対して、全操作を許可する内容とします。

AdvancedSecurityOptionsプロパティでセキュリティに関するきめ細やかなアクセスコントロール(Fine-grained access control)に関する設定が行えます。
チュートリアルでは、OpenSearch内にマスターユーザーを作成し、そのユーザー情報を使用して認証を行う方法が紹介されています。
本プロパティはそれに準じる形で設定します。
具体的には、内部データベース(Internal User Database)を有効化し、作成するマスターユーザーのユーザー名とパスワードを設定します。

ClusterConfigプロパティは作成するOpenSearchドメインのスペックに関する設定が行えます。
OpenSearchの基盤を構成するインスタンスのタイプや台数、専用マスターノードの有無が設定可能です。
基本的にはチュートリアルの通りに設定しますが、今回はインスタンス数は1つとしました。

DomainEndpointOptionsプロパティで作成するOpenSearchドメインに関する設定が行えます。
今回のようにマスターユーザー情報を使用して認証、つまりきめ細やかなアクセスコントロールを有効化する場合、ドメインのHTTPS化は必須要件です。

きめ細かなアクセスコントロールには、OpenSearch または Elasticsearch 6.7 以降が必要です。また、ドメインへのすべてのトラフィックに HTTPS、保管時のデータの暗号化、およびノード間の暗号化を要求します。

きめ細かなアクセスコントロールの有効化

上記の要件に準じる形で設定を行います。
具体的には、本プロパティでHTTPS通信の強制化と、EncryptionAtRestOptionsおよびNodeToNodeEncryptionOptionsプロパティで暗号化を有効化します。
なおカスタムエンドポイントについては、チュートリアルの方針に従い有効化しません。

DomainNameプロパティで作成するOpenSearchドメインの名前を設定します。

EBSOptionsプロパティで先述のインスタンスが使用するストレージに関する設定が行えます。
こちらもチュートリアルに従い、gp2タイプのEBSを10GB確保する設定を行います。

EngineVersionプロパティで作成するOpenSearchのバージョンを設定します。
今回は最新バージョンである「OpenSearch_1.2」としました。

暗号化で使用するKMSキーの設定は以下の通りです。

Resources:
  Key:
    Type: AWS::KMS::Key
    Properties:
      Enabled: true
      KeyPolicy:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              AWS: "*"
            Action:
              - kms:Encrypt
              - kms:Decrypt
              - kms:ReEncrypt*
              - kms:GenerateDataKey*
              - kms:CreateGrant
              - kms:DescribeKey
            Resource: "*"
            Condition:
              StringEquals:
                kms:ViaService: !Sub "es.${AWS::Region}.amazonaws.com"
                kms:CallerAccount: !Ref AWS::AccountId
          - Effect: Allow
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
            Action: "*"
            Resource: "*"
          - Effect: Allow
            Principal:
              Service: es.amazonaws.com
            Action:
              - kms:Describe*
              - kms:Get*
              - kms:List*
            Resource: "*"
Code language: YAML (yaml)

OpenSearchに対してデフォルトで使用されるAWSマネージドキーを参考にして作成しました。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【CloudFormationのネストされたスタックで環境を構築する方法】 CloudFormationにおけるネストされたスタックを検証します。 CloudFormationでは、スタックをネストす...

今回作成された主要リソースの情報は以下の通りです。

  • OpenSearchドメイン名:fa-042
  • OpenSearchダッシュボードURL:https://search-fa-042-m2yc6j6kr63hqyhvqp6jwfim7a.ap-northeast-1.es.amazonaws.com/_dashboards
  • OpenSearchドメインエンドポイントURL:https://search-fa-042-m2yc6j6kr63hqyhvqp6jwfim7a.ap-northeast-1.es.amazonaws.com
  • マスターユーザーの名前:test
  • マスターユーザーのパスワード:P@ssw0rd

AWS Management Consoleからも、OpenSearchを確認します。

OpenSearch Details 1
OpenSearch Details 2
OpenSearch Details 3

CloudFormationテンプレートファイルでした通りに作成されています。

動作確認

チュートリアルに従って進めます。

まずサンプルデータのアップロードです。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/gsgupload-data.html

チュートリアルのデータをそのまま使用し、curlコマンドでアップロードします。
今回構築した構成に当てはめると以下のコマンドとなります。

$ curl -XPUT -u 'test:P@ssw0rd' 'https://search-fa-042-m2yc6j6kr63hqyhvqp6jwfim7a.ap-northeast-1.es.amazonaws.com/fa-042/_doc/1' -d '{"director": "Burton, Tim", "genre": ["Comedy","Sci-Fi"], "year": 1996, "actor": ["Jack Nicholson","Pierce Brosnan","Sarah Jessica Parker"], "title": "Mars Attacks!"}' -H 'Content-Type: application/json'
{"_index":"fa-042","_type":"_doc","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}
Code language: Bash (bash)

正常にアップロードできました。

続いてデータ検索です。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/gsgsearch.html

チュートリアルに従い、curlコマンドで検索を実行します。
今回構築した構成に当てはめると以下のコマンドとなります。

$ curl -XGET -u 'test:P@ssw0rd' 'https://search-fa-042-m2yc6j6kr63hqyhvqp6jwfim7a.ap-northeast-1.es.amazonaws.com/fa-042/_search?q=mars&pretty=true'
{
  "took" : 45,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "fa-042",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "director" : "Burton, Tim",
          "genre" : [
            "Comedy",
            "Sci-Fi"
          ],
          "year" : 1996,
          "actor" : [
            "Jack Nicholson",
            "Pierce Brosnan",
            "Sarah Jessica Parker"
          ],
          "title" : "Mars Attacks!"
        }
      }
    ]
  }
}
Code language: Bash (bash)

正常に検索が実行できました。
「mars」という単語で検索したところ、「Mars Attacks!」という文字列がヒットし、_scoreが「0.2876821」という結果でした。

まとめ

OpenSearch入門ということで、CloudFormationを使用して基本的な環境を構築しました。

目次