AWSマネジメントコンソールからのAmazon S3のCORS設定方法がJSON記法になっていました
はじめに
清水です。先日のre:Invent 2020期間中にStrong Consistencyにも対応したAWSのオブジェクトストレージサービスAmazon S3、いつの間にかAWSマネジメントコンソールでのCORS設定の方法が、従来のXMLでの記法からJSONでの記法に変わっていました。本エントリではこれまでのマネジメントコンソール画面などを振り返りつつ、このJSON記法への変更についてまとめてみます。
JSON記法でのCORS設定画面を確認してみる
まずは実際に、AWSマネジメントコンソールのAmazon S3のページ、CORS設定の箇所を確認してみましょう。Bucketを選択して、Permissionsタブに進みます。
画面を一番下までスクロールしましょう、以下のように「Cross-origin resource sharing (CORS)」の項目が現れますね!JSON記法です!
Learn moreのリンクを辿り、Amazon Simple Storage Service開発者ガイド *1 を確認してみます。すると「<!>重要」という記載とともに、新しいS3のコンソールではJSON記法で設定する必要がある旨、記載があります。
Cross-Origin Resource Sharing (CORS) - Amazon Simple Storage Service
参考までに、以前のマネジメントコンソールをスクリーンショットで振り返っておきましょう。以下は2020年3月ごろ、現在の最新のマネジメントコンソールより1世代前のマネジメントコンソールです。 *2 JSON記法ではなく、XML記法での指定でした。
S3のCORS設定方法を確認してみた ~複数ドメインからのHLS動画再生を許可するケース~ | Developers.IO
もう一つ、S3でCORS設定ができるようになった2012年9月ごろのスクリーンショットです。 *3 当時からXML記法での指定でした。
CORS(Cross-Origin Resource Sharing)によるクロスドメイン通信の傾向と対策 | Developers.IO
ということで、これまでマネジメントコンソールからS3のCORS設定を行う際にはXML記法だったのが、マネジメントコンソールが新しくなったとともに、JSON記法による設定に変わったことが確認できました。
いつごろからJSON記法に変更されていたのか
このS3マネジメントコンソールからのCORS設定、いつごろからJSON記法になったのかも確認しておきましょう。Amazon S3開発者ガイドの記載からは、新しい(つまり現時点のバージョンの)マネジメントコンソールに切り替わったタイミングで、JSON記法での設定になった、と推測できます。このタイミングは実際にいつごろだったでしょうか。調べてみると以下のWhat's Newのポストがありました。投稿日は2020/11/11ですね。
- New Amazon S3 console improves upload speed, simplifies common tasks, and makes it even easier to manage storage
- 新しい Amazon S3 コンソールは、アップロード速度が改善され、一般的なタスクが簡素化され、そしてストレージ管理がさらに容易に
実際には多くのマネジメントコンソール画面と同様、すべてのユーザの画面が一斉に変わるのではなく時間差があったり、一定期間は新旧両方のバージョンの画面が利用できる期間があったものと思います。それも踏まえて、2020年11月ごろに変更されていた、としておきましょうか。
Amazon S3開発者ガイドの履歴も確認してみましょう、「コンソールではJSON記法で設定する必要がある」という注意書きはいつごろ追加されたのでしょうか。該当箇所をGitHubで公開されているバージョンで確認してみます。
履歴は以下のページにまとまっています。
2020-06-12のupdateでは、「コンソールではJSON記法で」の記載はありません。また記載サンプルもXML記法のみです。
2020/11/04のupdateにて、「The new S3 console only supports JSON CORS configurations」の記載がありました、また記載サンプルとしてJSON記法の例も追加されています。上記のWhat's Newのポストの時期とも一致しますね。
- Periodic update - 2020-11-04 · awsdocs/amazon-s3-developer-guide@8917363 · GitHub
- amazon-s3-developer-guide/cors.md at 8917363385b30433ae04579171c561fea9588878 · awsdocs/amazon-s3-developer-guide · GitHub
Periodic update - 2020-11-04 · awsdocs/amazon-s3-developer-guide@8917363 · GitHub
JSON記法でCORSを設定してみる
では実際にJSON記法でS3のマネジメントコンソールからCORSを設定してみます。設定例として、以前、下記のブログエントリにまとめたJavaScript製の動画プレイヤーVideo.jsでHLS形式の動画を再生するときに必要なCORS設定、としています。
- Video.jsでのHLS形式動画の再生を通してS3とCloudFrontのCORS設定について確認してみた | Developers.IO
- S3のCORS設定方法を確認してみた ~複数ドメインからのHLS動画再生を許可するケース~ | Developers.IO
まずはドメインを指定せず、任意のドメインからのアクセスを許可するパターンです。XML記法だと以下でした。
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>HEAD</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>
JSON記法だと以下のようになります。
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 } ]
ExposeHeaders
については、マネジメントコンソールから設定の際に省略することもできますが、設定反映後の状態では"ExposeHeaders": []
が自動で付与されていました。以下のようにExposeHeaders
なしで設定を保存します。
設定保存後の画面では、以下のように"ExposeHeaders": []
が追加されていました。
設定例としてもう一つ、複数のドメインを許可するケースも確認しておきます。XML記法だと以下でした。
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>https://example.net</AllowedOrigin> <AllowedOrigin>https://*.example.net</AllowedOrigin> <AllowedOrigin>http://example.net</AllowedOrigin> <AllowedOrigin>http://*.example.net</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>HEAD</AllowedMethod> <MaxAgeSeconds>3000</MaxAgeSeconds> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>
JSON記法だと以下になります。
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedOrigins": [ "https://example.net", "https://*.example.net", "http://example.net", "http://*.example.net" ], "ExposeHeaders": [], "MaxAgeSeconds": 3000 } ]
ExposeHeaders
が省略可能であることを考えると、AWS Elemental MediaStoreのCORSポリシー設定と共通化もできるのかも、と思いました。
- AWS Elemental MediaStoreでCORSを設定してみた | Developers.IO
- CORS ポリシーの例: 任意のドメインのための読み取りアクセス - AWS Elemental MediaStore
- CORS ポリシーの例: 特定のドメインへの読み取りアクセス - AWS Elemental MediaStore
他の操作方法での設定記法について
さて、上記の新しくなったマネジメントコンソールでのCORS設定のJSON記法、どこかで見覚えがあるような *4 、ということで少し調べてみました。まず、AWS CLIでのCORS設定では、従来からJSON記法を用いていました。具体的にはaws s3api
のget-bucket-cors
やput-bucket-cors
コマンドですね。現状でも、例えばget-bucket-cors
では以下のように出力をJSONと指定した場合、JSON記法でCORS設定内容が返ります。 *5
% aws s3api get-bucket-cors --bucket my-s3-bucket --output json { "CORSRules": [ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedOrigins": [ "https://example.net" ], "MaxAgeSeconds": 3000 } ] }
put-bucket-cors
コマンドについても確認しみます、こちらはGitHub上でのexamplesを参照してみました。以下のように2013/09の段階でput-bucket-cors
がJSON記法で指定するようになっていました。
aws-cli/put-bucket-cors.rst at develop · aws/aws-cli · GitHub
Developers.IOの2017年7月のエントリにも以下のようにput-bucket-cors
の実行例があります。--cors-configuration
でJSON記法で設定をしていますね。
Region Map で都道府県のデータを描画してみた #Kibana | Developers.IO
ということで、AWS CLIでは従来から(おそらく、AWS CLIのリリース当時から?)JSON記法でCORSを設定する方法だったことになります。
これまでのXML記法を使う場面は?
ところで、Amazon S3 開発者ガイドにはXML記法での記載パターンもJSON記法とあわせて掲載されています。現状ですとマネジメントコンソールを旧UIに戻すこともできそうにありません。このXML記法を使える場面はあるのでしょうか。
ざっとですが、APIやいくつかのSDKなどのドキュメントを参照してみたところ、SDKではJSON記法や各言語のデータ構造での指定でしたが、API ReferenceではXML記法での指定となっていました。
PutBucketCors - Amazon Simple Storage Service
SDKなどを使わず、直接APIを実行するような場合はまだXML記法で行う、ということなのかなと推測しています。(しかし私は直接APIを実行することをしたことがなく、この点の詳細については確認できず、となります。)ただ、実際問題そのようなSDKを介さずにAPIを直接実行する、という場面は限られるかと思いますので、開発者ガイド記載のXML記法については、あくまでJSON記法との比較のためなのかな、と思いました。
まとめ
AWSのオブジェクトストレージサービスであるAmazon S3、マネジメントコンソールからCORSを設定する際の記法がこれまでのXMLからJSONに変わったことについて確認してみました。Amazon S3自体は2006年からあるサービスで、CORS設定ができるようになったのも2012年からです。当時はJSONよりもXMLのほうが利用頻度が高くよく知られている記法だったのかな、と個人的には思います。そんな中で機能追加されたマネジメントコンソールからのCORS設定、これまで長らくXML記法だったのがJSON記法に変わりました。2021年の現在、AWSを使う上で例えばIAMポリシー設定など、JSON記法を使うことがXML記法より多くなっているかと思います。他のポリシー設定と同様にJSON記法で統一できるのは嬉しいアップデートだなと思いました。
脚注
- なお、英語版ではこちらのDeveloper Guideがno longer being updatedでAmazon S3 User Guideを参照する旨、記載がありました。 ↩
- なお、この世代のマネジメントコンソールにバージョンアップしたのは2016年11月ごろでした。 S3コンソールが新しくなりました | Developers.IO ↩
- こちらのマネジメントコンソールは2011年9月ごろから使われていたようです。 AWS Management Consoleが新デザインになりました | Developers.IO ↩
- AWS MediaStoreのCORSポリシーとも共通事項が多そうですが ↩
- 「--output text」など出力を別形式とした場合は、その形式に従います。 ↩