助け合いフォーラム

AWS

AWS ソリューションアーキテクト - アソシエイト(SAA-C02)
問題ID : 24470
問題を開く
Amazon S3で採用されているデータ整合性モデルはどれか

正解

結果整合性

解説

Amazon S3ではデータの耐久性を高めるため複数のAZに同じデータを保存します。しかし複数のAZへのデータ書き込みが完了するまで待機すると応答時間が犠牲になってしまいます。そのため、S3では「結果整合性」を採用しています。
結果整合性では、最初のデータ書き込みが完了した時点で「保存完了」の応答を返すため、書き込み処理は高速に完了します。ただし、「保存完了」応答を返したあとでも書き込んだデータを他のAZに同期している場合があるため、同期が完了していないタイミングで同じオブジェクトに対して読み取り操作を行うと、同期前のAZから更新前の情報を取得してしまう場合があります。最終的には複数のAZにデータが同期するため「結果」として読み取るデータの整合性は担保されます。
多数のユーザーが頻繁に更新する共有データは、例えばAユーザーがあるデータを更新した直後にBユーザーが同一データを更新してしまうと、Aユーザーの更新結果が消えてしまう可能性があります。

したがって正解は
・結果整合性
です。

S3のアップデートにより、結果整合性に加えてオブジェクトに対する操作(更新や削除など)に「強力な整合性」が採用されるようになりました。強力な整合性ではオブジェクトへの操作の反映が結果整合性よりも即時性が高くなり、操作の直後でも最新のデータが参照できます。

その他の選択肢については、以下のとおりです。

・参照整合性
・書込み整合性
・保存整合性
S3のデータ整合性モデルでないので、誤りです。

参考

【Amazon S3(Simple Storage Service)】
Amazon S3(Simple Storage Service)は安価で耐久性が高く、保存容量が無制限のオブジェクトストレージサービスです。SaaSのサービスなのでユーザーは障害対応などを考慮することなく、サービスの利用に集中できます。
S3にアップロードされたデータはリージョン内の最低3か所のAZに保存され、非常に高い耐久性(99.999999999%)を実現させています。耐久性とはS3上でのデータの壊れにくさのことで、S3の耐久性レベルは例えば10億のオブジェクトが格納されている場合、単一オブジェクトの消失が発生する予測平均発生率は100年に1度になる計算です。

【オブジェクトとバケット】
S3はハードディスクやファイルサーバ、Amazon EBSのようなブロックストレージとは異なる「オブジェクトストレージ」と呼ばれるタイプのストレージです。
オブジェクトストレージとは、データを固有のIDを持つ「オブジェクト」として扱う、ディレクトリのような階層構造を持たないストレージのことです。オブジェクトに割り当てられる固有のIDは「オブジェクトキー」と呼ばれ、各データはオブジェクトキーによって一意に特定できます。オブジェクトが保存される領域を「バケット」と呼びます。一つのバケットにはオブジェクト数が無制限で保存できます。バケット名はグローバルで一意にする必要があり、作成したバケットのバケット名は変更できません。
一つのオブジェクトには一つのURLが付与されます。URLにはリージョン、バケット名、オブジェクトのファイル名が付きます。


【ストレージクラス】
S3のストレージは、利用者が目的に合わせて選択できるよう複数の種類(ストレージクラス)があります。
ストレージクラスは、大きく分けて「可用性」と「遅延の度合い」によって分けられています。可用性が高く、データ取得時の遅延が低いストレージクラスほど利用料金が高く設定されています。
オブジェクトアップロード時のデフォルトのストレージクラスは「S3 Standard」です。ストレージクラスは、オブジェクトの設定画面や後述するライフサイクルポリシーにて変更できます。

[各ストレージクラスの説明]


[ストレージクラスの比較表]


【ライフサイクルポリシー】
S3バケット内のデータに対して、ストレージクラスの変更やオブジェクトの削除を自動化する機能です。指定した期間が経過したデータを自動的に、よりコストパフォーマンスの高いストレージへ移動したり、保管期限の過ぎたデータを削除したりできます。アクセス頻度が予測できるデータや、保管期間が決められているデータのバケットに設定することで、コスト削減の効果が期待できます。

下記の図では、オブジェクト作成から30日後に「S3 Standard-IA」へ、60日後に「S3 Glacier」へ移動させるように、ライフサイクルポリシーを設定しています。


【バージョニング】
オブジェクトの世代管理をしたい場合にバケット単位で有効にします。バージョニングを有効にすると、オブジェクトの更新時には更新前と更新後の両方のオブジェクトが保存され、各オブジェクトに固有のバージョンIDが割り当てられます。オブジェクトの削除時には、オブジェクトを完全に削除する代わりに削除フラグを意味する削除マーカーが付与され、それが最新のバージョンとなります。バージョニングを利用することで、ユーザーが誤ってデータの上書きや削除をしてしまっても元のデータを復元できます。

【オブジェクトロック】
S3バケットに保存したオブジェクトに対する更新・削除ができないようにします。オブジェクトロックはS3バケット作成時にのみ設定可能で、後から設定を変更することはできません。また、オブジェクトロックを有効にするとバージョニング機能も有効になります。
誤って削除されたり改ざんされたくないデータを保存するのに適しています。

【MFA Delete】
S3のバージョニング機能で世代管理されているオブジェクトを削除する際に、MFAデバイス認証が必要となる機能です。MFA(Multi-Factor Authentication:多要素認証)とはIDやパスワードと同時に、指紋などのバイオメトリクスやワンタイムパスワードを利用する認証方法のことです。
AWSではMFAアプリケーションをインストールしたデバイス(MFAデバイス)に表示されたワンタイムパスワードを、AWSアカウントやパスワードと一緒に入力します。MFAデバイスには、YubiKeyのような物理デバイスや、Google Authenticatorのようなスマートフォンにインストールして利用する仮想デバイスがあります。
MFA Deleteでは、ルートアカウント(AWSとの契約を行ったアカウント)と紐付いたMFAデバイスによる認証が求められます。MFA Deleteが有効になったバケットのオブジェクトを完全に削除する際は、ルートアカウントにてMFA認証した上で削除したいオブジェクトのバージョンIDを指定します。

【クロスリージョンレプリケーション】
S3のデータを自動的に異なるリージョンに保存したい場合に利用します。クロスリージョンレプリケーションを設定すると、別のリージョンにあるバケットへ自動的にオブジェクトをコピーします。コピー先のリージョンは指定することができ、コピーは非同期で実行されます。

下記の図では、米国西部(オレゴン)リージョンに新しいバケットを作成して、クロスリージョンレプリケーションを設定しています。


【署名付きURL】
署名付きURLは、非公開設定されたオブジェクトに対して有効期限のついたURLを発行することで、AWSアカウントを持っていないユーザーでも一時的にアクセスが可能になる機能です。署名付きURLには非常に長いランダムな文字列が入るため、URLを知らない人が推測することはほぼ不可能です。
署名付きURLを利用することで、S3のデータを特定のユーザーに期限付きでアクセスさせることができます。しかしユーザー認証機能はないため、URLが漏洩すると誰でもアクセスができてしまいます。

【S3 Transfer Acceleration】
S3上のデータをAWSネットワーク内から最速で通信できるルートを経由して転送させる機能です。S3が所属しているリージョンから地理的に遠い場所へデータを転送する際に、転送速度を高速化できます。

【静的Webサイトホスティング】
バケットに保存している静的コンテンツをWebサイトとして公開できる機能です。静的Webサイトホスティングがサポートしているコンテンツには、JavaScriptなどクライアント側で実行されるスクリプトも含みますが、PHP、JSP、ASP.NET などサーバー側で実行されるスクリプトは含みません。Webサイトとして公開したい静的コンテンツのあるバケットは「静的Webサイトホスティング」を有効にし、バケットをパブリックに読み取り可能になるよう設定します。

【S3のアクセス制御方法】
S3上のバケットやオブジェクトは、デフォルトではバケットやオブジェクトを作成したAWSアカウント(S3リソースの所有者)だけがアクセスできます。権限を制限されたIAMユーザー(IAM分野で学習します)や、他のAWSアカウントからS3リソースへアクセスできるようにするには、S3リソースの所有者であるAWSアカウントでオブジェクトやバケットへのアクセス制御を行います。

■バケットポリシー
バケット単位でアクセス権限を設定する機能です。自AWSアカウントのIAMユーザーや他のAWSアカウントのユーザーに対して、S3リソースへのアクセス権限を設定します。また、アクセス元のIPアドレスやドメイン名によるアクセス制御もできます。


バケットポリシーはアクセス権限の設定の他に、次のような機能があります。
○バケットに対して「サーバー側の暗号化」を強制できる
バケットポリシーはバケットに対して後述する「サーバー側の暗号化(Server-Side Encryption:SSE)」を強制できます。これによりバケットには、暗号化されたデータのみアップロードできるようになります。

○オブジェクトアップロード時にフルコントロール権限をバケットの所有者に設定することを強制できる
S3のオブジェクトはアップロードしたAWSアカウントが所有権を持ちます。バケットを複数のAWSアカウントで共有している場合も、バケットの所有者とは違うAWSアカウントがアップロードしたオブジェクトの所有権はアップロードしたAWSアカウントが持つので、バケットの所有者はオブジェクトに対してフルコントロール権限がありません。

バケットの所有者にフルコントロール権限を付与するには、オブジェクトをアップロードするAWSアカウントが、アップロード時にバケットの所有者にフルコントロール権限を付与する設定をします。

バケットポリシーは、オブジェクトアップロード時にフルコントロール権限をバケットの所有者に設定することを強制できます。これによりバケットには、バケット所有者がフルコントロール権限を持つオブジェクトのみアップロードできるようになります。


■ユーザー(IAM)ポリシー
IAMユーザー単位でアクセス権限を設定する機能です。自AWSアカウントのIAMユーザーやグループ、ロールに対して、S3リソースへのアクセス権限を設定します。バケットポリシーとは違い、他のAWSアカウントには設定できません。
ユーザー(IAM)ポリシーによるアクセス権限は、バケットポリシーと同じくアクセス元のIPアドレスやドメイン名によるアクセス制御もできます。


■ACL(アクセスコントロールリスト)
AWSアカウント単位でアクセス権限を設定する機能です。他のAWSアカウントに対して、オブジェクトもしくはバケットへの読み取り/書き込みを許可します。


【S3のデータ暗号化方法】
コンプライアンス対応などで、クラウド上にデータを保存する際に暗号化が必要になる場合があります。S3は保存するデータの暗号化に対応しています。S3のデータ暗号化には「サーバー側の暗号化」と「クライアント側の暗号化」の2種類の方法があります。

■サーバー側の暗号化(Server-Side Encryption:SSE)
データがS3に保存されるタイミングで、S3が暗号化を行います。データを取り出す際にもS3がデータを復号して、ユーザーに渡します。


サーバー側の暗号化には、以下3種類の方法があります。

○S3が管理している鍵を使用する (SSE-S3)


○AWS KMS(AWS Key Management Service)に保存されているCMK(カスタマーマスターキー)を使用する (SSE-KMS)


○ユーザーが管理している鍵を使用する (SSE-C)


また、S3バケットのオプションには、サーバー側の暗号化をバケット単位で利用できる「デフォルト暗号化」があります。
デフォルト暗号化は、S3へデータを保存する時に「サーバー側の暗号化」を自動で適用する機能です。デフォルト暗号化で使用する鍵は「SSE-S3」か「SSE-KMS」のどちらかを選択します。

■クライアント側の暗号化
データをS3に保存する前にクライアント側で暗号化する方法です。データをS3へ保存する前にクライアント側で暗号化を行い、暗号化したデータをそのままS3に保存します。データを取り出す際にも、暗号化したデータをS3からダウンロードした後、クライアント側で復号します。


クライアント側の暗号化には、以下2種類の方法があります。

○AWS KMS(AWS Key Management Service)に保存されているCMK(カスタマーマスターキー)を使用する


○クライアント側に保存したルートキーを使用する

上に戻る

S3で採用されているデータ整合性モデルについて

公開日 2022/03/24

ご担当者様

お世話になっております。

S3 の整合性モデルは 2020 年 12 月に、「結果整合性」から「強い一貫性」サポートへ変更されました。
ですから、選択肢には正しい選択肢はないのではないでしょうか。
問題が古いかもしれませんので、お手数ですが、最新版にアップデートしていただけますでしょうか。

よろしくお願いいたします。

2022/03/24 19:44

私もあれ?と思って以前調べたところ、S3オブジェクトは「強い一貫性」に変更されてますが、S3バケットは「結果整合性」のままなので、どれか選択であれば「結果整合性」になると思います。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/Welcome.html#ConsistencyModel

バケット設定には、結果整合性モデルがあります。具体的には、次のように処理されます。
・バケットを削除してすぐにすべてのバケットを一覧表示しても、削除されたバケットは引き続きリストに表示されます。
・バケットで初めてバージョニングを有効にしたときは、変更が完全に反映されるまでに、少し時間がかかることがあります。バケットへのオブジェクトの書き込みオペレーション (PUT または DELETE リクエスト) は、バージョニングを有効にして 15 分待ってから発行することをお勧めします。

24470の解説にも補足が書いてありますね。

S3のアップデートにより、結果整合性に加えてオブジェクトに対する操作(更新や削除など)に「強力な整合性」が採用されるようになりました。強力な整合性ではオブジェクトへの操作の反映が結果整合性よりも即時性が高くなり、操作の直後でも最新のデータが参照できます。


コメント

t tongtongba

2022/03/25 15:18

ご説明いただき、ありがとうございました。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?