View a markdown version of this page

静的 IP アドレスに関連付けられたエンドポイントを使用して、Amazon S3 の署名付き URL の生成とオブジェクトのダウンロードを統合する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

静的 IP アドレスに関連付けられたエンドポイントを使用して、Amazon S3 の署名付き URL の生成とオブジェクトのダウンロードを統合する

Song Jin、Eunhye Jo、Jun Soung Lee (Amazon Web Services)

概要

このパターンは、オブジェクトのダウンロード用に安全なカスタム署名付き URL を作成することで、Amazon Simple Storage Service (Amazon S3) へのアクセスを簡素化します。このソリューションは、一意のドメインと静的 IP アドレスを持つ、単一のエンドポイントを提供します。これは、API エンドポイントと Amazon S3 エンドポイントの両方を、静的 IP アドレスを持つ統合ドメインに集約する必要があるユーザー向けにカスタマイズされています。このユースケースでは、ユーザーが IP とドメインの許可リストのファイアウォールポリシーに従い、API アクセスを特定のドメインと IP アドレスに制限します。

このアーキテクチャでは AWS のサービス、Amazon API Gateway AWS Global Accelerator、 AWS Lambda Application Load Balancer AWS PrivateLink、Amazon S3 などのキーを使用します。この設計では、署名付き URL を生成するための API と Amazon S3 エンドポイントを 1 つのドメインに一元化し、2 つの静的 IP アドレスを持つアクセラレーターにリンクします。これにより、ユーザーが署名付き URL をリクエストし、静的 IP アドレスを持つ統合ドメインエンドポイントを介して Amazon S3 オブジェクトをダウンロードする一連の流れがスムーズになります。

このアーキテクチャは、厳格なポリシーやコンプライアンス要件を持つ、公共部門、医療、金融などのユーザーにとって特に有益です。

前提条件と制限

前提条件

  • アクティブな AWS アカウント

  • カスタムドメインのパブリックホストゾーン

  • AWS リージョン 任意の で AWS Certificate Manager (ACM) にインポートされたドメイン

制限事項

  • Amazon S3 バケット名はエンドポイントのドメイン名と一致する必要があります。この要件の目的は、単一の API エンドポイント経由で Amazon S3 エンドポイントにサービスを提供できるようにすることです。

  • API Gateway で使用されるカスタムドメイン名は、単一の API エンドポイントのドメイン名と一致する必要があります。

  • 一部の AWS のサービス は では使用できません AWS リージョン。利用可能なリージョンについては、「AWS サービス (リージョン別)」を参照してください。特定のエンドポイントについては、「サービスエンドポイントとクォータ」を参照して、サービスのリンクを選択してください。

アーキテクチャ

次の図は、このパターンのターゲットアーキテクチャとワークフローを示したものです。

署名付き URL の生成とオブジェクトのダウンロードのためのコンポーネントとワークフロー。

この図は、次の概念とワークフローを示しています。

  1. ユーザーは、カスタムドメイン名と関連する IP アドレスを使用して AWS Global Accelerator、 を通じて提供されるカスタムエンドポイントを使用して署名付き URL を生成するリクエストを開始します。

  2. Lambda 関数は、カスタムエンドポイントを指す署名付き URL を生成します。生成された署名付き URL を含む 301 リダイレクトで応答します。ユーザーはリダイレクトされた署名付き URL を通じて、Global Accelerator から提供されるカスタムエンドポイントを使用し、オブジェクトを自動的にダウンロードします。

署名付き URL を生成し、オブジェクトをダウンロードするワークフローのアーキテクチャ全体のコンポーネントは、次のとおりです。

  • Global Accelerator による静的 IP アドレスのプロビジョニング。

  • アクセラレーターのエイリアスを、Amazon Route 53 パブリックホストゾーンに A レコードとしてカスタムドメイン名で登録。

  • 登録されたカスタムドメイン名と一致するバケット名を持つ Amazon S3 バケットの作成。

  • API Gateway と Amazon S3 サービスの VPC エンドポイントの作成。

  • Global Accelerator に接続するための内部向け Application Load Balancer の設定。

  • ACM 証明書がアタッチされた API Gateway のカスタムドメイン名の割り当て。

  • Lambda 関数と統合されたプライベート API Gateway のデプロイ。

  • Lambda 関数には、 AWS Identity and Access Management (IAM) ロールがアタッチされています (GetObject アクセス許可があります)。

ツール

AWS のサービス

  • Amazon API Gateway は、任意のスケールで REST、HTTP、WebSocket API を作成、公開、維持、監視、保護する上で役立ちます。

  • Application Load Balancer は、複数のアベイラビリティーゾーンにある Amazon Elastic Compute Cloud (Amazon EC2) インスタンスなどの複数のターゲットに、受信するアプリケーショントラフィックを分散します。

  • AWS Certificate Manager (ACM) は、 AWS ウェブサイトとアプリケーションを保護するパブリックおよびプライベート SSL/TLS X.509 証明書とキーの作成、保存、更新に役立ちます。

  • AWS Cloud Development Kit (AWS CDK) は、コードで AWS クラウド インフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。

  • AWS Global Accelerator は、複数の AWS リージョンのエンドポイントをサポートするグローバルサービスです。 AWS グローバルネットワーク経由で最適なエンドポイントにトラフィックを誘導するアクセラレーターを作成できます。これにより、世界中のユーザーが使用するインターネットアプリケーションの可用性とパフォーマンスが向上します。

  • AWS Identity and Access Management (IAM) は、誰を認証し、誰に使用する権限を付与するかを制御することで、 AWS リソースへのアクセスを安全に管理するのに役立ちます。

  • AWS Lambda は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • AWS PrivateLink は、仮想プライベートクラウド (VPC) から VPC 外のサービスへの一方向のプライベート接続を確立するのに役立ちます。

  • Amazon Route 53 は、高可用性でスケーラブルな DNS ウェブサービスです。

  • Amazon Simple Storage Service (Amazon S3) は、どのようなデータ量であっても、データを保存、保護、取得することを支援するクラウドベースのオブジェクトストレージサービスです。

その他のツール

  • Terraform は HashiCorp の infrastructure as code (IaC) ツールで、クラウドとオンプレミスのリソースの作成と管理を支援します。

コードリポジトリ

このパターンは、必要に応じて AWS CDK または Terraform を使用してデプロイできます。「エピック」セクションには、両方のデプロイ方法の手順を記載しています。このパターンのコードは、GitHub 内の以下のリポジトリで入手できます。

ベストプラクティス

エピック

タスク説明必要なスキル

ドメイン名の決定

統合 Amazon S3 エンドポイントのパブリックドメイン名を決定します。このドメイン名は Amazon S3 バケット名としても使用されます。

AWS 管理者、ネットワーク管理者

パブリックホストゾーンの作成

Amazon Route 53 にパブリックホストゾーンを作成します。このドメイン名は、API Gateway で使用されるドメイン名と一致する必要があります。

AWS 管理者、ネットワーク管理者

SSL 証明書の準備

AWS Certificate Manager (ACM) を使用して、ウェブアプリケーションドメインの SSL 証明書をリクエストまたはインポートします。

AWS 管理者、ネットワーク管理者
タスク説明必要なスキル

Terraform 開発環境の設定

開発環境を設定するには、以下を実行します。

  1. Terraform バージョン 1.0 以降をインストールします。

  2. ターミナルウィンドウで次のコマンドを実行して、GitHub s3-presignedurl-staticips-endpoint-with-terraform リポジトリのクローンを作成します。

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-terraform.git

AWS 管理者、クラウド管理者

.tfvars および provider.tf ファイルの変更

  1. 必要な .tfvars ファイルの作成 – 1.vpc_alb_ga2.apigw_s3_lambda ディレクトリの両方に apg.tfvars ファイルを作成します。これらのファイルには、環境固有の変数値が含まれます。

    • 1.vpc_alb_ga/apg.tfvars では、次のテンプレートを使用してファイルを作成します。

      hcl environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
    • 2.apigw_s3_lambda/apg.tfvars では、次のテンプレートを使用してファイルを作成します (ステップ 1 を完了した後に vpc_id を更新する必要があります)。

      hcl vpc_id = "vpc-xxxxxxxxx" # Update this with the VPC ID output from step 1 environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
  2. ファイルの変更 provider.tf 1.vpc_alb_ga2.apigw_s3_lambdaフォルダの両方で、ローカル AWS 設定に合わせてprovider.tfファイルを編集します。

    hcl provider "aws" { region = "ap-northeast-2" # Change to your preferred region profile = "apg" # Change to your AWS profile name }

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

  • .tfvars ファイルの各プレースホルダーの値は、それぞれ実際の値に置き換えます。

  • 最初の Terraform のデプロイ (1.vpc_alb_ga) が完了したら、2.apigw_s3_lambda/apg.tfvarsvpc_id 値を出力の VPC ID で更新します。

  • provider.tf ファイル内の AWS プロファイル名がファイル内の既存のプロファイルと一致していることを確認します~/.aws/credentials

  • ドメイン値は、Route 53 ホストゾーンドメインと一致する必要があります。

  • s3_bucket_prefix をドメインと組み合わせて、Amazon S3 バケット名が作成されます (例: your-bucket-prefix.your-domain.com)。

  • aws_region を変更する場合は、選択した AWS リージョンに合わせて、main.tf ファイル内にハードコードされたアベイラビリティーゾーンも適宜更新します。

AWS 管理者、クラウド管理者

ネットワークリソースのプロビジョニング

ネットワークリソースをプロビジョニングするには、次のコマンドを実行します。

cd ./2.vpc_alb_ga terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars

apply コマンドの実行中、確認を求められたら「yes」と入力します。

AWS 管理者、クラウド管理者

API Gateway、Amazon S3、Lambda のプロビジョニング

ネットワークリソースをプロビジョニングするには、次のコマンドを使用します。

cd ./2.apigw_s3_lambda terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars
AWS 管理者、クラウド管理者
タスク説明必要なスキル

AWS CDK 開発環境を設定します。

開発環境を設定するには、以下を実行します。

  1. をインストールします AWS CDK。

  2. ターミナルウィンドウで次のコマンドを実行して、GitHub s3-presignedurl-staticips-endpoint-with-cdk リポジトリのクローンを作成します。

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-cdk.git

AWS 管理者、クラウド管理者

config/index.ts ファイルでドメイン設定を指定する

定数変数のオプションを編集するには、次のコマンドを使用します。

export const options = { certificateArn: '{arn of the acm which created before}', dnsAttr: { zoneName: '{public hosted zone name}', hostedZoneId: 'hosted zone Id', }, domainNamePrefix: '{Prefix for the domain}', presignPath: 'presign', objectsPath: 'objects', };

コマンドの各プレースホルダーを、必要な情報に置き換えます。

  • '{arn of the acm which created before}' を、ACM 証明書の Amazon リソースネーム (ARN) に置き換えます。

  • '{public hosted zone name}' を独自のドメイン名に置き換えます。

  • 'hosted zone Id'を Route 53 のホストゾーン ID に置き換えます。

  • '{Prefix for the domain}' を、使用するドメインプレフィックスに置き換えます。

  • 必要に応じて、特定のユースケースに基づき 'presign' および 'objects' パスを変更します。

AWS 管理者、クラウド管理者

スタックのデプロイ

仮想プライベートクラウド (VPC) 用とアプリケーション用の 2 つのスタックをデプロイするには、次のコマンドを使用します。

$ npm install $ cdk synth $ cdk deploy --all
AWS 管理者、クラウド管理者
タスク説明必要なスキル

エンドポイントの IP アドレスの確認

このパターンのドメインに静的 IP アドレスがあることを確認するには、次のコマンドを使用します。

nslookup ${s3-bucket-prefix}.${domain}
ネットワーク管理者

後からダウンロード可能なテストファイルをアップロード

テストファイルを、Amazon S3 バケットの '/objects' フォルダにアップロードします。

AWS 管理者、クラウド管理者

署名付き URL を生成する API を起動

署名付き URL を生成するには、ブラウザまたは API クライアント (Postman など) から次の形式で URL を呼び出します。

https://${s3-bucket-prefix}.${domain}/presign/objects/${uploaded-filename}

${s3-bucket-prefix} および ${domain} のプレースホルダー値を、前のステップで設定した各値に置き換えます。

アプリ所有者

結果を確認

期待される結果は、301 (Moved Permanently) リダイレクトステータスコードを受け取ることです。このレスポンスには、テストファイルのダウンロードを自動的に開始する署名付き URL が含まれます。

テストエンジニア
タスク説明必要なスキル

API Gateway、Amazon S3、および Lambda リソースの破棄

次のコマンドを使用して、各リソースを削除します。

cd ./2.apigw_s3_lambda terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
AWS 管理者、クラウド管理者

ネットワークリソースの破棄

次のコマンドを使用して、各ネットワークリソースを削除します。

cd ./1.vpc_alb_ga terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
AWS 管理者、クラウド管理者
タスク説明必要なスキル

スタックの破棄

VPC スタックとアプリケーションスタックの両方を破棄するには、次のコマンドを使用します。

$ cdk destroy --all
AWS 管理者、クラウド管理者

Amazon S3 バケットを空にして削除する

デフォルトでは削除されない、オブジェクトの Amazon S3 バケットとログの Amazon S3 バケットをにして削除します。

これらの Amazon S3 バケット名は ${s3-bucket-prefix}.${domain}${s3-bucket-prefix}.${domain}-logs です。

バケットの削除に AWS Command Line Interface (AWS CLI) を使用する場合は、次のコマンドを使用します。

$ aws s3 rm s3://${s3-bucket-prefix}.${domain} --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain} --force $ aws s3 rm s3://${s3-bucket-prefix}.${domain}-logs --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain}-logs --force

${s3-bucket-prefix}${domain} を、前のステップで設定した値に置き換えます。

AWS 管理者、クラウド管理者

関連リソース

AWS ブログ