CloudFront 経由で S3 から転送する

Amazon S3 からの転送では、 Amazon CloudFront ディストリビューションを下り(外向き)パスとして使用できます。

下り(外向き)パスとして CloudFront を使用しても、S3 オブジェクトは一般に公開されません。詳しくは、CloudFront を使用するとオブジェクトは一般に公開されますか?をご覧ください。

概要

CloudFront 経由で S3 データを転送するには、次の操作を行います。

IAM 権限を構成する

エージェントレス転送権限の手順に沿って、必要な Google Cloud 権限を付与します。

S3 バケットへのアクセスを構成する

送信元へのアクセスを構成する: Amazon S3 の手順に沿って、Amazon S3 内のデータへのアクセスを構成します。

S3 バケットに CloudFront ディストリビューションを作成する

  1. AWS アカウントで CloudFront に移動します。
  2. [Create a CloudFront distribution] をクリックします。
  3. [Origin domain] で、S3 バケットを選択します。
  4. [Origin path] は空のままにする必要があります。
  5. 自動入力された [Origin name] をそのまま使用するか、独自の値を指定します。
  6. [Origin access] セクションで、[Public] を選択します。この設定はバケットを公開しません。代わりに、アクセス メカニズムが構成されないことを CloudFront に伝えます。
  7. [Cache key and origin requests] セクションで、次の操作を行います。
    1. [Cache policy] で、[CachingDisabled] を選択します。これにより、CloudFront がリクエストをキャッシュに保存して未認証の閲覧者に配信することを防止できます。
    2. [Origin request policy] で、[AllViewerExceptHostHeader] を選択します。これにより、CloudFront が認証ヘッダーを S3 に転送できるようになるため、Storage Transfer Service は安全な認証情報を使用してバケットにアクセスできます。
  8. [Web Application Firewall(WAF)] セクションで、[Do not enable] を選択します。
  9. 必要に応じて、料金クラスを選択します。Storage Transfer Service は、ソースバケットのリージョンに基づいてワーカープールを選択するため、そのリージョンで CloudFront の料金が発生します。最適な価格にするためには、ソースバケットが米国またはヨーロッパに存在するようにするか、CloudFront の料金クラスとして [Use only North America and Europe] を選択します。
  10. [Create CloudFront Distribution] をクリックします。

    正常に作成されると、CloudFront のディストリビューションの詳細ページが表示されます。

  11. ディストリビューション ドメイン名をメモします。例: https://dy1h2n3l4ob56.cloudfront.net。詳細ページのディストリビューション ドメイン名の前に https:// プロトコルがない場合は、転送ジョブの作成時に自分でプロトコルを追加する必要があります。

転送ジョブを作成する

CloudFront ディストリビューションを介した転送は、 Cloud de Confiance コンソール と REST API でサポートされています。

転送ジョブ名に、個人を特定できる情報(PII)やセキュリティ データなどの機密情報を含めないでください。リソース名は、他の Google Cloud リソースの名前に反映され、プロジェクト外部の Google 内部システムに公開される場合があります。

Cloud de Confiance コンソール

コンソールを使用して転送を作成するには、転送を作成するの手順に沿って操作します。 Cloud de Confiance

CloudFront ドメインの入力を求められたら、前のセクションでメモしたディストリビューション ドメイン名を入力します。この値は、アマゾン ウェブ サービス(AWS)コンソールの CloudFront セクションでも確認できます。形式は https://dy1h2n3l4ob56.cloudfront.net です。

REST API

REST API を使用して転送を作成するには、転送の作成ページの例に従ってください。

ディストリビューション ドメイン名を transferSpec.awsS3DataSource.cloudfrontDomain フィールドの値として指定します。

"transferSpec": {
  "awsS3DataSource": {
    "bucketName": "AWS_SOURCE_NAME",
    "cloudfrontDomain": "https://dy1h2n3l4ob56.cloudfront.net",
    "awsAccessKey": {
      "accessKeyId": "AWS_ACCESS_KEY_ID",
      "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
    }
  },
  ...
}

トラブルシューティング

AuthorizationHeaderMalformed エラー

リージョンの不一致(the region 'Location A' is wrong; expecting 'Location B' など)を指定する AuthorizationHeaderMalformed エラーが発生した場合は、サポートされていない CloudFront 構成が原因である可能性があります。

このエラーは、単一の CloudFront ディストリビューションを使用して、異なる AWS リージョンに存在する複数の S3 バケットをフロントエンドに配置する場合に発生します。

この問題を解決するには、各 CloudFront ディストリビューションが単一の AWS リージョン内の S3 バケットのみをフロントエンドに配置していることを確認します。異なるリージョンに S3 バケットがある場合は、リージョンごとに個別の CloudFront ディストリビューションを作成します。

よくある質問

CloudFront を使用するとオブジェクトは一般に公開されますか?

いいえ。このページの構成手順に従っている場合、オブジェクトは一般に公開されません。

  • Cloudfront は S3 オブジェクトに直接アクセスできません。
  • ユーザがオブジェクトに直接アクセスしようとするか、(バケットが非公開の場合に)CloudFront を介してアクセスしようとすると、permission denied エラーが発生します。
  • Storage Transfer Service は、転送ジョブで指定した認証情報を使用して CloudFront へのリクエストに署名します。これにより、S3 から直接ダウンロードする場合と同様にオブジェクトを安全にダウンロードできます。これが機能するのは、ヘッダー転送設定 AllViewerExceptHostHeader があるためです。