[アップデート] インターネットトラフィックのパフォーマンスが最大60%向上!Amazon S3 マルチリージョンアクセスポイントの紹介

グローバル展開しているアプリケーションでS3バケットへのレイテンシに課題を抱えているのであれば、かなり嬉しいアップデートのようです。
2021.09.15

アップデートからしばらく時間が経ってしまいましたが、先日リリースされた Amazon S3 Multi-Region Access Point についてご紹介します。

S3 Multi-Region Access Point

グローバル展開されるアプリケーションやリージョン障害を考慮したアーキテクチャを設計する際に、S3 のクロスリージョンレプリケーション(CRR)は広く採用されている方法です。

しかしながら CRR で複数リージョンのバケットにオブジェクトを配置できたとしても、最短のレイテンシでアクセスするためにどのリージョンのバケットにアクセスするべきか、また特定リージョンの障害を検出してリクエスト先の S3 バケットをリルートさせるといった仕組みをユーザー側が考慮する必要がありました。

S3 Multi-Region Access Point は、このような複雑な判断からユーザーを解放し、よりシンプルかつ最適な経路でマルチリージョンにまたがるデータセットにアクセスすることが可能になります。

AWS Global Accelerator を利用した単一のエンドポイント

S3 Multi-Region Access Point は AWS Global Accelerator をベースにした単一のグローバルエンドポイントを提供します。

AWS Global Accelerator はユーザーに最も近いエッジロケーションからのアクセスを提供し、トラフィックの大部分を AWS のグローバルネットワークで処理することにより、パブリックインターネットに比べて最大 60% 高速なパフォーマンスを得ることが可能です。

また、ヘルスチェックも備わっていますので仮にターゲットのリージョンで障害が発生している場合でも、自動的に適切なリージョンへのルーティングが行われます。一方でユーザーがリクエストする先は 1 つのグローバールエンドポイントに変わりはありませんので、このような自動ルーティングもユーザーから透過的に行われます。

もう少し AWS Global Accelerator について知りたい方は以下の記事をあわせて参照ください。

Amazon S3 Transfer Acceleration を内包

AWS 外からのインターネット経由でアクセスする場合、エッジロケーションを利用したトラフィックの高速化が可能です。これは S3 Transfer Acceleration と同等の機能です。

S3 Transfer Acceleration の場合、対象のバケットで Transfer Acceleration を有効にする必要がありましたが、マルチリージョンアクセスポイントの場合は自動的に組み込まれています。

、、とココまで読んで Global Accelerator と似たようなことを書いてんな、と思いましたよね?私もそう思いました。

残念ながら、いま時点で答えは持ってないので S3 Transfer Acceleration と Global Accelerator の関係性については次のネタとして一旦寝かすことにして、先に進みます。

利用上の注意点

以下、S3 Multi-Region Access Point を利用する際に注意すべき点をいくつかピックアップしました。詳細については公式ドキュメントを参照ください。

  • マルチリージョンアクセスポイントに関連付けるバケットは、作成時のみ指定可能
    • 作成後の追加、変更、削除はできません。マルチリージョンアクセスポイントを再作成する必要があります。
  • マルチリージョンアクセスポイントに関連付けられているバケットを削除することは出来ません
  • マルチリージョンアクセスポイントに関連付けるバケットを所有している必要があります
  • マルチリージョンアクセスポイントの作成後にブロックパブリックアクセスの設定変更はサポートされていません
  • AWS 管理コンソールのマルチリージョンアクセスポイントからレプリケーションルールを作成する場合、指定されたバケットの既存レプリケーション設定はすべて置き換えられます
    • 既存レプリケーション設定に追加または変更する場合は、AWS CLI, SDK, または RESTAPI を使用してください
  • マルチリージョンアクセスポイントで利用できる s3api 操作一部のみです
    • PutObject/GetObjectは利用できますが、CopyObjectはサポートされていません、など
  • CloudFront のオリジンとしてマルチリージョンアクセスポイントを使用することはできません
  • 利用可能なリージョン
    • US East (N. Virginia/Ohio)
    • US West (N. California/Oregon)
    • Asia Pacific (Osaka/Tokyo/Seoul/Singapore/Sydney/Mumbai)
    • Canada (Central)
    • Europe (Frankfurt/Ireland/London/Paris/Stockholm
    • South America (São Paulo)

料金

従来の S3 リクエスト、ストレージ、データ転送、レプリケーションの料金に、以下の料金が加算されます。

  • データルーティングコスト $0.0033/GB
  • インターネットアクセラレーションコスト
    • アプリケーションが AWS の外部で実行され、インターネット経由でアクセスする場合にエッジロケーションを経由する高速化のコストが発生します
    • 料金はアクセス元およびアクセス先の大陸、およびアップロード or ダウンロードで異なりますので公式ドキュメントを参照ください

料金例1: 1 つの AWS リージョン内のすべてのトラフィック

  • アプリケーションは米国東部(バージニア)で実行されている
  • 米国東部(バージニア)と米国西部(オレゴン)2 つのバケットでマルチリージョンアクセスポイントを構成
  • バージニアリージョン内から 100 GBのデータをアップロードした場合
  • 総コストは $2.33
    • データルーティングコスト $0.33 (100 GB * $0.0033/GB)
    • バージニアからオレゴンへのデータ転送(レプリケーション) $2.00 ( 100 GB * $0.02/GB)
    • ストレージ、リクエスト料金および、S3 Replication Time Control (S3 RTC) は考慮していません

料金例2: 2 つの AWS リージョンのすべてのトラフィック

  • アプリケーションは米国東部(バージニア)で実行されている
  • 米国東部(オハイオ)と米国西部(オレゴン)2 つのバケットでマルチリージョンアクセスポイントを構成
  • バージニアリージョン内から 100 GBのデータをアップロードした場合
  • 総コストは $3.33
    • データルーティングコスト $0.33 (100 GB * $0.0033/GB)
    • バージニアからオハイオへのデータ転送 $1.00( 100 GB * $0.01/GB)
    • オハイオからオレゴンへのデータ転送(レプリケーション) $2.00 ( 100 GB * $0.02/GB)
    • ストレージ、リクエスト料金および、S3 Replication Time Control (S3 RTC) は考慮していません

料金例3: 北米、欧州、アジアのインターネット経由のすべてのトラフィック

  • アプリケーションは北米、欧州、およびアジアのデバイス上で実行されている
  • 米国東部(バージニア)と欧州(アイルランド)2 つのバケットでマルチリージョンアクセスポイントを構成
  • 北米のデバイスから 50 GB のデータをアップロード、アイルランド、アジアのデバイスから 50 GB のデータをダウンロードした場合
  • 総コストは $13.37
    • データルーティングコスト $0.495 (50 GB * $0.0033/GB * 3 リクエスト)
    • 北米内からのデータ IN アクセラレーションコスト $0.125 (50GB * $0.0025/GB)
    • バージニアからアイルランドへのデータ転送(レプリケーション) $1.00 (50 GB * $0.02/GB)
    • S3 からインターネットへのデータ OUT $9.00 (50 GB * $0.09/GB * 2 リクエスト)
    • 欧州内へのデータ OUT アクセラレーションコスト $0.25 (50GB * $0.005/GB)
    • 欧州外へのデータ OUT アクセラレーションコスト $2.50 (50GB * $0.05/GB)

このケースではアジアからのダウンロードは大陸間(欧州→アジア)のデータ OUT アクセラレーションコストが掛かっていますが、アジアにもマルチリージョンアクセスポイントに関連付けられた S3 バケットを配置することでデータ転送料金を抑えることが出来ます。

やってみる

それでは早速マルチリージョンアクセスポイントを作成して、どの程度、転送速度が改善されるのか検証してみましょう。

検証環境

今回は以下の環境でテストしています

  • 東京およびバージニアで構成されたマルチリージョンアクセスポイント
  • クライアントはフランクフルト内の Cloud9 (t2.micro) から AWS CLI でPutObject/GetObjectを実施
    • IAM ロールには Administrator 権限をアタッチしています
  • AWS CLI は最新の 2.2.37 を利用
    • AWS CLI が古い場合、マルチリージョンアクセスポイントを指定出来ないので必ずアップデートしてください

マルチリージョンアクセスポイントの作成

S3 管理コンソールをから[マルチリージョンアクセスポイント]を開き、マルチリージョンアクセスポイントの作成をクリックします

一意のマルチリージョンアクセスポイント名を入力し、関連付けるバケットを追加します。後から追加、削除することは出来ません。

プロックパブリックアクセスを設定します。デフォルトはすべてオフになっていますが、今回は IAM ロールでアクセスしますのでデフォルト設定のままマルチリージョンアクセスポイントの作成をクリックします。

ブロックパブリックアクセスの設定も、マルチリージョンアクセスポイントの作成後は編集出来ません。

しばらく待った後、ステータスが準備完了になりましたらマルチリージョンアクセスポイントの作成は完了です。

作成されたマルチリージョンアクセスポイントの詳細を確認すると、以下のように.mrapといった ARN およびエイリアス名が割り当てられています。マルチリージョンアクセスポイントへのリクエストはこれらの ARN やエイリアスを使用します。

レプリケーションルールの作成

マルチリージョンアクセスポイントの作成ではレプリケーション設定は行われません。マルチリージョンアクセスポイントにおいてレプリケーションは必須ではありませんが、どのリージョンのバケットにオブジェクトが保存されているかを意識することなく利用したいのであればレプリケーション設定が必要になりますので、実質的にはほぼ必須ではないかと思います。

マルチリージョンアクセスポイントの詳細画面から[レプリケーション]タブを開き、レプリケーションルールの作成をクリックします。

PutObjectするリージョンが特定されている場合は左のテンプレートを利用します。複数のリージョンで不特定にPutObjectされるのであれば右のテンプレートを利用します。今回は指定されたすべてのバケット間でオブジェクトをレプリケートを選択します。

尚、注意点でも記述したとおり既存のレプリケーションルールが存在する場合、上書きされますのでお気をつけください。

対象のバケットを選択します。レプリケーションにはバージョニング設定が必要ですが、未設定の場合はこの操作内で有効化することが出来ます。

即時にレプリケーションを有効にするため有効を選択します。

バケット内のすべてのオブジェクトをレプリケーション対象とするため、このルールは、バケット内のすべてのオブジェクトに適用されますを指定しています。

その他の設定はデフォルトを受け入れてレプリケーションルールの作成をクリックします。レプリケーション時間に厳しい要件がある場合は S3 RTC などを有効にしてください。

レプリケーションルールのステータスが成功しましたになっていることを確認します。

レプリケーションの概要を確認すると、バージニアと東京間で双方向レプリケーションが設定されていることが視覚的に判りやすく表示されていますね。

マルチリージョンアクセスポイントの検証

フランクフルトリージョンの Cloud9 に以下のとおり450MB程度のイメージファイルを作成しました。

$ ls -ltr *img
-rw-r--r-- 1 ec2-user ec2-user 474916694 Sep 11 02:37 direct-to-tokyo.img
-rw-r--r-- 1 ec2-user ec2-user 474916694 Sep 11 02:39 to-multi-reagion-ap.img
-rw-r--r-- 1 ec2-user ec2-user 474916694 Sep 11 02:39 direct-to-virginia.img

まずは東京リージョン、バージニアリージョンの S3 バケットに向けてPutObjectしてみます。

$ time aws s3api put-object --bucket cm-multi-region-tokyo --key direct-to-tokyo.img --body direct-to-tokyo.img
{
    "VersionId": "R55h36b1WVpFtaT3qtpvvNTxKJt9EYGs", 
    "ETag": "\"0fc464ac861f2a43b6f6c36daf178e99\""
}

real    1m1.862s
user    0m3.357s
sys     0m0.386s

$ time aws s3api put-object --bucket cm-multi-region-virginia --key direct-to-virginia.img --body direct-to-virginia.img                                        
{
    "VersionId": "6wpbqLw8joiswcRpx689V7Nkel1sFsS6", 
    "ETag": "\"0fc464ac861f2a43b6f6c36daf178e99\""
}

real    0m48.333s
user    0m3.270s
sys     0m0.573s

東京リージョンに向けてが61.8秒、バージニアリージョンに向けてが48.3秒という結果になりました。複数回の平均値ではないので、あくまでざっくり測定の参考値程度にとらえてください。

それでは、マルチリージョンアクセスポイントに向けてPutObjectしてみます。

$ time aws s3api put-object --bucket arn:aws:s3::641908663583:accesspoint/mxq9eefhng8tt.mrap --key to-multi-reagion-ap.img --body to-multi-reagion-ap.img
{
    "ETag": "\"0fc464ac861f2a43b6f6c36daf178e99\"",
    "VersionId": "IV.JabCNujObcKAlnMjEDNGyDTyfutbl"
}

real    0m16.712s
user    0m3.679s
sys     0m1.169s

圧倒的に速いですね!16.7秒まで短縮されました。

s3api head-objectReplicationStatusを確認すると、バージニアリージョンがソースで東京リージョンがレプリカになっていますので、先のPutObjectの結果からも最もレイテンシが低いバケットがソースとして利用されているのが判ります。

$ aws s3api head-object --bucket cm-multi-region-tokyo --key to-multi-reagion-ap.img                                                                            
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-09-11T04:09:09+00:00",
    "ContentLength": 474916694,
    "ETag": "\"0fc464ac861f2a43b6f6c36daf178e99\"",
    "VersionId": "IV.JabCNujObcKAlnMjEDNGyDTyfutbl",
    "ContentType": "binary/octet-stream",
    "Metadata": {},
    "ReplicationStatus": "REPLICA"
}

$ aws s3api head-object --bucket cm-multi-region-virginia --key to-multi-reagion-ap.img                                                                         
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-09-11T04:09:09+00:00",
    "ContentLength": 474916694,
    "ETag": "\"0fc464ac861f2a43b6f6c36daf178e99\"",
    "VersionId": "IV.JabCNujObcKAlnMjEDNGyDTyfutbl",
    "ContentType": "binary/octet-stream",
    "Metadata": {},
    "ReplicationStatus": "COMPLETED"
}

同様に GetObject もマルチリージョンアクセスポイントが圧倒的に速い結果となっています。

(東京リージョンから GetObject)
$ time aws s3api get-object --bucket cm-multi-region-tokyo --key direct-to-tokyo.img direct-to-tokyo.img                                  
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-09-11T02:56:31+00:00",
    "ContentLength": 474916694,
    "ETag": "\"0fc464ac861f2a43b6f6c36daf178e99\"",
    "VersionId": "R55h36b1WVpFtaT3qtpvvNTxKJt9EYGs",
    "ContentType": "binary/octet-stream",
    "Metadata": {},
    "ReplicationStatus": "COMPLETED"
}

real    1m12.658s
user    0m2.711s
sys     0m1.560s

(バージニアリージョンから GetObject)
$ time aws s3api get-object --bucket cm-multi-region-virginia --key direct-to-virginia.img direct-to-virginia.img 
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-09-11T03:00:15+00:00",
    "ContentLength": 474916694,
    "ETag": "\"0fc464ac861f2a43b6f6c36daf178e99\"",
    "VersionId": "6wpbqLw8joiswcRpx689V7Nkel1sFsS6",
    "ContentType": "binary/octet-stream",
    "Metadata": {},
    "ReplicationStatus": "COMPLETED"
}

real    0m35.736s
user    0m2.657s
sys     0m1.403s

(マルチリージョンアクセスポイント経由で GetObject)
$ time aws s3api get-object --bucket arn:aws:s3::641908663583:accesspoint/mxq9eefhng8tt.mrap --key to-multi-reagion-ap.img to-multi-reagion-ap.img
{
    "AcceptRanges": "bytes",
    "LastModified": "2021-09-11T04:09:09+00:00",
    "ContentLength": 474916694,
    "ETag": "\"0fc464ac861f2a43b6f6c36daf178e99\"",
    "VersionId": "IV.JabCNujObcKAlnMjEDNGyDTyfutbl",
    "ContentType": "binary/octet-stream",
    "Metadata": {},
    "ReplicationStatus": "COMPLETED"
}

real    0m10.747s
user    0m2.445s
sys     0m1.157s

検証は以上です!

まとめ

  • S3 Multi-Region Access Point は AWS Global Accelerator をベースにした単一のグローバルエンドポイントを提供
  • AWS 外からのインターネットアクセスには S3 Transfer Acceleration の仕組みと同様にエッジロケーションを利用した高速アクセス化
  • クロスリージョンレプリケーションを併用することで透過的に最適なリージョンの利用が可能
  • 通常の S3 料金にルーティングコスト、アクセラレーションコストが加算される
  • 対象バケットの指定、ブロックパブリックアクセスなどマルチリージョンアクセスポイントの作成時しか設定できない項目があるので注意
  • 既存のバケットに対してレプリケーションルールを追加する場合は、AWS CLI, SDK, または RESTAPI で操作が望ましい
    • S3 管理コンソールから操作すると既存のレプリケーションルールは上書きされます
  • グローバル展開しているアプリケーションや、マルチリージョンで可用性が求められる環境を、よりシンプルに利用することが出来そうです!

以上!大阪オフィスの丸毛(@marumo1981)でした!

参考記事