Amazon CloudFront
開発者ガイド (API バージョン 2016-09-29)

オリジンアクセスアイデンティティを使用して Amazon S3 コンテンツへのアクセスを制限する

CloudFront ディストリビューションのオリジンとして Amazon S3 バケットを使用している場合は、すべてのユーザーにファイルへのアクセス権を付与するか、アクセスを制限することができます。たとえば、CloudFront 署名付き URL または署名付き Cookie を使用してアクセスを制限する場合は、ファイルの直接 URL を使用して、ユーザーがファイルを表示できないようにします。代わりに、CloudFront URL を使用してファイルへのアクセスのみ許可するため、正常に保護されます。

重要

ウェブサイトエンドポイントとして設定された Amazon S3 バケットを使用する場合、CloudFront を使用してカスタムオリジンとして設定する必要があります。このトピックで説明しているオリジンアクセスアイデンティティ機能を使用することはできません。カスタムヘッダーを使用して、カスタムオリジンのコンテンツへのアクセスを制限することができます。詳細については、「カスタムヘッダーを使用してカスタムオリジンのコンテンツへのアクセスを制限する」を参照してください。

Amazon S3 バケットを CloudFront ディストリビューションのオリジンとして最初に設定する場合、すべてのユーザーにバケット内のファイルの読み取りアクセス許可を付与します。これにより、すべてのユーザーが CloudFront または Amazon S3 の URL を使用してファイルにアクセスできます。CloudFront は Amazon S3 の URL を公開しませんが、アプリケーションが Amazon S3 のファイルを直接処理する場合、またはユーザーが Amazon S3 の特定ファイルへの直接リンクを配信した場合に、ユーザーがそれらの URL を取得することがあります。

CloudFront 署名付き URL や署名付き Cookie を使用して Amazon S3 バケット内のファイルへのアクセスを制限する場合は、ユーザーが Amazon S3 URL を使用して Amazon S3 ファイルにアクセスできないようにすることが必要になる場合もあります。ユーザーが Amazon S3 内のファイルに直接アクセスすると、ユーザーは CloudFront 署名付き URL や署名付き Cookie によって提供される制御をバイパスします。たとえば、ユーザーがコンテンツにアクセスできなくなる日時の制御や、コンテンツへのアクセスに使用できる IP アドレスの制御です。また、ユーザーが CloudFront および直接 Amazon S3 URL 使用してファイルにアクセスする場合、CloudFront アクセスログが不完全になり、役に立たなくなります。

URL が署名されているかどうかに関係なく、ユーザーがファイルに CloudFront URL のみを使用してアクセスしていることを確認するには、以下の操作を行います。

  1. 特別な CloudFront ユーザーであるオリジンアクセスアイデンティティを作成し、そのオリジンアクセスアイデンティティをディストリビューションに関連付けます。オリジンアクセスアイデンティティをオリジンに関連付けます。そうすることで、Amazon S3 コンテンツのすべてまたは一部のみを保護することができます。ディストリビューションを作成するときに、オリジンアクセスアイデンティティを作成してディストリビューションに追加することもできます。詳細については、「CloudFront オリジンアクセスアイデンティティを作成してディストリビューションに追加する」を参照してください。

  2. オリジンアクセスアイデンティティのみが読み取り許可 (または読み取りとダウンロードのアクセス許可) を持つように、Amazon S3 バケットに対する許可またはバケット内のファイルに対する許可を変更します。ユーザーが CloudFront を使用して Amazon S3 ファイルにアクセスすると、CloudFront のオリジンアクセスアイデンティティはユーザーに代わってファイルを取得します。ユーザーが直接 Amazon S3 URL を使用してファイルをリクエストすると、ユーザーはアクセスを拒否されます。オリジンアクセスアイデンティティには、Amazon S3 バケット内のファイルへのアクセス許可がありますが、ユーザーにはありません。詳細については、「オリジンアクセスアイデンティティに Amazon S3 バケット内のファイルの読み取りアクセス許可を付与する」を参照してください。

注記

オリジンアクセスアイデンティティを作成するには、CloudFront コンソールまたは CloudFront API バージョン 2009-09-09 以降を使用する必要があります。

プライベート Amazon S3 バケットを CloudFront で使用するための設定に関する詳細は、How to Set Up and Serve Private Content Using S3 and Amazon CloudFront を参照してください。

CloudFront オリジンアクセスアイデンティティを作成してディストリビューションに追加する

AWS アカウントは最大で 100 個の CloudFront オリジンアクセスアイデンティティを持つことができます。ただし、1 つのオリジンアクセスアイデンティティを、必要な数のディストリビューションに追加できるため、通常は 1 つのオリジンアクセスアイデンティティで十分です。

ディストリビューションの作成時にオリジンアクセスアイデンティティを作成してディストリビューションに追加しなかった場合は、ここで、CloudFront コンソールまたは CloudFront API を使用して、作成と追加を行うことができます。

オリジンアクセスアイデンティティを作成してディストリビューションに追加する

ディストリビューションの作成時にオリジンアクセスアイデンティティを作成しなかった場合は、以下の操作を行います。

CloudFront コンソールを使用して CloudFront オリジンアクセスアイデンティティを作成するには

  1. AWS マネジメントコンソール にサインインし、https://console.aws.amazon.com/cloudfront/ にある、CloudFront コンソールを開きます。

  2. S3 オリジンを持つディストリビューションの ID をクリックし、[Distribution Settings (ディストリビューション設定)] を選択します。

  3. [オリジン] タブを選択します。

  4. オリジンを選択後、[編集] を選択します。

  5. [バケットアクセスの制限] で、[はい] を選択します。

    注記

    [バケットアクセスの制限] オプションが表示されない場合は、Amazon S3 オリジンはウェブサイトエンドポイントとして設定される場合があります。その設定では、S3 バケットはカスタムオリジンとして CloudFront に設定する必要があるため、オリジンアクセスアイデンティティを使用することはできません。

  6. 使用するオリジンアクセスアイデンティティが既にある場合は、[Use an Existing Identity (既存のアイデンティティを使用)] をクリックします。次に、[Your Identities (使用しているアイデンティティ)] リストでアイデンティティを選択します。

    注記

    オリジンアクセスアイデンティティが既にある場合は、それを再利用し、メンテナンスを簡素化することをお勧めします。

    アイデンティティを作成する場合は、[Create a New Identity (新しいアイデンティティの作成)] をクリックします。必要に応じて、[コメント] フィールドのバケット名をカスタムの説明に置き換えることができます。

  7. CloudFront で、オリジンアクセスアイデンティティに、[オリジンドメイン名] で指定した Amazon S3 バケット内のファイルの読み取りアクセス許可を自動的に付与するには、[Yes, Update Bucket Policy (はい、バケットポリシーを更新します)] をクリックします。

    重要

    [Yes, Update Bucket Policy (はい、バケットポリシーを更新します)] を選択すると、CloudFront は、指定されたオリジンアクセスアイデンティティにバケット内のファイルの読み取りアクセス許可を付与するようにバケットのアクセス許可を更新します。ただし、CloudFront は既存の許可を削除しません。現在、Amazon S3 URL を使用してバケット内のファイルにアクセスするためのアクセス許可が付与されているユーザーのアクセス許可は、CloudFront がバケットのアクセス許可を更新した後も付与されたままです。既存のバケット許可を表示または削除するには、Amazon S3 によって提供される方法を使用します。詳細については、「オリジンアクセスアイデンティティに Amazon S3 バケット内のファイルの読み取りアクセス許可を付与する」を参照してください。

    Amazon S3 バケットに対する許可を手動で更新する場合は、[No, I Will Update Permissions (いいえ、自分でアクセス許可を更新します)] を選択します。

  8. [Yes, Edit (はい、編集します)] を選択します。

  9. 複数のオリジンがある場合は、オリジンのオリジンアクセスアイデンティティを追加するステップをひとつずつ繰り返します。

CloudFront API を使用してオリジンアクセスアイデンティティを作成する

オリジンアクセスアイデンティティが既にあり、別のオリジンアクセスアイデンティティを作成するのではなくそれを再利用する場合は、このステップをスキップして「CloudFront API を使用してディストリビューションにオリジンアクセスアイデンティティを追加する」に進んでください。

CloudFront API を使用して CloudFront オリジンアクセスアイデンティティを作成するには、POST Origin Access Identity API アクションを使用します。レスポンスに新しいオリジンアクセスアイデンティティの IdS3CanonicalUserId が含まれます。これらの値をプロセスの後半で使用するため、これらの値を書き留めておきます。

  • Id エレメントId エレメントの値を使用して、オリジンアクセス ID をディストリビューションと関連付けます。

  • S3CanonicalUserId 要素 – CloudFront に Amazon S3 バケットまたはファイルへのアクセスを付与する場合に S3CanonicalUserId 要素の値を使用します。

詳細については、『Amazon CloudFront API リファレンス』の「CreateCloudFrontOriginAccessIdentity」を参照してください。

CloudFront API を使用してディストリビューションにオリジンアクセスアイデンティティを追加する

CloudFront API を使用して、CloudFront オリジンアクセスアイデンティティを既存のディストリビューションに追加したり、オリジンアクセスアイデンティティを含む新しいディストリビューションを作成したりできます。どちらの場合も、OriginAccessIdentity エレメントを含めます。この要素には、オリジンアクセスアイデンティティの作成時に Id API アクションによって返された POST Origin Access Identity 要素の値が含まれます。OriginAccessIdentity 要素は 1 つ以上のオリジンに追加することができます。

Amazon CloudFront API リファレンス」の以下のトピックを参照してください。

  • 新しいウェブディストリビューションを作成する – 「CreateDistribution

  • 既存のウェブディストリビューションを更新する – 「UpdateDistribution

オリジンアクセスアイデンティティに Amazon S3 バケット内のファイルの読み取りアクセス許可を付与する

ディストリビューションの作成または更新を行う場合、オリジンアクセスアイデンティティを追加するとともに、オリジンアクセスアイデンティティにバケットへのアクセス権限を与えるようにバケットポリシーを自動的に更新できます。また、バケットポリシーまたは ACL を手動で変更するように選択することもできます。ACL とは、バケット内の個々のファイルに対するアクセス許可を制御するものです。

どちらの方法を使用する場合も、バケットに対するバケットポリシーと、ファイルに対するアクセス許可を見直して、以下の点を確認する必要があります。

  • CloudFront を使用してファイルを要求するユーザーに代わって、CloudFront がバケット内のファイルにアクセスできること。

  • ユーザーが Amazon S3 URL を使用してファイルにアクセスできないこと。

重要

CloudFront がサポートするすべての HTTP 方式を CloudFront で受信して Amazon S3 に転送するよう設定した場合、Amazon S3 コンテンツへのアクセスを制限する CloudFront オリジンアクセスアイデンティティを作成し、そのオリジンアクセスアイデンティティに必要なアクセス許可を付与します。たとえば、PUT メソッドを使用したいので、上記のメソッドを受け入れて転送するように CloudFront を構成するという場合は、削除すべきでないリソースをユーザーが削除できないように、DELETE リクエストを適切に処理する Amazon S3 バケットポリシーまたは ACL を構成する必要があります。

次の点に注意してください。

  • アクセス許可を更新しなくてもファイルをバケットに追加できるため、ACL を更新するよりも Amazon S3 バケットポリシーを更新するほうが簡単な場合があります。ただし、ACL を使用すると、各ファイルに対するアクセス許可を付与できるため、より詳細な制御が可能になります。

  • デフォルトでは、Amazon S3 バケットと、バケット内のすべてのファイルはプライベートです — バケット内のファイルへの読み取りまたは書き込みのアクセス許可を持つのはそのバケットを作成した AWS アカウントだけです。

  • オリジンアクセスアイデンティティを既存のディストリビューションに追加する場合、バケットポリシーまたはすべてのファイル ACL を必要に応じて変更し、ファイルがパブリックに公開されないようにします。

  • Amazon S3 バケットのコンテンツを引き続き更新できるように、追加の許可を 1 つ以上のセキュア管理者アカウントに付与します。

重要

Amazon S3 のアクセス権限への変更を保存してから変更が有効になるまでわずかな遅延が生じる場合があります。変更が有効になるまでは、バケット内のファイルにアクセスしようとすると、アクセス許可が拒否されたことを示すエラーが表示されることがあります。

Amazon S3 バケットポリシーを更新する

Amazon S3 バケットポリシーを更新するには、AWS マネジメントコンソール または Amazon S3 API を使用します。

  • バケットに対する必要なアクセス許可を CloudFront オリジンアクセスアイデンティティに付与します。

    オリジンアクセスアイデンティティを指定するには、CloudFront コンソールの [Origin Access Identity (オリジンアクセスアイデンティティ)] ページにある [Amazon S3 Canonical User ID (正規ユーザー ID)] の値を使用します。CloudFront API を使用する場合は、オリジンアクセスアイデンティティの作成時に返された S3CanonicalUserId エレメントの値を使用します。

  • Amazon S3 URL を使用したアクセスが望まれないすべてのユーザーへのアクセスを拒否します。

詳しくは、Amazon Simple Storage Service 開発者ガイド の「バケットポリシーとユーザーポリシーの使用」を参照してください。

たとえば、同じ Amazon Simple Storage Service 開発者ガイド にあるトピック「バケットポリシーの例」の「Amazon CloudFront オリジンアイデンティティへのアクセス許可の付与」を参照してください。

Amazon S3 ACL を更新する

AWS マネジメントコンソール または Amazon S3 API を使用して、Amazon S3 ACL を変更します。

  • CloudFront ディストリビューションによって供給される各ファイルに対する必要なアクセス許可を CloudFront オリジンアクセスアイデンティティに付与します。

    オリジンアクセスアイデンティティを指定するには、CloudFront コンソールの [Origin Access Identity (オリジンアクセスアイデンティティ)] ページにある [Amazon S3 Canonical User ID (正規ユーザー ID)] の値を使用します。CloudFront API を使用する場合は、オリジンアクセスアイデンティティの作成時に返された S3CanonicalUserId エレメントの値を使用します。

  • Amazon S3 URL を使用したアクセスが望まれないすべてのユーザーへのアクセスを拒否します。

別の AWS アカウントでファイルをバケットにアップロードする場合、そのアカウントはファイルの所有者です。バケットポリシーは、バケット所有者が所有するファイルにのみ適用されます。つまり、別のアカウントでファイルをバケットにアップロードする場合、OAI 用に作成されたバケットポリシーはそれらのファイルでは評価されません。

詳細については、Amazon Simple Storage Service 開発者ガイド の「ACL によるアクセス管理」を参照してください。

AWS SDK の 1 つを使用して、ACL をプログラムで変更することもできます。たとえば、「C# と .NET Framework を使用して URL 署名を作成する」にあるダウンロード可能なサンプルコードを参照してください。

署名バージョン 4 のみをサポートする Amazon S3 リージョンでのオリジンアクセスアイデンティティの使用

新しい Amazon S3 リージョンでは、認証済みリクエストに対して署名バージョン 4 を使用する必要があります(各 Amazon S3 リージョンでサポートされている署名のバージョンについては、アマゾン ウェブ サービス全般のリファレンス の「リージョンとエンドポイント」の「Amazon Simple Storage Service (S3)」を参照してください。) ただし、オリジンアクセスアイデンティティを作成して CloudFront ディストリビューションに追加する場合、CloudFront は Amazon S3 バケット内のファイルをリクエストする場合、通常、認証に署名バージョン 4 を使用します。オリジンアクセスアイデンティティを使用しており、認証に署名バージョン 4 が必要なリージョンの 1 つにある場合、以下の点に注意してください。

  • DELETEGETHEADOPTIONS、および PATCH リクエストは条件なしでサポートされます。

  • CloudFront に PUT リクエストを送信してファイルを Amazon S3 バケットにアップロードする場合は、リクエストに x-amz-content-sha256 ヘッダーを追加する必要があり、ヘッダー値にはリクエストの本文の SHA256 ハッシュが含まれている必要があります。詳細については、Amazon Simple Storage Service API Reference の「一般的なリクエストヘッダー」ページで x-amz-content-sha256 ヘッダーのドキュメントを参照してください。

  • POST リクエストはサポートされません。