エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

不特定多数のアクセス許可していたS3がCORSでアクセスできなかった話

Javaの勉強の合間にUnity製ゲームのWebGL公開の検証をやっていたのですが、その際にS3の設定で詰まっていた話です。

起きた現象

  • EC2でホスティングしていた自サイト側からS3のファイルをGETリクエストしようとすると失敗する。
    • エラーメッセージにはCORS header 'Access-Control-Allow-Origin' missingと表示される。
  • S3は以下の設定である
    • アクセス許可: 公開
    • ブロックパブリックアクセス: パブリックアクセスをすべてブロック=オフ
    • バケットポリシー: 以下の通り
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{S3の名前}/*"
        }
    ]
}

原因

  • Cross-Origin Resource Sharing (CORS)でOriginに制限がかかっていた。

S3では特定ドメインを指定してアクセス制御が可能になっており、かなり前に記述した設定が残っていた為、CORSのエラーが発生していました。

実際のS3のCORS設定値

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "http://localhost*",
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

↑の記述だとAllowedOriginslocalhostが指定されているので、Originがlocalhostの場合しかアクセス許可されません。その為、EC2でホスティングされた状態のWebサイトからアクセスできなかった訳ですね。

AllowedOriginsワイルドカード(*)を指定するのはホビー用途とはいえセキュリティ的に宜しくないので、EC2用のドメインを指定して解決しました。

なお、CORSで指定できる各種パラメータの詳細は下記AWSドキュメントを参照下さい。

docs.aws.amazon.com