😇

VPCに制限されたS3アクセスポイントでハマった

に公開

こうしようとしていた

EC2(アカウントB)から別アカウント(アカウントA)にあるS3にアクセスしようとしていました。
更にS3アクセスポイントをアカウントBに設置して、そいつ経由でアクセスしようとしていました。
図にするとこんな感じ。

aaaaa

なぜかエラーで接続出来ない

# aws s3api get-object --bucket arn:aws:s3:us-east-1:123456789012:accesspoint/testaccesspoint --key README.md READMEME.md

An error occurred (AccessDenied) when calling the GetObject operation: User: arn:aws:iam::123456789012:user/test is not authorized to perform: s3:GetObject on resource: "arn:aws:s3:us-east-1:123456789012:accesspoint/testaccesspoint/object/README.md" with an explicit deny in a resource-based policy

リソースベースポリシーで拒否されてるってそんなまさかと思って全て確認しました。

  • S3(アカウントA)に設定しているバケットポリシー
    • DataAccessPointAccountでちゃんとAllowしてるし大丈夫そう
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::test-bucket-dest",  # S3バケットのARN
                "arn:aws:s3:::test-bucket-dest/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:DataAccessPointAccount": [
                        "123456789012"            # アカウントBのID
                    ]
                }
            }
        }
    ]
}

  • S3アクセスポイントのポリシー
    • Principalでアクセス元ちゃんとAllowしてるし大丈夫そう
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/test"  # アクセス元(今回はIAMユーザー)
            },
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:us-east-1:123456789012:accesspoint/testaccesspoint/object/*",
                "arn:aws:s3:us-east-1:123456789012:accesspoint/testaccesspoint"  # S3アクセスポイントのARN
            ]
        }
    ]
}
  • アクセス元IAMユーザーのIAMポリシー
    • S3もS3アクセスポイントもちゃんと許可してある
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:us-east-1:123456789012:accesspoint/testaccesspoint",
                "arn:aws:s3:us-east-1:123456789012:accesspoint/testaccesspoint/object/*",
                "arn:aws:s3:::test-bucket-dest",
                "arn:aws:s3:::test-bucket-dest/*"
            ]
        }
    ]
}

全く分からず詰み。仕方なくビジネスサポートを契約するも

ちゃん全部許可されてるのに、、、どうしても分からずついにビジネスサポートに課金しました。
なんかトライアルオファーが利用できるようで、実質無料になるそうでした。
https://aws.amazon.com/jp/premiumsupport/plans/business/

ただサポートも結局分からずじまい、、、SCPやRCPでのDeny、S3アクセスポイントでのDenyを疑われましたが該当せず、、、詰みました。

原因はやはりS3アクセスポイントにあった

やっぱりS3アクセスポイントしかないよなぁ、、、と思って設定を見ていると、アクセスポイントがVPCのみ許可設定になっていたことに気付きました。
「ちゃんとリクエスト元VPC合ってるし関係ないよな、、、」と思っていたのですが、ふと、「これちゃんとVPCからアクセスしたことになってるか?」と疑問に思い調べてみることに。

すると以下のドキュメントが。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/access-points-vpc.html

VPC でアクセスポイントを使用するには、VPC エンドポイントのアクセスポリシーを変更する必要があります。
VPC エンドポイントは、VPC から Amazon S3 へのトラフィックフローを許可します。
これらのエンドポイントには、VPC 内のリソースに対して Amazon S3 とのやり取りを許可する方法を制御するアクセスコントロールポリシーがあります。
アクセスポイントを経由した VPC から Amazon S3 へのリクエストが成功するのは、VPC エンドポイントポリシーがアクセスポイントおよび基となるバケットの両方へのアクセスを許可した場合のみです。

あれ?もしかして今NATゲートウェイしかないから、インターネット経由のアクセスになってる?
と思い、S3専用VPCアクセスポイントを作成してみる。

するとあらま。繋がりました。

VPCに制限されたS3アクセスポイントはただそのVPCからアクセスするだけじゃなくて、S3アクセスポイントが必要だったって話です。

Discussion