Amazon OpenSearch ServiceのSnapshot Management機能を使ってスナップショットを取得する

Amazon OpenSearch ServiceのSnapshot Management機能を使ってスナップショットを取得する

Clock Icon2025.03.11

はじめに

コンサル部の神野です。

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スナップショット) 無制限(ストレージ容量に依存)
カスタマイズ性 制限あり(インデックス選択不可) インデックス単位での選択可能
ライフサイクル管理 自動削除(保持期間超過後) ポリシーベースの自動削除設定可能
管理負荷 完全自動(ユーザー介入不要) ポリシー定義/監視が必要

公式ドキュメント

https://opensearch.org/docs/latest/tuning-your-cluster/availability-and-recovery/snapshots/snapshot-management/

前提条件

  • 作業環境:ローカルPC
  • 使用権限:OpenSearchにアクセス権限を持つIAMロール
  • AWS CLI、awscurl:ローカル環境に設定済み

awscurlはcurlライクにAWSのSigV4署名付きリクエストができるツールとなります。今回、OpenSearchに手軽にリクエストを送信するために使用します。awscurlの詳細は下記ブログをご参照ください。

https://dev.classmethod.jp/articles/introduce-awscurl/

作成するリソース

CleanShot 2025-03-08 at 23.46.19@2x

上記絵のようにリソースを作成していきます。
Snapshot Management機能は通知も可能なためこちらも設定してみます。

準備するリソース

今回は以下のリソースを順番に作成していきます。

  1. OpenSearchドメイン
  2. バックアップ保存用のS3バケット
  3. バックアップ通知用のSNSトピック
  4. 必要なIAMロール

OpenSearchドメイン

まずはOpenSearchドメインを作成していきます。

  1. AWSコンソール上からOpenSearchの画面へ遷移し、ドメインの作成を選択
    CleanShot 2025-03-08 at 16.56.51@2x

  2. 下記項目を入力および変更してドメインを作成します。検証目的なので最小のインスタンスサイズやタイプおよびパブリックアクセス可能なドメインを作成します。

    • ドメイン名:任意のドメイン名
    • ドメインの作成方法:標準方法
    • テンプレート:開発/テスト
    • デプロイオプション:スタンバイが無効のドメイン
      • アベイラビリティーゾーン:1-AZ
    • Instance family:General purpose
    • インスタンスタイプ:t3.small.search
    • ノードの数:1
    • ノードあたりのEBSストレージサイズ:10
    • ネットワーク:パブリックアクセス
    • きめ細やかなアクセスコントロールを有効化:チェック
      • マスタユーザーとしてIAM ARNを設定する:チェック
        • IAM ARN:OpenSearchに対してアクセス権限を持つIAMロールを指定
    • アクセスポリシー
      • きめ細かなアクセスコントロールポリシーのみを使用:チェック

    CleanShot 2025-03-08 at 23.59.43@2x

  3. ドメインが作成されるまで待機して、作成が完了したらエンドポイントをメモかコピーして控える
    CleanShot 2025-03-08 at 17.37.35@2x

スナップショット保存用のS3バケット

OpenSearchのインデックススナップショットを出力するS3バケットを作成していきます。

  1. AWSコンソール上からバケットを作成を押下
    CleanShot 2025-03-08 at 17.02.37@2x

  2. 任意のバケット名を入力して作成

    • 今回はsample-backup-opensearch-bucket-yjinnoとしました。任意の名前をご入力ください。

    CleanShot 2025-03-08 at 17.24.30@2x

  3. 作成完了後にS3バケットのARNをメモして控えておく
    CleanShot 2025-03-08 at 17.17.29@2x

通知用SNS作成

スナップショット取得の成功・通知・削除を連携するSNSを作成します。

  1. SNSの画面に遷移し、トピックタブを選択してトピックの作成ボタンを押下
    CleanShot 2024-10-20 at 01.01.22@2x

  2. タイプはスタンダードを選択し、名前はopensearch_notificationを入力してトピックの作成ボタンを押下
    CleanShot 2025-03-08 at 17.24.30@2x

  3. 作成完了後は配信先のサブスクリプションを作成します。またトピックのARNは控えておきます。
    image-20250308172533897

  4. プロトコルはEメールを選択し、エンドポイントは通知を連携したいメールアドレスを指定(今回は自分のメールアドレス)してサブスクリプションの作成ボタンを押下
    CleanShot 2025-03-08 at 17.27.51@2x

  5. 作成後は指定したメールアドレスにサブスクリプションの確認メールが届くので、Confirm Subscription リンクを押下
    CleanShot 2025-03-08 at 17.30.00@2x

  6. リンクを押下後、下記画面が表示されればSubscriptionへの紐付けが完了
    CleanShot 2025-03-08 at 17.30.38@2x

IAMポリシー・ロール作成

  1. AWSコンソール上からポリシーを作成する
    CleanShot 2025-03-08 at 17.54.43@2x

  2. 以下のポリシーを入力して、下記権限を付与

    • 事前に作成したS3バケット(sample-backup-opensearch-bucket-yjinno)にアクセスできる権限
  • 事前に作成した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"
                ]
            }
        ]
    }
    

    CleanShot 2025-03-08 at 18.19.30@2x

  1. opensearch-export-s3-policyと入力してポリシーの作成ボタンを押下
    CleanShot 2025-03-08 at 17.57.53@2x

  2. ポリシーの作成が完了したので、ロールを作成ボタンを押下
    CleanShot 2025-03-08 at 17.58.40@2x

  3. カスタム信頼ポリシーを選択して、下記を入力してOpenSearchがロールを引き受けられるよう設定

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "es.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    

    CleanShot 2025-03-08 at 18.00.55@2x

  4. 先ほど作成したopensearch-export-s3-policyを選択して次へ
    image-20250308180146221

  5. opensearch-export-s3-roleと入力してロールを作成CleanShot 2025-03-08 at 18.02.13@2x

  6. 作成後ロールのARNを控える
    CleanShot 2025-03-08 at 18.03.17@2x

これで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のマスターユーザータイプを変更

  1. コンソール上からOpenSearchの画面に遷移し、セキュリティ設定 > 編集ボタンを押下
    CleanShot 2025-03-08 at 18.05.43@2x
  2. きめ細やかなアクセスコントロールブロックでマスタユーザーの作成に変更し、任意のマスタユーザー名とマスターパスワードに変更する
    CleanShot 2025-03-08 at 18.08.18@2x
  3. 変更が完了したらダッシュボードのURLにアクセスして、先ほど入力したマスターユーザー名とマスターパスワードを再度入力してログイン
    CleanShot 2025-03-08 at 18.10.38@2x
  4. Homeの画面に遷移できたら問題ありません!
    CleanShot 2025-03-08 at 18.11.42@2x

ログインできたので、次は通知設定を行います。

通知設定

  1. ハンバーガーメニューからNotificationsを選択
    CleanShot 2025-03-08 at 18.12.59@2x

  2. Create channelを選択
    CleanShot 2025-03-08 at 18.13.50@2x

  3. 下記を入力して作成

    • Name:任意の名前(今回はbackup-notification-channel
    • Channe type:Amazon SNS
    • SNS topic ARN:事前に作成したSNS topicのARN
    • IAM role ARN:事前に作成したIAM roleのARN

    CleanShot 2025-03-08 at 18.20.24@2x

  4. 下記一覧に新規作成したチャネルが追加されていればOKです!
    CleanShot 2025-03-08 at 18.21.57@2x

最後にバックアップの設定を行います。

スナップショット設定

  1. ハンバーガーメニューからSnapshot Managementを選択
    CleanShot 2025-03-08 at 18.27.35@2x

  2. Create Policyを選択
    CleanShot 2025-03-08 at 18.28.21@2x

  3. 下記パラメータを入力して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を指定

    CleanShot 2025-03-08 at 18.31.40@2x

  4. 下記のように新規作成した、Snapshot policyがEnabledで一覧に表示されていればOKです!
    CleanShot 2025-03-08 at 18.31.52@2x

ここまででスナップショット取得の設定が完了したので挙動を確認します。

スナップショット保存時の挙動

時刻になると下記のようにスナップショットが追加されて、スナップショット取得のトリガーとなったポリシーも記載されています。今回はdaily-snapshotをPM7時に取得するようにしていたので問題なく動いていますね!

CleanShot 2025-03-10 at 19.43.50@2x

またS3バケット内もインデックスのスナップショットデータらしきものが作成されているので、ユーザー管理のバケットに問題なく保存されていますね!
CleanShot 2025-03-08 at 19.03.21@2x

通知イメージ

成功すると下記のようにSNS経由で通知が実行されます。
※取得した時間は異なりますが例としては下記のように通知されます

CleanShot 2025-03-08 at 20.22.31@2x

おわりに

Snapshot Management機能を使ったスナップショット取得方法についていかがだったでしょうか。S3のバケットはAPI経由でしか登録できないのが少しわかりにくいかと思いますが、それ以降はダッシュボードで簡単に設定できました!

本記事が少しでも参考になれば幸いです。ありがとうございました!!

補足1

ポリシー作成時に日時でスナップショット取得を指定しようとすると20時から変更できないバグが存在します。
Issueにも上がっていますが、2025/3/10現時点では対応されていないので、cron式かAPI経由で設定していただくのがいいかと思います。

https://github.com/opensearch-project/index-management-dashboards-plugin/issues/1240

CleanShot 2025-03-06 at 17.39.45@2x

補足2

OpenSearchのセキュリティプラグインを使用している場合、スナップショットには以下の追加の制限があります。(公式ドキュメント参照)

  • スナップショットの作成と復元を行うには、ユーザーに組み込みのmanage_snapshotsロールが必要です
  • グローバル状態や.opendistro_securityインデックスを含むスナップショットは復元できません

.opendistro_securityインデックスには機密データが含まれているため、スナップショットを取得する際には除外することをお勧めします。スナップショット作成時に必要なインデックスのみを選択することで、復元時の問題を回避できます。

そう言った理由も含めてスナップショットは必要なものだけ取得してリストアいただくのがいいかと思います。

公式ドキュメント

https://opensearch.org/docs/latest/tuning-your-cluster/availability-and-recovery/snapshots/snapshot-restore#security-considerations

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.