AWS

CFNでOpenSearch入門

スポンサーリンク
CloudFormationでOpenSearch入門 AWS
スポンサーリンク
スポンサーリンク

CloudFormationでOpenSearchに入門する構成

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

構築する環境

Amazon.co.jp: AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版 : NRIネットコム株式会社, 佐々木 拓郎, 林 晋一郎, 金澤 圭: 本
Amazon.co.jp: AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版 : NRIネットコム株式会社, 佐々木 拓郎, 林 晋一郎, 金澤 圭: 本
Diagram of introduction to OpenSearch with CloudFormation.

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

ステップ 1: Amazon OpenSearch Service ドメインを作成する - Amazon OpenSearch Service
OpenSearch Service ドメインは、OpenSearch クラスターと同義です。ドメインは、指定した設定、インスタンスタイプ、インスタンスカウント、およびストレージリソースを持つクラスターです。コンソール、AWS CLI、または AWS SDK を使用して OpenSearch Service ドメインを...

CloudFormationテンプレートファイル

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

awstut-fa/042 at main · awstut-an-r/awstut-fa
Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

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

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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

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

  • 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テンプレートファイルでした通りに作成されています。

動作確認

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

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

ステップ 2: インデックス作成のために Amazon OpenSearch Service にデータをアップロードする - Amazon OpenSearch Service
コマンドラインまたはほとんどのプログラミング言語を使用して、OpenSearch Service ドメインにデータをアップロードできます。

チュートリアルのデータをそのまま使用し、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)

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

続いてデータ検索です。

ステップ 3: Amazon OpenSearch Service でドキュメントを検索する - Amazon OpenSearch Service
Amazon OpenSearch Service ドメインでドキュメントを検索するには、OpenSearch 検索 API を使用します。または、 OpenSearch Dashboards を使用してドメインのドキュメントを検索することもできます。

チュートリアルに従い、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を使用して基本的な環境を構築しました。

タイトルとURLをコピーしました