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 } ]
↑の記述だとAllowedOrigins
にlocalhostが指定されているので、Originがlocalhostの場合しかアクセス許可されません。その為、EC2でホスティングされた状態のWebサイトからアクセスできなかった訳ですね。
AllowedOrigins
にワイルドカード(*)を指定するのはホビー用途とはいえセキュリティ的に宜しくないので、EC2用のドメインを指定して解決しました。
なお、CORSで指定できる各種パラメータの詳細は下記AWSドキュメントを参照下さい。