Log

いろいろ

AWS BackupでS3バケットのバックアップを設定するときはs3:GetBucketVersioningが必要

AWS Backupのリソース割り当てを設定している時の話。S3の対象となるバケットを指定して「リソースを割り当てる」ボタンを押しても何も起こらない。画面の遷移もなく、エラーメッセージも表示されない。

へんじがないただのしかばねのようだ

開発者ツールを確認すると403エラーを吐いていました。

403 Forbidden

AWS Backupの設定をおこなうユーザーまたはロールに対してs3:GetBucketLocationだけでなくs3:GetBucketVersioningも許可する必要があったみたいです。実際にバックアップを取得するロールではなく、バックアップの設定をおこなうロールまたはユーザーに権限が必要な点は注意かも。

メモ

そもそもバケットに対してアクセスを制限していない場合は問題ありません。バケットポリシーでアクセスを制限している場合に問題が生じます。例えば、社内環境からDirect Connect、Private Linkを経由してS3へアクセスするユースケースなど。サンプルのバケットポリシーを示します。

※本記事でサンプルとして記載するバケットポリシーは今回の事象を説明するためのものです。Actionの範囲が広すぎるとか、分割されたStatementで漏れがあるとか、そのようなことは一切気にしません。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mtzml-20231208",
                "arn:aws:s3:::mtzml-20231208/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-12345678901234567"
                }
            }
        }
    ]
}

このバケットポリシーは特定のVPCエンドポイントを通した操作のみを許可します。

AWS Backupを利用する場合は、当然ながらバックアップを取得するロールにも操作を許可する必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mtzml-20231208",
                "arn:aws:s3:::mtzml-20231208/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userid": "XXXXXXXXXXXXXXXXXXXXX:*"
                },
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-12345678901234567"
                }
            }
        }
    ]
}

バックアップの設定をおこなうロールと取得をおこなうロールが同一であれば、このバケットポリシーで問題ありません。設定と取得の主体が異なる場合はこのバケットポリシーでは不十分です。例えば、各個人に発行されたIAMユーザーを用いてマネジメントコンソールからバックアップ設定をおこなう場合、IAMユーザーに対象のバケットを閲覧できる権限がないと、そもそもリソース割り当ての選択肢に対象のバケットが表示されません。

「mtzml-20231208」が表示されない

IAMユーザーを特定する何かしらの条件でs3:GetBucketLocationを許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Deny",
            "Principal": "*",
            "NotAction": "s3:GetBucketLocation",
            "Resource": [
                "arn:aws:s3:::mtzml-20231208",
                "arn:aws:s3:::mtzml-20231208/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userid": "XXXXXXXXXXXXXXXXXXXXX:*"
                },
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-12345678901234567"
                }
            }
        },
        {
            "Sid": "Statement2",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetBucketLocation",
            "Resource": "arn:aws:s3:::mtzml-20231208",
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalAccount": "012345678901"
                }
            }
        }
    ]
}

「20231208」が表示される

これでリソース割り当ての対象としたいバケットが選択できるようになりました。

しかし、ここで冒頭の事象が発生します。「リソースを割り当てる」ボタンを押しても画面上は何も起こりません。

へんじがないただのしかばねのようだ2

開発者ツールを確認すると403エラーを吐いているHTTPリクエストが存在します。

403 Forbidden

エラーとなっているHTTPリクエストのクエリパラメータが?versioningなので、おそらくバケットのバージョニングに関するリクエストなのでしょう。

AWS BackupでS3のバケットのバックアップを取得するためには、対象となるバケットのバージョンニングを有効にする必要があります。

Using AWS Backup for Amazon S3 - Amazon Simple Storage Service

Prerequisites
You must activate S3 Versioning on your bucket before AWS Backup can back it up.

今回のケースでは、リソース割り当て処理実行時に、バージョニングが有効であるか確認しようとして権限不足によりエラーが発生したと予測できます。

バケットのバージョニング情報を取得できるように、バックアップの設定をおこなうIAMユーザーに対してs3:GetBucketVersioningも許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Deny",
            "Principal": "*",
            "NotAction": [
                "s3:GetBucketLocation",
                "s3:GetBucketVersioning"
            ],
            "Resource": [
                "arn:aws:s3:::mtzml-20231208",
                "arn:aws:s3:::mtzml-20231208/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userid": "XXXXXXXXXXXXXXXXXXXXX:*"
                },
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-12345678901234567"
                }
            }
        },
        {
            "Sid": "Statement2",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::mtzml-20231208",
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalAccount": "012345678901"
                }
            }
        }
    ]
}

うまくいった。