オルトプラスに入社してやったこと！！その２（Amazon Auroraのスナップショット共有）


本記事は [オルトプラス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/altplus2023) の12/09の記事です。

# はじめに
どうも！！オルトプラスの浦谷（urachooooooo）です

所属は技術部SREでテックスペシャリストとして横断的にデータベースを見ています！！
肩書きはエンジニアマネージャーですが生粋のDBAです！！

本記事ではオルトプラスに入社してやってみた！！（パート２）として[Amazon Aurora](https://aws.amazon.com/jp/rds/aurora/ "Amazon Aurora")について書いていきます。

それでは9日目のアドベントカレンダー開始しますー！！

# 概要
アジェンダとしては「Auroraの[スナップショット共有](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-share-snapshot.html "DB クラスターのスナップショットの共有")」についてです。
本番環境のAuroraのスナップショットを検証環境で使用するケースについてどの様な工程を経て他のアカウントへ共有しているのか？を解説していきます。

# 詳細
Auroraの検証を行うときに本番環境のスナップショットを使用するのが最も効率的かと思います。
自分も本番環境のデータを使用して検証環境でAuroraクラスターの環境を構築する機会がありました。

本記事では本番環境から検証環境へのスナップショットを共有して環境構築するまでの手順を記載していきますー

## オルトプラスで使用されているデータベースについて
:::note info
オルトプラスではデータベースは主にAuroraを使用しています。
Auroraで使用しているデータベースエンジンはMySQLで、プロジェクトによって異なりますが、Provisioned或いはAurora Serverless v2を使用しています。
:::

## 環境構築に必要な要素
まずは事前情報として今回の環境構築に必要な要素（登場人物）の洗い出しを行なっておきます。
下記の要素を使用して今回の説明を行なっていきますー

- 本番環境
    <table>
    <tr><td colspan="3">要素</td><td>値</td></tr>
    <tr><td colspan="3">Auroraクラスター</td><td>prod-altplus-cluster</td></tr>
    <tr><td colspan="3">AWSアカウントID</td><td>987654321000</td></tr>
    <tr><td colspan="2" rowspan="3">スナップショット</td><td>ベース</td><td>rds:prod-altplus-cluster-2023-12-21-00-00</td></tr>
    <tr><td>共有</td><td>from-prod-altplus-cluster-to-dev</td></tr>
    <tr><td>ARN</td><td>arn:aws:rds:ap-northeast-1:987654321000:cluster-snapshot:from-prod-altplus-cluster-to-dev</td></tr>
    <tr><td rowspan="6">KMS</td><td rowspan="3">AWSマネージドキー</td><td>Alias</td><td>aws/rds</td></tr>
    <tr><td>KeyArn</td><td>arn:aws:kms:ap-northeast-1:987654321000:key/1234abcd-12ab-34cd-56ef-1234567890ab</td></tr>
    <tr><td>KeyId</td><td>1234abcd-12ab-34cd-56ef-1234567890ab</td></tr>
    <tr><td rowspan="3">カスタマーマネージドキー</td><td>Alias</td><td>dev-altplus-key</td></tr>
    <tr><td>KeyArn</td><td>arn:aws:kms:ap-northeast-1:987654321000:key/0987dcba-09fe-87dc-65ba-ab0987654321</td></tr>
    <tr><td>KeyId</td><td>0987dcba-09fe-87dc-65ba-ab0987654321</td></tr>
    </table>
- 検証環境
    <table>
    <tr><td colspan="3">要素</td><td>値</td></tr>
    <tr><td colspan="3">Auroraクラスター</td><td>dev-altplus-cluster</td></tr>
    <tr><td colspan="3">AWSアカウントID</td><td>123456789000</td></tr>
    <tr><td colspan="2">スナップショット</td><td>コピー</td><td>dev-altplus-cluster-2023-12-21-00-00</td></tr>
    <tr><td rowspan="3">KMS</td><td rowspan="3">AWSマネージドキー</td><td>Alias</td><td>aws/rds</td></tr>
    <tr><td>KeyArn</td><td>arn:aws:kms:ap-northeast-1:123456789000:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d</td></tr>
    <tr><td>KeyId</td><td>1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d</td></tr>
    </table>


## そもそもスナップショットの共有って簡単にできる？
- 下記のイメージの様に異なるAWSアカウント間で簡単にスナップショットのやり取りができるのか？
![[スナップショット共有イメージ]01_スナップショットは共有できる？.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/989bb2c7-0585-f6c1-6826-eaa0923fa6d9.png)

- 結論ですが、AWSアカウントが異なる場合はスナップショットの共有ができません。
何故ならばスナップショットを取得したAWSアカウントのみ使用できるようにKMSで管理されているためです。
![[スナップショット共有イメージ]02_KMSがないとできない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/eb36ceb0-bacb-ec64-cfa9-7696c608ad0f.png)

## KMSについて
:::note info
[KMS](https://aws.amazon.com/jp/kms/ "AWS Key Management Service")は「AWS Key Management Service」の略で、データの暗号化やデジタル署名に使用するキーを作成して管理するフルマネージドサービスです。
:::
>KMSには下記のタイプがあり管理方法が異なります。
例えば今回の環境構築の例として「dev-altplus-key」がありますが、このKMSキーは自分で「キーポリシー」を作成して管理が必要です。

<table>
<tr bgcolor=black><td>KMSタイプ</td><td>エイリアス</td><td>作成・管理</td></tr>
<tr><td>AWSマネージドキー</td><td>aws/rds</td><td>AWSが作成して管理</td></tr>
<tr><td>カスタマーマネージドキー</td><td>dev-altplus-key</td><td>ユーザーが作成して管理</td></tr>
</table>

>例としてカスタマーマネージドキー「dev-altplus-key」のキーポリシーを記載します。
AWSアカウント「987654321000」から「123456789000」へスナップショット共有を行うためのサンプルのキーポリシーです。

- キーポリシー
    ```json:dev-altplus-key
    {
        "Version": "2012-10-17",
        "Id": "key-consolepolicy-3",
        "Statement": [
            {
                "Sid": "Enable IAM User Permissions",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::987654321000:root"
                },
                "Action": "kms:*",
                "Resource": "*"
            },
            {
                "Sid": "Allow use of the key",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::123456789000:root"
                },
                "Action": [
                    "kms:CreateGrant",
                    "kms:Encrypt",
                    "kms:Decrypt",
                    "kms:ReEncrypt*",
                    "kms:GenerateDataKey*",
                    "kms:DescribeKey"
                ],
                "Resource": "*"
            },
            {
                "Sid": "Allow attachment of persistent resources",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::123456789000:root"
                },
                "Action": [
                    "kms:CreateGrant",
                    "kms:ListGrants",
                    "kms:RevokeGrant"
                ],
                "Resource": "*",
                "Condition": {
                    "Bool": {
                        "kms:GrantIsForAWSResource": "true"
                    }
                }
            }
        ]
    }

## スナップショット共有を使用した環境構築イメージ
### スナップショット共有の全体像
:::note info
AWSアカウントID「987654321000」で取得したスナップショットをAWSアカウントID「123456789000」に共有し、そのスナップショットを元にAuroraクラスターを復元している全体イメージです。

これら全体の流れを各パート毎に細分化して説明します。
:::
![[スナップショット共有イメージ]03_スナップショット共有（全体像）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/6d230d13-88cd-99d4-f6ab-66e8d642e620.png)

### ①スナップショット取得完了
- AWSアカウントID「987654321000」のスナップショット取得が完了している状態
- KMSにはエイリアス「aws/rds」のAWSマネージドキーを使用
![[スナップショット共有イメージ]04_スナップショット共有（開始）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/3c3ce4bf-2d5f-8cde-c4fe-cbee960467d7.png)

### ②共有用スナップショット準備
- dev-altplus-clusterへ共有するためのスナップショットを準備
- KMSにはエイリアス「dev-altplus-key」のAWSマネージドキーを使用
![[スナップショット共有イメージ]05_スナップショット共有（準備）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/487c8b6a-a46a-b85b-f7b4-0d67de715e4b.png)

### ③スナップショット共有
- dev-altplus-clusterへのスナップショット共有を実施
- AWSアカウントID「123456789000」を追加する
- AWSアカウントID追加時点でdev-altplus-clusterへスナップショットは共有されている
![[スナップショット共有イメージ]06_スナップショット共有（共有）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/e227a4d7-fc4c-a930-41fa-9c383e3b739a.png)

### ④共有されたスナップショットを確認
- 共有対象のスナップショットがdev-altplus-clusterへ共有されていること
![[スナップショット共有イメージ]06_スナップショット共有（共有確認）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/8cca381e-f010-c840-7447-0e60d41daff2.png)

### ⑤共有用スナップショットをコピー
- dev-altplus-clusterで実際にスナップショットが共有されていることを確認
- 共有済みのスナップショットをdev-altplus-clusterで自由に使用するためにスナップショットをコピーしておく
- KMSにはエイリアス「aws/rds」のAWSマネージドキーを使用
![[スナップショット共有イメージ]07_スナップショット共有（共有コピー）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/4d06056b-97ed-757f-a61e-317515a26927.png)

### ⑥コピーしたスナップショットでクラスターを作成
- コピーしたスナップショットはdev-altplus-clusterで自由に使用可能な状態
- このスナップショットを復元してAuroraクラスターを作成する
![[スナップショット共有イメージ]08_スナップショット共有（復元）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/fec7302d-373d-5c0a-a78c-b68c261b441f.png)

## スナップショット共有を使用した実際の手順
:::note info
「[スナップショット共有の全体像](#スナップショット共有の全体像)」の内容をAWSマネジメントコンソールをベースとしたイメージでより具体的な手順として説明していきます。

尚、本手順ではより認知負荷を下げる工夫或いは、閲覧する方がより見やすいように「[環境構築に必要な要素](#環境構築に必要な要素)」を色によって識別する等の編集を行なっています。
:::

### 共有するスナップショットを確認するまでの手順
1. 共有元のAWSアカウントID「987654321000」でログインして、AWSマネジメントコンソールの「RDS」のリンクをクリック
![[01_987654321000]スナップショット確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/0ab2f14d-0366-be2f-f0fd-a884186b8f84.png)

2. 「スナップショット」のリンクをクリック
![[02_987654321000]スナップショット確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/307fc54f-0bd5-4d26-34c9-85b8f6e4b6a6.png)

3. スナップショットの「システム」のタブを選択する。スナップショット名
「rds:prod-altplus-cluster-2023-12-21-00-00」が共有対象
![[03_987654321000]スナップショット確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/0dd00c01-2a4f-3698-8a93-079be4ce9abd.png)
[①スナップショット取得完了](#スナップショット取得完了)はここまでの手順になる

### 共有するスナップショットを準備するまでの手順
1. スナップショットを共有するためにKMSを付け替える必要がある。
そのためにスナップショットをコピーする
![[04_987654321000]スナップショット確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/fc2bd1d9-e1df-a0ac-c153-dd6cf31f7b9c.png)

2. 共有するスナップショットのKMSの設定を確認。
KMSのキーId「1234abcd-12ab-34cd-56ef-1234567890ab」はエイリアスが「aws/rds」でAWSアカウントID「987654321000」のみ使用可能
![[05_987654321000]スナップショット確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/7e664f3f-ed78-d5e8-7112-74c9846c6f6d.png)

3. AWSアカウントID「987654321000」でログインして、AWSマネジメントコンソールの「Key Management Service（KMS）」のリンクをクリック（便宜上ログインの手順を入れているがログイン済みの場合は不要。
また、KMSの作成はこのタイミングでなくてもよい）
![[06_987654321000]KMS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/f4bdb9c1-bbfb-cdfd-68d4-409611e7a485.png)

4. AWSアカウントID「123456789000」へスナップショット共有するためのKMSをエイリアス「dev-altplus-key」で作成
![[07_987654321000]KMS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/f6b3e0ca-7aa7-9daf-50a5-2f6937be53da.png)

5. 共有するためのスナップショット「from-prod-altplus-cluster-to-dev」とKMS「dev-altplus-key」を指定
![[08_987654321000]スナップショット共有用コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/0df749b8-07ac-1382-9bd4-0503d5f7e9a4.png)

6. スナップショットに追加するKMSの設定を確認。KMSのキーId「0987dcba-09fe-87dc-65ba-ab0987654321」はエイリアスが「dev-altplus-key」で、スナップショット共有先のAWSアカウントID「123456789000」で使用可能となっている
![[09_987654321000]スナップショット共有用コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/16047e78-c023-9423-7954-db5402f06bd1.png)

7. スナップショットをコピーする。スナップショットの画面のステータスが「copying（0%）」から「利用可能（完了）」になったらコピー完了
![[10_987654321000]スナップショット共有用コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/3980da91-7833-b111-f848-27fb45119edc.png)
[②共有用スナップショット準備](#共有用スナップショット準備)はここまでの手順になる

### スナップショット共有のためのAWSアカウントIDを追加するまでの手順
1. スナップショット「from-prod-altplus-cluster-to-dev」を共有するためにアクション「スナップショットの共有」を選択
![[11_987654321000]スナップショット共有アクセス許可.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/bec8d72e-da25-b220-80a2-5891edfa3be0.png)

2. AWSアカウントID「123456789000」を追加して「保存」ボタンを押下した時点でAWSアカウントID「123456789000」へスナップショットが共有される
![[12_987654321000]スナップショット共有アクセス許可.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/e92a5eb7-be79-df9a-7782-91b0df504459.png)
[③スナップショット共有](#スナップショット共有)はここまでの手順になる

### スナップショットが共有されていることを確認するまでの手順
1. 共有先のAWSアカウントID「123456789000」でログインして、AWSマネジメントコンソールの「RDS」のリンクをクリック
![[13_123456789000]スナップショット共有確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/f6543aa9-bc06-f4af-8c7a-762440ee2f8c.png)

2. 「スナップショット」のリンクをクリック
![[14_123456789000]スナップショット共有確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/a6320f1d-2458-152c-67ea-fce2745abddf.png)

3. 「自分と共有」タブを選択してスナップショット「from-prod-altplus-cluster-to-dev」が共有されていることを確認。
尚、スナップショット名は共有スナップショットとしてARNで表示されるため「arn:aws:rds:ap-northeast-1:987654321000:cluster-snapshot:from-prod-altplus-cluster-to-dev」が表示される
![[15_123456789000]スナップショット共有確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/d5538675-7809-03f9-90b8-527debc0849b.png)
[④共有されたスナップショットを確認](#共有されたスナップショットを確認)はここまでの手順になる

### 共有されたスナップショットをコピーするまでの手順
1. 共有されたスナップショットをコピーするためのアクションを選択
![[16_123456789000]スナップショット共有自由使用コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/36965742-cb7f-9486-edc0-2e44d9d54173.png)

2. 共有されたスナップショットに新しいスナップショット名「dev-altplus-cluster-2023-12-21-00-00」とKMSのAWSマネージドキー「aws/rds」を設定（2ページで１セット）
![[17_123456789000]スナップショット共有自由使用コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/0523512f-fe3c-0bf3-c8cf-b59349e921d6.png)
![[18_123456789000]スナップショット共有自由使用コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/3b4a2271-6043-e44c-d23d-6102d0a8f5ae.png)

3. スナップショットをコピーする。スナップショットの画面のステータスが「copying（0%）」から「利用可能（完了）」になったらコピー完了
![[19_123456789000]スナップショット共有自由使用コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/5f3d922e-18ac-ea1d-974d-489d26101927.png)
[⑤共有用スナップショットをコピー](#共有用スナップショットをコピー)はここまでの手順になる

### コピーしたスナップショットを元にAuroraクラスターを復元するまでの手順
1. スナップショットの画面からAuroraクラスターを復元する対象のスナップショット「dev-altplus-cluster-2023-12-21-00-00」のリンクをクリックしてアクション「スナップショットを復元」を選択
![[20_123456789000]スナップショット復元.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/51ebc3f9-6212-e0dd-fe7f-c438a30810f9.png)

2. DBインスタンス名は「dev-altplus」、KMSは「aws/rds」を選択して復元する。
尚、AuroraクラスターとWriterインスタンスが作成され、全てのステータスが「利用可能」になったら復元完了になる（3ページで１セット）
:::note info
スナップショットを復元画面では画面の指示に従って作成する情報を設定するため簡単にAuroraクラスターを作成することができます。

例えば、オルトプラスではMySQLを使用しているため「Amazon Aurora　MySQL 互換エディション」を選択しています。

以降の設定は使用する環境に大きく左右されますが、インスタンスの設定では「キャパシティータイプ（Provisioned・Serverless）」、「データベースのバージョン」や「インスタンスタイプ」等があります。
接続では「VPC」・「サブネットグループ」・「セキュリティーグループ」そして「アベイラビリティゾーン（AZ）」等を選択して復元します。
![[21_123456789000]スナップショット復元.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/390e6a43-77d5-1b6a-4bbd-ca0bc46a5e59.png)
![[22_123456789000]スナップショット復元.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/38e1d43d-de23-b001-0777-551fdfc18cb3.png)
![[23_123456789000]スナップショット復元.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/161b3c7b-4a57-99d7-7908-75ec269a4912.png)
[⑥コピーしたスナップショットでクラスターを作成](#コピーしたスナップショットでクラスターを作成)はここまでの手順になる
:::

### スナップショット共有解除の手順
1. 共有元のAWSアカウントID「987654321000」でログインして、AWSマネジメントコンソールの「RDS」のリンクをクリック
![[24_987654321000]スナップショット共有解除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/4b0afce3-6ded-6556-9b3a-d3a00d68dcbb.png)

2. 「スナップショット」のリンクをクリック
![[25_987654321000]スナップショット共有解除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/a83ed53f-01dc-a636-17d1-c4123245de3b.png)

3. スナップショット「from-prod-altplus-cluster-to-dev」の共有を解除するためにアクション「スナップショットの共有」を選択
![[26_987654321000]スナップショット共有解除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/b975dd16-b305-0b9d-2730-a799de8579dd.png)

4. 共有を解除するAWSアカウントID「123456789000」の削除にチェックを入れて「保存」ボタンを押下した時点で
AWSアカウントID「123456789000」のスナップショット共有が解除される
![[27_987654321000]スナップショット共有解除.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/e5fc6df8-40b6-3c86-f5d8-628b1478172a.png)

### スナップショット共有解除（確認）の手順
1. 共有先のAWSアカウントID「123456789000」でログインして、AWSマネジメントコンソールの「RDS」のリンクをクリック
![[28_123456789000]スナップショット共有解除確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/c5b66f2b-358b-cf3c-2928-f95d389fedd9.png)

2. 「スナップショット」のリンクをクリック
![[29_123456789000]スナップショット共有解除確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/40e2fd78-45d6-654a-c271-c10a432a1412.png)

3. 「自分と共有」タブを選択してスナップショット「from-prod-altplus-cluster-to-dev」の共有が解除されていることを確認。
![[30_123456789000]スナップショット共有解除確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46914/c4c7d345-5d65-b17f-155e-0f62605a8a37.png)

# まとめ
Auroraのスナップショット共有についてどの様な手順で異なるAWSアカウント間での共有をするのか？をイメージを作成しつつ手順を説明しました！！

もしスナップショット共有でわからなくなったらこちらの記事を使用しながら理解を深めていただけたら幸いです！！