AWSマネジメントコンソールからのAmazon S3のCORS設定方法がJSON記法になっていました

Amazon S3のCORSをAWSマネジメントコンソールから設定する際、これまではXML記法で内容を指定していました。昨年2020年11月のコンソールのアップデートとあわせて、このCORS指定時の記法がXMLからJSONに変わりました。
2021.01.29

はじめに

清水です。先日の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ですね。

実際には多くのマネジメントコンソール画面と同様、すべてのユーザの画面が一斉に変わるのではなく時間差があったり、一定期間は新旧両方のバージョンの画面が利用できる期間があったものと思います。それも踏まえて、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

JSON記法でCORSを設定してみる

では実際にJSON記法でS3のマネジメントコンソールからCORSを設定してみます。設定例として、以前、下記のブログエントリにまとめたJavaScript製の動画プレイヤーVideo.jsでHLS形式の動画を再生するときに必要なCORS設定、としています。

まずはドメインを指定せず、任意のドメインからのアクセスを許可するパターンです。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ポリシー設定と共通化もできるのかも、と思いました。

他の操作方法での設定記法について

さて、上記の新しくなったマネジメントコンソールでのCORS設定のJSON記法、どこかで見覚えがあるような *4 、ということで少し調べてみました。まず、AWS CLIでのCORS設定では、従来からJSON記法を用いていました。具体的にはaws s3apiget-bucket-corsput-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記法で統一できるのは嬉しいアップデートだなと思いました。

脚注

  1. なお、英語版ではこちらのDeveloper Guideがno longer being updatedでAmazon S3 User Guideを参照する旨、記載がありました。
  2. なお、この世代のマネジメントコンソールにバージョンアップしたのは2016年11月ごろでした。 S3コンソールが新しくなりました | Developers.IO
  3. こちらのマネジメントコンソールは2011年9月ごろから使われていたようです。 AWS Management Consoleが新デザインになりました | Developers.IO
  4. AWS MediaStoreのCORSポリシーとも共通事項が多そうですが
  5. 「--output text」など出力を別形式とした場合は、その形式に従います。