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

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

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

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

概要

このパターンは、オブジェクトのダウンロード用に安全なカスタム署名付き URLs を作成することで、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 などのキーを使用します。この設計では、署名付き URLs を生成するための API と Amazon S3 エンドポイントを 1 つのドメインに一元化し、2 つの静的 IP アドレスを持つアクセラレーターにリンクします。そのため、ユーザーは署名付き URLs を簡単にリクエストし、静的 IP アドレスを持つ統合ドメインエンドポイントを介して Amazon S3 オブジェクトをダウンロードすることができます。

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

前提条件と制限

前提条件

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

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

  • AWS リージョン 選択した で AWS Certificate Manager (ACM) にインポートされたドメイン

制約事項

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

  • 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 アドレスのプロビジョニング。

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

  • 登録されたカスタムドメイン名と一致するバケット名を持つ 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 は、仮想プライベートクラウド (VPCs) から VPC 外のサービスへの一方向のプライベート接続を作成するのに役立ちます。

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

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

その他のツール

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

コードリポジトリ

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

ベストプラクティス

  • 本番環境のセキュリティを強化するには、Amazon Cognito などの認可メカニズムを実装して、PresignedUrl生成 API へのアクセスを制限することが重要です。

  • 最小特権の原則に従い、タスクの実行に必要な最小限のアクセス許可を付与します。詳細については、IAM ドキュメントの「最小特権の付与」と「セキュリティのベストプラクティス」を参照してください。

エピック

タスク説明必要なスキル

ドメイン名を決定します。

統合 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) が完了したら、 のvpc_id値を出力の VPC ID 2.apigw_s3_lambda/apg.tfvarsで更新します。

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

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

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

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

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

ネットワークリソースをプロビジョニングします。

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

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

apply コマンドの実行中に、プロンプトが表示されたら「はい」と入力します。

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', };

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

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

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

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

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

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

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

スタックをデプロイします。

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

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

エンドポイントの IP アドレスを確認します。

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

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

後でダウンロードできるテストファイルをアップロードします。

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

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

API を呼び出して、署名付き URL を生成します。

署名付き 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 InterfaceAWS 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}に置き換えます。,/p>

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

関連リソース

AWS ブログ