継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Amazon OpenSearch Service のスナップショットを別アカウントにリストアする

タダです.

Amazon OpenSearch Service の本番の手動スナップショットを開発アカウントにリストアしたい要望があり,これに関する検証をしたためこの記事にその模様をまとめていきます.

別アカウントのリストア検証概要

検証として次のことを行います.

  • 本番アカウントの手動スナップショットを開発アカウント側で使えるよう共有する
  • 開発アカウントでは作業用 EC2 からリストア用 Amazon OpenSearch Service にオペレーションを行う 

本番アカウント側の設定

本番アカウント側では2つの作業をやります.まずは開発アカウントからの AssumeRole で渡す権限は下記のものを設定します.併せて開発アカウント EC2 の IAM ロールを信頼関係に設定しておきます.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::[バケット名]" 
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "iam:PassRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::[バケット名]/*"
            ]
        }
   ]
}

次にスナップショット を格納しているS3 に下記のバケットポリシーを設定します.

{
    "Version": "2012-10-17",
    "Id": "Policy1568001010746",
    "Statement": [
        {
            "Sid": "Stmt1568000712531",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[アカウント番号]:role/[EC2 の IAM ロール]"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3::::[バケット名]"
        },
        {
            "Sid": "Stmt1568001007239",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam:::[アカウント番号]:role/[EC2 の IAM ロール]"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::[バケット名]/*"
        }
    ]
}

開発アカウント側の設定

開発アカウント側でも IAM で AssumeRole やリストアに必要な権限を追加し,リストアを実行する EC2 の IAM ロールに追加します.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::[アカウント番号]:role/[EC2 の IAM ロール]"
        },
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::[アカウント番号]:role/[本番側の権限を引き渡してくれる IAM ロール]"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "es:*",
            "Resource": [
                "arn:aws:es:ap-northeast-1:[アカウント番号]:domain/hoge/*"
            ]
        }
    ]
}

開発アカウントでのスナップショットのリポジトリ登録とリストア

開発アカウントでのスナップショットリポジトリ登録はドキュメントに沿って Python のコードを実行し,リストアは curl で実行しました.

[ec2-user@ip-12-34-56-789 hoge]$ python3 sample.py
200
{"acknowledged":true}
[ec2-user@ip-12-34-56-789 hoge]$curl https://[リストアするエンドポイント ]/__snapshot/hoge/_all?pretty
~中略~
{
    "snapshot" : "hoge",
    "uuid" : "xxx",
    "version_id" : xxx,
    "version" : "6.8.0",
    "indices" : [ "hoge", ".kibana_1" ],
    "include_global_state" : true,
    "state" : "SUCCESS",
    "start_time" : "2021-12-25T00:00:17.364Z",
    "start_time_in_millis" : 123456789101112,
    "end_time" : "2021-12-25T00:01:17.105Z",
    "end_time_in_millis" : 123456789101112,
    "duration_in_millis" : 123456,
    "failures" : [ ],
    "shards" : {
      "total" : 15,
      "failed" : 0,
      "successful" : 15
    }
  } ]
[ec2-user@ip-12-34-56-789 hoge] curl -XPOST 'https://[リストアするエンドポイント ]/_snapshot/hoge/[スナップショット名]/_restore'

まとめ

Amazon OpenSearch Service の本番スナップショットを開発アカウントにリストアするための IAM,S3 設定をまとめていきました.勝手がわからず,ドキュメント にかなり助けられました.

参考情報

aws.amazon.com