CloudFormationでOpenSearchに入門する構成
OpenSearchはElasticsearchからフォークして作成された検索および分析スイートです。
今回は入門ということで、CloudFormationを使用してOpenSearchの基本的な環境を構築します。
構築する環境
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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
今回作成された主要リソースの情報は以下の通りです。
- 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を確認します。
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を使用して基本的な環境を構築しました。