継続は力なり

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

暗号化した Aurora スナップショットを別アカウントで復元する

タダです.

本番環境から別アカウントに暗号化した Aurora スナップショットを共有し,仕組み化して復元する時に少し手間取ったので対応をまとめていきます.

暗号化した Aurora スナップショットを共有する設定

Aurora スナップショットを共有する方法は AWS のドキュメントに記載があります.共有したいスナップショットの設定で共有するアカウント番号を指定すれば共有できます.

aws.amazon.com

AWS CLI でやるとスナップショット作成と共有するアカウント設定は以下のコマンドでできます.

aws rds create-db-cluster-snapshot \
    --db-cluster-identifier [クラスター名] \
    --db-cluster-snapshot-identifier [スナップショット名]

aws rds modify-db-cluster-snapshot-attribute \
    --db-cluster-snapshot-identifier [スナップショット名] \
    --attribute-name restore \
    --values-to-add [共有するアカウント番号]

今回は更に KMS(CMK)でスナップショットを暗号化しているため KMS でも別アカウントからアクセス許可を次のようなポリシーの形で与えてあげる必要があります.

{
  "Id": "key-policy-1",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow use of the key",
      "Effect": "Allow",
      "Principal": {"AWS": [
        "arn:aws:iam::111111111111:user/xxx",
        "arn:aws:iam::[共有するアカウント番号]: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::111111111111:user/xxx",
        "arn:aws:iam:::[共有するアカウント番号]:root"
      ]},
      "Action": [
        "kms:CreateGrant",
        "kms:ListGrants",
        "kms:RevokeGrant"
      ],
      "Resource": "*",
      "Condition": {"Bool": {"kms:GrantIsForAWSResource": true}}
    }
  ]
}               
            

docs.aws.amazon.com

共有されたアカウントでの設定

共有されたアカウント側の設定ですが,Lambda などのサービスをつかってスナップショットを復元に使いたい場合 IAM ポリシーの設定が必要です.下記の権限を当てた IAM ロールを作ってサービスで使っていますが,共有したスナップショットを復元してクラスター起動ができました.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUseOfTheKey",
            "Effect": "Allow",
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey",
                "kms:CreateGrant",
                "kms:RetireGrant",
                "kms:DescribeKey"
            ],
            "Resource": [
                "arn:aws:kms:[リージョン]:[CMK が存在するアカウント番号]:key/[CMK の ID]"
            ]
        }
}

まとめ

暗号化した Aurora スナップショットを別アカウントで復元するための設定と権限周りの定義をさらってきました.共有したアカウントの IAM ポリシーでうまく復元ができずにいたのですが,通る形を確認できてよかったです.同じような仕組み化する方の参考になれば嬉しいです!