[AWS]クロスアカウントでのRDSスナップショット共有方法


## 1. 手動スナップショットのクロスアカウント共有方法

- **手動で取得したDBスナップショット**は、他アカウントへプライベートに共有可能（最大20アカウントまで）。
- 共有されたスナップショットは、共有先アカウントでコピーまたはリストアに利用できる。
    - 共有は、AWSマネジメントコンソールの「Share snapshot」アクション、AWS CLI、またはRDS APIで実施できる。
- 共有時は、スナップショットの属性 `restore` に共有先アカウントIDを追加して権限を付与する。
- **AWS CLIでの共有方法**  
    以下のように、`aws rds modify-db-snapshot-attribute` コマンドを利用し、`--attribute-name restore` と `--values-to-add` オプションで共有先のAWSアカウントIDを指定する。  
    ```bash
    aws rds modify-db-snapshot-attribute \
        --db-snapshot-identifier mydbsnapshot \
        --attribute-name restore \
        --values-to-add 123456789012
    ```
    - 上記コマンドにより、指定したスナップショットの `restore` 属性に対象アカウントIDが追加され、共有先はそのスナップショットからDBインスタンスをリストアできる。
    - 複数アカウントに共有する場合は、カンマ区切りやJSON配列でIDを指定可能。
    - 共有解除の場合は、`--values-to-remove` オプションを使用する。
- **アクセス権の確認**  
    `aws rds describe-db-snapshot-attributes` コマンドで、スナップショットに許可されているAWSアカウント（AttributeValues）の一覧を確認できる。

> **注意**: スナップショットを `all` で共有（公開）すると全AWSアカウントからリストア可能になるが、これは**暗号化されていない手動スナップショットのみ**対象。機密データを含む場合は公開共有は避けること。

## 2. 自動スナップショットをコピーして共有する方法

**自動スナップショット**（RDSがスケジュールに基づいて取得するバックアップ）は、直接他アカウントに共有できないため、以下の手順を取る:
### ① 自動スナップショットのコピー（手動スナップショットへの変換）
- 共有元アカウントで自動スナップショットを**手動スナップショットにコピー**することで、共有可能な状態にする。
- コピーは、AWSマネジメントコンソールの「Copy snapshot」操作や、CLIコマンド `aws rds copy-db-snapshot` で実施できる。
- 例（以下の値は適宜置き換えること）:
    ```bash
    aws rds copy-db-snapshot \
      --source-db-snapshot-identifier arn:aws:rds:<source-region>:<source-account-id>:snapshot:<automated-snapshot-id> \
      --target-db-snapshot-identifier my-manual-copy
    ```
    
    - `<source-region>`、`<source-account-id>`、`<automated-snapshot-id>` は該当する情報に置換。
    - コピー完了後、`my-manual-copy` が手動スナップショットとして扱われる。

### ② コピーした手動スナップショットの共有
- 手動スナップショットと同様に、`modify-db-snapshot-attribute` コマンドで共有先アカウントIDを指定して共有する。
    
    ```bash
    aws rds modify-db-snapshot-attribute \
      --db-snapshot-identifier my-manual-copy \
      --attribute-name restore \
      --values-to-add 123456789012
    ```
    - `123456789012` は共有先アカウントのAWSアカウントID。
### ③ 共有先での利用
- 共有先アカウントでは、共有されたスナップショットを**一度自アカウントにコピー**する運用が一般的。
    - コンソールの「Shared with me（共有済み）」タブから「Copy snapshot」でコピーし、自アカウント内のスナップショットとして利用できる。
## 3. 暗号化されたスナップショットの共有方法（KMSキーの設定）
**暗号化されたRDSスナップショット**を共有する場合、KMS（Key Management Service）のキー設定と、スナップショットのコピー（再暗号化）が必要となる。  
※デフォルトのAWS管理KMSキーで暗号化されたスナップショットは共有できない。

### ① カスタマー管理KMSキーの用意と権限付与
- 共有元アカウントでカスタマー管理のKMSキーを作成し、**キーのキーポリシーまたは使用権限に共有先アカウントを追加**する。
    
- 例として、以下のポリシーに共有先アカウントID（例: `123456789012`）を追加する。
    
    ```json
    {
      "Version": "2012-10-17",
      "Id": "key-default-1",
      "Statement": [
        {
          "Sid": "Allow use of the key",
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::<your-account-id>:root",
              "arn:aws:iam::123456789012:root"
            ]
          },
          "Action": [
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:DescribeKey"
          ],
          "Resource": "*"
        }
      ]
    }
    ```
    
- ポリシー更新は以下のCLIコマンドで実施:
    ```bash
    aws kms put-key-policy \
      --key-id <your-kms-key-id> \
      --policy-name default \
      --policy file://kms-key-policy.json
    ```
    
    - `<your-kms-key-id>` は対象KMSキーID。

### ② 暗号化スナップショットのコピー（再暗号化）

- 共有元アカウントで、元の暗号化スナップショットを、上記カスタムKMSキーを使用してコピー（再暗号化）する。
    
    ```bash
    aws rds copy-db-snapshot \
      --source-db-snapshot-identifier arn:aws:rds:<source-region>:<source-account-id>:snapshot:<encrypted-snapshot-id> \
      --target-db-snapshot-identifier my-encrypted-manual-copy \
      --kms-key-id <your-kms-key-id>
    ```
    
    - `<encrypted-snapshot-id>`: 元の暗号化スナップショットのID
    - `<your-kms-key-id>`: 更新したカスタムKMSキーのID
    - コピー完了後、`my-encrypted-manual-copy` が手動スナップショットとして扱われ、共有可能になる。

### ③ コピーした暗号化スナップショットの共有

- 通常の手動スナップショットと同様に、以下のコマンドで共有先アカウントに共有する。
    
    ```bash
    aws rds modify-db-snapshot-attribute \
      --db-snapshot-identifier my-encrypted-manual-copy \
      --attribute-name restore \
      --values-to-add 123456789012
    ```
    

### ④ 共有先でのコピーと復元

- 共有先アカウントでは、直接リストアはできないため、共有された暗号化スナップショットを自アカウントにコピーする。
    - コピー時には、共有先のカスタムKMSキーを指定して暗号化する必要がある。
    - コピーが完了すると、自アカウント内のスナップショットとして通常通りリストア可能となる。

## 参考資料

- [Amazon RDS ユーザーガイド – DBスナップショットの共有方法](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ShareSnapshot.html)
- [modify-db-snapshot-attribute (AWS CLI)](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-snapshot-attribute.html)
- [copy-db-snapshot (AWS CLI)](https://docs.aws.amazon.com/cli/latest/reference/rds/copy-db-snapshot.html)
- [New – Cross-Account Snapshot Sharing for Amazon Aurora (AWS Blog)](https://aws.amazon.com/blogs/aws/new-cross-account-snapshot-sharing-for-amazon-aurora/)