Amazon OpenSearch ServiceのSnapshot Management機能を使ってスナップショットを取得する
はじめに
コンサル部の神野です。
Amazon OpenSearch Service(以下OpenSearch)のスナップショットには大きく分けて2種類あります。AWS管理の自動スナップショットと、ユーザー管理のSnapshot Management機能です。自動スナップショットはAWS管理のS3バケットにしか保存できませんが、Snapshot Management機能を使えばユーザー管理のS3バケットに保存できるといった違いがあります。
今回はOpenSearchのダッシュボードからSnapshot Management機能を設定・実行する方法を実際に試してみました。
Snapshot Management機能について
Snapshot Management機能は、OpenSearchクラスターのデータを定期的かつ自動的にバックアップするための仕組みです。ユーザーが指定したS3バケットにインデックスデータを保存でき、バックアップのスケジュール設定や保持期間の管理が可能です。
AWSによる自動バックアップとの比較
比較項目 | AWS自動スナップショット | OpenSearch Snapshot Management |
---|---|---|
スケジュール設定 | 固定間隔(1時間単位) | カスタム間隔(分/時間/日単位など) |
コスト構造 | 無料(サービスに包含) | S3ストレージ利用料金発生 |
保持期間 | 最大14日間(336スナップショット) | 無制限(ストレージ容量に依存) |
カスタマイズ性 | 制限あり(インデックス選択不可) | インデックス単位での選択可能 |
ライフサイクル管理 | 自動削除(保持期間超過後) | ポリシーベースの自動削除設定可能 |
管理負荷 | 完全自動(ユーザー介入不要) | ポリシー定義/監視が必要 |
公式ドキュメント
前提条件
- 作業環境:ローカルPC
- 使用権限:OpenSearchにアクセス権限を持つIAMロール
- AWS CLI、awscurl:ローカル環境に設定済み
awscurlはcurlライクにAWSのSigV4署名付きリクエストができるツールとなります。今回、OpenSearchに手軽にリクエストを送信するために使用します。awscurlの詳細は下記ブログをご参照ください。
作成するリソース
上記絵のようにリソースを作成していきます。
Snapshot Management機能は通知も可能なためこちらも設定してみます。
準備するリソース
今回は以下のリソースを順番に作成していきます。
- OpenSearchドメイン
- バックアップ保存用のS3バケット
- バックアップ通知用のSNSトピック
- 必要なIAMロール
OpenSearchドメイン
まずはOpenSearchドメインを作成していきます。
-
AWSコンソール上からOpenSearchの画面へ遷移し、
ドメインの作成
を選択
-
下記項目を入力および変更してドメインを作成します。検証目的なので最小のインスタンスサイズやタイプおよびパブリックアクセス可能なドメインを作成します。
- ドメイン名:任意のドメイン名
- ドメインの作成方法:標準方法
- テンプレート:開発/テスト
- デプロイオプション:スタンバイが無効のドメイン
- アベイラビリティーゾーン:1-AZ
- Instance family:General purpose
- インスタンスタイプ:t3.small.search
- ノードの数:1
- ノードあたりのEBSストレージサイズ:10
- ネットワーク:パブリックアクセス
- きめ細やかなアクセスコントロールを有効化:チェック
- マスタユーザーとしてIAM ARNを設定する:チェック
- IAM ARN:OpenSearchに対してアクセス権限を持つIAMロールを指定
- マスタユーザーとしてIAM ARNを設定する:チェック
- アクセスポリシー
- きめ細かなアクセスコントロールポリシーのみを使用:チェック
-
ドメインが作成されるまで待機して、作成が完了したらエンドポイントをメモかコピーして控える
スナップショット保存用のS3バケット
OpenSearchのインデックススナップショットを出力するS3バケットを作成していきます。
-
AWSコンソール上から
バケットを作成
を押下
-
任意のバケット名を入力して作成
- 今回は
sample-backup-opensearch-bucket-yjinno
としました。任意の名前をご入力ください。
- 今回は
-
作成完了後にS3バケットのARNをメモして控えておく
通知用SNS作成
スナップショット取得の成功・通知・削除を連携するSNSを作成します。
-
SNSの画面に遷移し、トピックタブを選択して
トピックの作成
ボタンを押下
-
タイプは
スタンダード
を選択し、名前はopensearch_notification
を入力してトピックの作成
ボタンを押下
-
作成完了後は配信先のサブスクリプションを作成します。またトピックのARNは控えておきます。
-
プロトコルは
Eメール
を選択し、エンドポイントは通知を連携したいメールアドレスを指定(今回は自分のメールアドレス)してサブスクリプションの作成
ボタンを押下
-
作成後は指定したメールアドレスにサブスクリプションの確認メールが届くので、
Confirm Subscription
リンクを押下
-
リンクを押下後、下記画面が表示されればSubscriptionへの紐付けが完了
IAMポリシー・ロール作成
-
AWSコンソール上からポリシーを作成する
-
以下のポリシーを入力して、下記権限を付与
- 事前に作成したS3バケット(
sample-backup-opensearch-bucket-yjinno
)にアクセスできる権限
- 事前に作成したS3バケット(
-
事前に作成したSNSトピック(
opensearch_notification
)にPublishできる権限- S3、SNSトピックともにそれぞれ事前に控えたARNを入力
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::sample-backup-opensearch-bucket-yjinno" ] }, { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::sample-backup-opensearch-bucket-yjinno/*" ] }, { "Action": [ "sns:Publish" ], "Effect": "Allow", "Resource": [ "arn:aws:sns:ap-northeast-1:XXX:opensearch_notification" ] } ] }
-
opensearch-export-s3-policy
と入力してポリシーの作成
ボタンを押下
-
ポリシーの作成が完了したので、
ロールを作成
ボタンを押下
-
カスタム信頼ポリシー
を選択して、下記を入力してOpenSearchがロールを引き受けられるよう設定{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
先ほど作成した
opensearch-export-s3-policy
を選択して次へ
-
opensearch-export-s3-role
と入力してロールを作成 -
作成後ロールのARNを控える
これで1通り準備が完了しましたので、OpenSearchへ設定を行っていきます。
OpenSearchへのスナップショット設定
疎通確認
まずはOpenSearchに問題なく、リクエストを送信できるか確認してみます。IAMの署名が必要なのが少し手間なため、awscurl
を使用してリクエストを送信します。ここではマスタユーザーとして指定したロールを使ってアクセスしています。
awscurl https://search-sample-mydomain-ddgtrcyajoxmwr3tln72btqicm.ap-northeast-1.es.amazonaws.com --region ap-northeast-1 --service es
# 結果
{
"name" : "9ea0aa11ae931469673fc88f9d2e8d51",
"cluster_name" : "xxx:sample-mydomain",
"cluster_uuid" : "JKao8OQLQP23Rp7_pixAow",
"version" : {
"distribution" : "opensearch",
"number" : "2.17.0",
"build_type" : "tar",
"build_hash" : "unknown",
"build_date" : "2025-02-14T09:39:30.748828589Z",
"build_snapshot" : false,
"lucene_version" : "9.11.1",
"minimum_wire_compatibility_version" : "7.10.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "The OpenSearch Project: https://opensearch.org/"
}
問題なく疎通できました!
次にバックアップ用のバケットを設定します。この設定はAPIでしかできないため本手順で行います。
S3バケットをレポジトリとして登録
ここでは、S3バケットをスナップショットリポジトリ(バックアップの保存先)として登録します。
リクエストパラメータ
パラメータ | 値 | 説明 |
---|---|---|
type | s3 |
スナップショットリポジトリのタイプ(S3バケットを使用) |
bucket | sample-backup-opensearch-bucket-yjinno |
事前に作成したバックアップを保存するS3バケット名 |
role_arn | arn:aws:iam::xxx:role/opensearch-export-s3-role |
事前に作成したS3バケットへのアクセス権を持つIAMロール |
base_path | opensearch-snapshots |
S3バケット内のバックアップ保存パス |
compress | true |
スナップショットデータを圧縮するかどうか |
awscurl --region ap-northeast-1 --service es -XPUT "https://search-sample-mydomain-ddgtrcyajoxmwr3tln72btqicm.ap-northeast-1.es.amazonaws.com/_snapshot/my-s3-repository" \
-H "Content-Type: application/json" \
-d '{
"type": "s3",
"settings": {
"bucket": "sample-backup-opensearch-bucket-yjinno",
"role_arn": "arn:aws:iam::xxx:role/opensearch-export-s3-role",
"base_path": "opensearch-snapshots",
"compress": true
}
}'
# 結果
{"acknowledged":true}
このAPIリクエストでは、_snapshot
エンドポイントを使用してスナップショットリポジトリを登録しています。my-s3-repository
はこのリポジトリに付ける名前で、今後このリポジトリを参照する際に使用します。リクエスト内容としては、S3バケット「sample-backup-opensearch-bucket-yjinno」をリポジトリとして指定し、OpenSearchがこのバケットにアクセスするための権限を持つIAMロール、バケット内での保存パス、データ圧縮の有無などを設定しています。
レスポンスの{"acknowledged":true}
は、リポジトリが正常に登録されたことを示しています。これで、このS3バケットがOpenSearchのスナップショット保存用リポジトリとして使用できるようになりました。
今まではIAMのマスタユーザー権限を使っていましたが、ダッシュボードからも操作したいので一部設定を変更します。
OpenSearchのマスターユーザータイプを変更
- コンソール上からOpenSearchの画面に遷移し、
セキュリティ設定
>編集
ボタンを押下
- きめ細やかなアクセスコントロールブロックで
マスタユーザーの作成
に変更し、任意のマスタユーザー名とマスターパスワードに変更する
- 変更が完了したらダッシュボードのURLにアクセスして、先ほど入力したマスターユーザー名とマスターパスワードを再度入力してログイン
- Homeの画面に遷移できたら問題ありません!
ログインできたので、次は通知設定を行います。
通知設定
-
ハンバーガーメニューから
Notifications
を選択
-
Create channel
を選択
-
下記を入力して作成
- Name:任意の名前(今回は
backup-notification-channel
) - Channe type:Amazon SNS
- SNS topic ARN:事前に作成したSNS topicのARN
- IAM role ARN:事前に作成したIAM roleのARN
- Name:任意の名前(今回は
-
下記一覧に新規作成したチャネルが追加されていればOKです!
最後にバックアップの設定を行います。
スナップショット設定
-
ハンバーガーメニューから
Snapshot Management
を選択
-
Create Policy
を選択
-
下記パラメータを入力してSnapshot policyを作成します。
今回はサンプルとして日次で19時にスナップショットを取得して、スナップショット成功・失敗・削除時に通知するように設定します。パラメータ 説明 入力例 備考 Policy name ポリシーの名前 daily-snapshot Description ポリシーの説明 Snapshot management daily policy. Select or input source indexes or index patterns バックアップ対象のインデックス * ワイルドカードおよび任意のインデックスを選択可能
※今回は全てのインデックスを取得していますが、必要なインデックスのみ取得される方がいいかと思います。理由は補足2に記載しております。Select a repository for snapshots スナップショットの保存先リポジトリ my-s3-repository 事前に登録したリポジトリを選択 Snapshot frequency スナップショット作成の頻度 Custom (Cron expression) 定期実行スケジュール
日次/週次/月次/Customが選択可能Cron expression カスタムスケジュール式 0 19 * * * 毎日19時に実行する例 Time zone タイムゾーン設定 Japan スケジュール実行のタイムゾーン Retention period 保持期間設定 Retain all snapshots スナップショットの保持ポリシー Retention conditions 保持条件 - 「Specify retention conditions」選択時に設定 Notify on snapshot activities 通知設定 - 以下の通知オプションあり - When a snapshot has been created スナップショット作成時の通知 ✓ - When a snapshots has been deleted スナップショット削除時の通知 ✓ - When a snapshot has failed スナップショット失敗時の通知 ✓ Select notification channels 通知チャンネル backup-notification-channel 通知先の設定
今回は事前に作成したchannelを指定 -
下記のように新規作成した、Snapshot policyが
Enabled
で一覧に表示されていればOKです!
ここまででスナップショット取得の設定が完了したので挙動を確認します。
スナップショット保存時の挙動
時刻になると下記のようにスナップショットが追加されて、スナップショット取得のトリガーとなったポリシーも記載されています。今回はdaily-snapshot
をPM7時に取得するようにしていたので問題なく動いていますね!
またS3バケット内もインデックスのスナップショットデータらしきものが作成されているので、ユーザー管理のバケットに問題なく保存されていますね!
通知イメージ
成功すると下記のようにSNS経由で通知が実行されます。
※取得した時間は異なりますが例としては下記のように通知されます
おわりに
Snapshot Management機能を使ったスナップショット取得方法についていかがだったでしょうか。S3のバケットはAPI経由でしか登録できないのが少しわかりにくいかと思いますが、それ以降はダッシュボードで簡単に設定できました!
本記事が少しでも参考になれば幸いです。ありがとうございました!!
補足1
ポリシー作成時に日時でスナップショット取得を指定しようとすると20時から変更できないバグが存在します。
Issueにも上がっていますが、2025/3/10現時点では対応されていないので、cron式かAPI経由で設定していただくのがいいかと思います。
補足2
OpenSearchのセキュリティプラグインを使用している場合、スナップショットには以下の追加の制限があります。(公式ドキュメント参照)
- スナップショットの作成と復元を行うには、ユーザーに組み込みの
manage_snapshots
ロールが必要です - グローバル状態や
.opendistro_security
インデックスを含むスナップショットは復元できません
.opendistro_security
インデックスには機密データが含まれているため、スナップショットを取得する際には除外することをお勧めします。スナップショット作成時に必要なインデックスのみを選択することで、復元時の問題を回避できます。
そう言った理由も含めてスナップショットは必要なものだけ取得してリストアいただくのがいいかと思います。
公式ドキュメント