

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

# 静的 IP アドレスに関連付けられたエンドポイントを使用して、Amazon S3 の署名付き URL の生成とオブジェクトのダウンロードを統合する
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses"></a>

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

## 概要
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-summary"></a>

このパターンは、オブジェクトのダウンロード用に安全なカスタム署名付き 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 オブジェクトをダウンロードする一連の流れがスムーズになります。

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

## 前提条件と制限
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント
+ カスタムドメインのパブリックホストゾーン
+  AWS リージョン 任意の で AWS Certificate Manager (ACM) にインポートされたドメイン

**制限事項**
+ Amazon S3 バケット名はエンドポイントのドメイン名と一致する必要があります。この要件の目的は、単一の API エンドポイント経由で Amazon S3 エンドポイントにサービスを提供できるようにすることです。
+ API Gateway で使用されるカスタムドメイン名は、単一の API エンドポイントのドメイン名と一致する必要があります。
+ 一部の AWS のサービス は では使用できません AWS リージョン。利用可能なリージョンについては、「[AWS サービス (リージョン別)](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)」を参照してください。特定のエンドポイントについては、「[サービスエンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)」を参照して、サービスのリンクを選択してください。

## アーキテクチャ
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-architecture"></a>

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

![\[署名付き URL の生成とオブジェクトのダウンロードのためのコンポーネントとワークフロー。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/e19ebcb5-2138-481e-952e-3cfee9ad9e97/images/effd197c-d4d7-4990-8b66-3eb1c64aab4c.png)


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

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

1. 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](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) アクセス許可があります）。

## ツール
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-tools"></a>

**AWS のサービス**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) は、任意のスケールで REST、HTTP、WebSocket API を作成、公開、維持、監視、保護する上で役立ちます。
+ [Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/) は、複数のアベイラビリティーゾーンにある Amazon Elastic Compute Cloud (Amazon EC2) インスタンスなどの複数のターゲットに、受信するアプリケーショントラフィックを分散します。
+ [AWS Certificate Manager (ACM)](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) は、 AWS ウェブサイトとアプリケーションを保護するパブリックおよびプライベート SSL/TLS X.509 証明書とキーの作成、保存、更新に役立ちます。
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) は、コードで AWS クラウド インフラストラクチャを定義およびプロビジョニングするのに役立つソフトウェア開発フレームワークです。
+ [AWS Global Accelerator](https://docs.aws.amazon.com/global-accelerator/latest/dg/what-is-global-accelerator.html) は、複数の AWS リージョンのエンドポイントをサポートするグローバルサービスです。 AWS グローバルネットワーク経由で最適なエンドポイントにトラフィックを誘導するアクセラレーターを作成できます。これにより、世界中のユーザーが使用するインターネットアプリケーションの可用性とパフォーマンスが向上します。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) は、誰を認証し、誰に使用する権限を付与するかを制御することで、 AWS リソースへのアクセスを安全に管理するのに役立ちます。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
+ [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) は、仮想プライベートクラウド (VPC) から VPC 外のサービスへの一方向のプライベート接続を確立するのに役立ちます。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) は、高可用性でスケーラブルな DNS ウェブサービスです。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) は、どのようなデータ量であっても、データを保存、保護、取得することを支援するクラウドベースのオブジェクトストレージサービスです。

**その他のツール**
+ [Terraform](https://www.terraform.io/) は HashiCorp の infrastructure as code (IaC) ツールで、クラウドとオンプレミスのリソースの作成と管理を支援します。

**コードリポジトリ**

このパターンは、必要に応じて AWS CDK または Terraform を使用してデプロイできます。「[エピック](#consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-epics)」セクションには、両方のデプロイ方法の手順を記載しています。このパターンのコードは、GitHub 内の以下のリポジトリで入手できます。
+ **AWS CDK** – [s3-presignedurl-staticips-endpoint-with-cdk](https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-cdk)
+ **Terraform** – [s3-presignedurl-staticips-endpoint-with-terraform](https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-terraform)

## ベストプラクティス
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-best-practices"></a>
+ 本番環境のセキュリティを強化するには、[Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) などの認可メカニズムを実装して、`PresignedUrl` 生成 API へのアクセスを制限することが重要です。
+ 最小特権の原則に従い、タスクの実行に必要最小限のアクセス許可を付与します。詳細については、IAM ドキュメントの「[最小限の特権を認める。](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)」と「[IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」を参照してください。

## エピック
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-epics"></a>

### 環境の準備
<a name="prepare-the-environment"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ドメイン名の決定 | 統合 Amazon S3 エンドポイントのパブリックドメイン名を決定します。このドメイン名は Amazon S3 バケット名としても使用されます。 | AWS 管理者、ネットワーク管理者 | 
| パブリックホストゾーンの作成 | Amazon Route 53 に[パブリックホストゾーン](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingHostedZone.html)を作成します。このドメイン名は、API Gateway で使用されるドメイン名と一致する必要があります。 | AWS 管理者、ネットワーク管理者 | 
| SSL 証明書の準備 |  AWS Certificate Manager (ACM) を使用して、ウェブアプリケーションドメインの SSL 証明書を[リクエスト](https://docs.aws.amazon.com/acm/latest/userguide/acm-public-certificates.html)または[インポート](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)します。 | AWS 管理者、ネットワーク管理者 | 

### Terraform を使用してパターンをデプロイする
<a name="deploy-the-pattern-with-terraform"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Terraform 開発環境の設定 | 開発環境を設定するには、以下を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 管理者、クラウド管理者 | 
| `.tfvars` および** **`provider.tf` ファイルの変更 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html)次の点に注意してください。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 管理者、クラウド管理者 | 
| ネットワークリソースのプロビジョニング | ネットワークリソースをプロビジョニングするには、次のコマンドを実行します。<pre>cd ./2.vpc_alb_ga<br />terraform init<br />terraform plan --var-file=apg.tfvars<br />terraform apply --var-file=apg.tfvars</pre>`apply ` コマンドの実行中、確認を求められたら「**yes**」と入力します。 | AWS 管理者、クラウド管理者 | 
| API Gateway、Amazon S3、Lambda のプロビジョニング | ネットワークリソースをプロビジョニングするには、次のコマンドを使用します。<pre>cd ./2.apigw_s3_lambda<br />terraform init<br />terraform plan --var-file=apg.tfvars<br />terraform apply --var-file=apg.tfvars</pre> | AWS 管理者、クラウド管理者 | 

### を使用してパターンをデプロイする AWS CDK
<a name="deploy-the-pattern-with-cdk"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  AWS CDK 開発環境を設定します。 | 開発環境を設定するには、以下を実行します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 管理者、クラウド管理者 | 
| `config/index.ts` ファイルでドメイン設定を指定する | 定数変数のオプションを編集するには、次のコマンドを使用します。<pre>export const options = {<br />    certificateArn: '{arn of the acm which created before}',<br />    dnsAttr: {<br />        zoneName: '{public hosted zone name}',<br />        hostedZoneId: 'hosted zone Id',<br />    },<br />    domainNamePrefix: '{Prefix for the domain}',<br />    presignPath: 'presign',<br />    objectsPath: 'objects',<br />};</pre>コマンドの各プレースホルダーを、必要な情報に置き換えます。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses.html) | AWS 管理者、クラウド管理者 | 
| スタックのデプロイ | 仮想プライベートクラウド (VPC) 用とアプリケーション用の 2 つのスタックをデプロイするには、次のコマンドを使用します。<pre>$ npm install <br />$ cdk synth <br />$ cdk deploy --all</pre> | AWS 管理者、クラウド管理者 | 

### パターンをテストする
<a name="test-the-pattern"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| エンドポイントの IP アドレスの確認 | このパターンのドメインに静的 IP アドレスがあることを確認するには、次のコマンドを使用します。<pre>nslookup ${s3-bucket-prefix}.${domain}</pre> | ネットワーク管理者 | 
| 後からダウンロード可能なテストファイルをアップロード | テストファイルを、Amazon S3 バケットの `'/objects'` フォルダにアップロードします。 | AWS 管理者、クラウド管理者 | 
| 署名付き URL を生成する API を起動 | 署名付き URL を生成するには、ブラウザまたは API クライアント ([Postman](https://www.postman.com/product/what-is-postman/) など) から次の形式で URL を呼び出します。<pre>https://${s3-bucket-prefix}.${domain}/presign/objects/${uploaded-filename}</pre>`${s3-bucket-prefix}` および `${domain}` のプレースホルダー値を、前のステップで設定した各値に置き換えます。 | アプリ所有者 | 
| 結果を確認 | 期待される結果は、301 (Moved Permanently) リダイレクトステータスコードを受け取ることです。このレスポンスには、テストファイルのダウンロードを自動的に開始する署名付き URL が含まれます。 | テストエンジニア | 

### Terraform でのクリーンアップ
<a name="clean-up-with-terraform"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| API Gateway、Amazon S3、および Lambda リソースの破棄 | 次のコマンドを使用して、各リソースを削除します。<pre>cd ./2.apigw_s3_lambda<br />terraform init<br />terraform plan --destroy --var-file=apg.tfvars<br />terraform destroy --var-file=apg.tfvars<br /></pre> | AWS 管理者、クラウド管理者 | 
| ネットワークリソースの破棄 | 次のコマンドを使用して、各ネットワークリソースを削除します。<pre>cd ./1.vpc_alb_ga<br />terraform init<br />terraform plan --destroy --var-file=apg.tfvars<br />terraform destroy --var-file=apg.tfvars<br /></pre> | AWS 管理者、クラウド管理者 | 

### でクリーンアップする AWS CDK
<a name="clean-up-with-cdk"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| スタックの破棄 | VPC スタックとアプリケーションスタックの両方を破棄するには、次のコマンドを使用します。<pre>$ cdk destroy --all</pre> | AWS 管理者、クラウド管理者 | 
| Amazon S3 バケットを空にして削除する | デフォルトでは削除されない、オブジェクトの Amazon S3 バケットとログの Amazon S3 バケットを[空](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html)にして[削除](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)します。これらの Amazon S3 バケット名は `${s3-bucket-prefix}.${domain}` と `${s3-bucket-prefix}.${domain}-logs` です。バケットの削除に [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) を使用する場合は、次のコマンドを使用します。<pre>$ aws s3 rm s3://${s3-bucket-prefix}.${domain} --recursive<br />$ aws s3 rb s3://${s3-bucket-prefix}.${domain} --force<br />$ aws s3 rm s3://${s3-bucket-prefix}.${domain}-logs --recursive<br />$ aws s3 rb s3://${s3-bucket-prefix}.${domain}-logs --force</pre>`${s3-bucket-prefix}` と `${domain}` を、前のステップで設定した値に置き換えます。 | AWS 管理者、クラウド管理者 | 

## 関連リソース
<a name="consolidate-amazon-s3-presigned-url-generation-and-object-downloads-by-using-an-endpoint-associated-with-static-ip-addresses-resources"></a>

**AWS ブログ**
+ [が提供する静的 IP アドレスを介した Amazon API Gateway へのアクセス AWS Global Accelerator](https://aws.amazon.com/blogs/networking-and-content-delivery/accessing-an-aws-api-gateway-via-static-ip-addresses-provided-by-aws-global-accelerator/) 
+ [JavaScript AWS CDK 用の署名付き URL をモジュラーで生成する](https://aws.amazon.com/blogs/developer/generate-presigned-url-modular-aws-sdk-javascript/) 
+ [Hosting Internal HTTPS Static Websites with ALB, S3, and PrivateLink](https://aws.amazon.com/blogs/networking-and-content-delivery/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/) 