

# 署名付き URL を使用したオブジェクトのダウンロードおよびアップロード
<a name="using-presigned-url"></a>

バケットポリシーを更新せずに、Amazon S3 内のオブジェクトへの時間制限付きのアクセス権を付与するには、署名付き URL を使用できます。署名付き URL をブラウザに入力するか、プログラムで使用してオブジェクトをダウンロードできます。署名付き URL で使用される認証情報は、URL を生成した AWS Identity and Access Management (IAM) プリンシパルのものです。

また、署名付き URL を使用して、Amazon S3 バケットに対する特定のオブジェクトのアップロードを他のユーザーに許可することもできます。これにより、他のユーザーは AWS のセキュリティ認証情報やアクセス許可を持たなくてもアップロードできます。署名付き URL で指定したのと同じキーを持つオブジェクトがバケット内に既に存在する場合、Amazon S3 は既存のオブジェクトをアップロードしたオブジェクトで置き換えます。

署名付き URL は、有効期限日時まで複数回使用できます。

署名付き URL を作成する場合には、ご自身のセキュリティ認証情報を設定し、さらに次の情報を指定する必要があります。
+ Amazon S3 バケット
+ オブジェクトキー (オブジェクトのダウンロード先は Amazon S3 バケット、アップロード先はアップロード先のファイル名)
+ HTTP メソッド (オブジェクトのダウンロードの `GET`、アップロードの `PUT`、オブジェクトメタデータの読み取りの `HEAD` など)
+ 有効期限の時間間隔

署名付き URL を使用してオブジェクトをアップロードする場合、チェックサムを使用してオブジェクトの整合性を検証できます。AWS 署名バージョン 2 で作成された署名付き URL MD5 チェックサムのみをサポートしていますが、AWS 署名バージョン 4 で作成された署名付き URL、CRC-64/NVME、CRC32、CRC32C、SHA-1、SHA-256 などの追加のチェックサムアルゴリズムをサポートします。これらの追加のチェックサムアルゴリズムを使用するには、AWS 署名バージョン 4 を使用し、アップロードリクエストに適切なチェックサムヘッダーを含めてください。オブジェクトの整合性の詳細については、「[Amazon S3 でのオブジェクトの整合性のチェック](checking-object-integrity.md)」を参照してください。

**Topics**
+ [署名付き URL を作成できるユーザー](#who-presigned-url)
+ [署名付き URL の有効期限](#PresignedUrl-Expiration)
+ [署名付き URL 機能の制限](#PresignedUrlUploadObject-LimitCapabilities)
+ [署名付き URL に関するよくある質問](#PresignedUrlFAQ)
+ [署名付き URL を使用したオブジェクトの共有](ShareObjectPreSignedURL.md)
+ [署名付き URL を使用したオブジェクトのアップロード](PresignedUrlUploadObject.md)

## 署名付き URL を作成できるユーザー
<a name="who-presigned-url"></a>

有効なセキュリティ認証情報を持つすべてのユーザーが、署名付き URL を作成できます。しかし、何らかの理由でオブジェクトに正常にアクセスするには、署名付き URL を使用して行うオペレーションの実行許可を持っているユーザーが、署名付き URL を作成する必要があります。

署名付き URL の作成に使用できる認証情報のタイプは以下のとおりです。
+ **IAM ユーザー** – AWS Signature Version 4 を使用している場合は、最大 7 日間まで有効。

  最大 7 日間有効な署名付き URL を作成するには、まず、署名付き URL の作成に使用するメソッドへの IAM ユーザー認証情報 (アクセスキーとシークレットキー) の委任を行います。
+ **一時的なセキュリティ認証情報** – 有効期間は、認証情報自体の有効期間を超えることはできません。認証情報には以下が含まれます。
  + **IAM ロールの認証情報** – 署名付き URL は、より長い有効期限を指定しても、ロールセッションの有効期限が切れると期限切れになります。
  + **Amazon EC2 インスタンスで使用される IAM ロール認証情報** – ロール認証情報の期間 (通常は 6 時間) 有効です。
  + **AWS Security Token Service 認証情報** – 一時的な認証情報の期間中のみ有効です。

**注記**  
一時的な認証情報を使用して署名付き URL を作成した場合、その認証情報が有効期限切れになると、URL は失効します。一般に、署名付き URL は、作成に使用した認証情報が取り消された場合、削除された場合、または非アクティブ化された場合は、期限切れになります。URL の有効期限がより長い場合でも失効します。一時的なセキュリティ認証情報の有効期間については、*IAM ユーザーガイド*の「[AWS STS API オペレーションの比較](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#stsapi_comparison)」を参照してください。

## 署名付き URL の有効期限
<a name="PresignedUrl-Expiration"></a>

署名付き URL は、URL の生成時に指定した期間にわたって有効です。Amazon S3 コンソールで署名付き URL を作成した場合、有効期限は 1 分から 12 時間の間で設定できます。AWS CLI または AWS SDK を使用する場合、有効期限は最大 7 日間に設定できます。

一時トークンを使用して署名付き URL を作成した場合、そのトークンが有効期限切れになると、URL は期限切れになります。一般に、署名付き URL は、作成に使用した認証情報が取り消された場合、削除された場合、または非アクティブ化された場合は、期限切れになります。URL の有効期限がより長い場合でも失効します。認証情報の使用が有効期限にどのように影響するかについては、「[署名付き URL を作成できるユーザー](#who-presigned-url)」を参照してください。

Amazon S3 は、HTTP リクエスト時に署名付き URL の有効期限日時を確認します。例えば、有効期限が切れる時刻の直前にクライアントが大きなファイルのダウンロードを開始した場合は、ダウンロード中に有効期限時刻が経過しても、そのダウンロードは継続されます。しかし、接続が中断し、クライアントがダウンロードを再開しようとした時点で有効期限切れの時刻が経過している場合には、そのダウンロードは失敗します。

## 署名付き URL 機能の制限
<a name="PresignedUrlUploadObject-LimitCapabilities"></a>

署名付き URL の機能は、それを作成したユーザーの許可によって制限されます。本質的に署名付き URL は、それらを保有しているユーザーに対しアクセスを許可するためのベアラートークンです。そのため、適切に保護することをお勧めします。署名付き URL の使用を制限するために使用できるいくつかの方法を以下に示します。

**AWS Signature Version 4 (SigV4)**  
署名済み URL リクエストが AWS Signature Version 4 (SigV4) により認証される際に実行する特定の動作を適用するには、バケットポリシーとアクセスポイントポリシーで条件キーを使用します。例えば、次のバケットポリシーでは、`s3:signatureAge` 条件を使用することで、署名が作成後 10 分を超えている場合、*amzn-s3-demo-bucket* バケット内のオブジェクトに対する Amazon S3 の署名付き URL リクエストをすべて拒否します。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Deny a presigned URL request if the signature is more than 10 min old",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "NumericGreaterThan": {
                    "s3:signatureAge": "600000"
                }
            }
        }
    ]
}
```

------

AWS Signature Version 4 に関連するポリシーキーの詳細については、「*Amazon Simple Storage Service API リファレンス*」の「[AWS Signature Version 4 認証固有のポリシーキー](https://docs.aws.amazon.com/AmazonS3/latest/API/bucket-policy-s3-sigv4-conditions.html)」を参照してください。

**ネットワークパスでの制限**  
署名付き URL の使用と、特定のネットワークパスへのすべての Amazon S3 アクセスを制限する場合は、AWS Identity and Access Management (IAM) ポリシーを記述できます。これらのポリシーは、呼び出しを作成する IAM プリンシパル、Simple Storage Service (Amazon S3) バケット、またはその両方に設定できます。

IAM プリンシパルでのネットワークパスの制限では、これらの認証情報のユーザーは、指定したネットワークからリクエストを送信する必要があります。バケットまたはアクセスポイントの制限により、そのリソースに対するすべてのリクエストは、指定したネットワークから発信される必要があります。これらの制限は、署名付き URL のシナリオ以外でも適用されます。

どの IAM グローバル条件キーを使用するかは、エンドポイントのタイプによって異なります。Amazon S3 のパブリックエンドポイントを使用している場合は、`aws:SourceIp` を使用します。Amazon S3 への仮想プライベートクラウド (VPC) エンドポイントを使用している場合は、`aws:SourceVpc` または `aws:SourceVpce` を使用します。

次の IAM ポリシーステートメントでは、プリンシパルは、指定されたネットワーク範囲からのみ AWS にアクセスする必要があります。このポリシーステートメントでは、すべてのアクセスがその範囲から発信される必要があります。これは、Amazon S3 の署名付き URL を使用しているユーザーにも当てはまります。この例を実行するには、*`user input placeholders`* をユーザー自身の情報に置き換えます。

```
{
    "Sid": "NetworkRestrictionForIAMPrincipal",
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
        "NotIpAddressIfExists": {"aws:SourceIp": "IP-address-range"},
        "BoolIfExists": {"aws:ViaAWSService": "false"}
    }
}
```

## 署名付き URL に関するよくある質問
<a name="PresignedUrlFAQ"></a>

**Q: 署名付き URL が設定された有効期限より早く期限切れになるのはなぜですか。**  
署名付き URL は、基盤となる認証情報が有効である間のみ有効です。署名付き URL は、設定された有効期限または関連付けられた認証情報の有効期限のいずれか早い方で期限切れになります。Amazon Elastic Container Service タスクまたはコンテナの場合、ロール認証情報は通常 1～6 時間ごとにローテーションされます。AWS Security Token Service (AWS STS) AssumeRole を使用する場合、署名付き URL はロールセッションが終了すると期限切れになります。デフォルトでは 1 時間です。Amazon EC2 インスタンスプロファイルの場合、メタデータ認証情報は定期的にローテーションされ、最大有効期間は約 6 時間です。

**Q: 署名付き URL にアクセスするときに 403 Forbidden エラーが発生するのはなぜですか。**  
署名付き URL を生成する前に、正しいアクセス許可が設定されていることを確認します。URL を生成する IAM ユーザーまたはロールには、特定のオペレーションに必要なアクセス許可 (`s3:GetObject` など) が必要です。さらに、Amazon S3 バケットポリシーがオブジェクトへのアクセスを明示的に拒否していないことを確認します。

**Q: `SignatureDoesNotMatch` エラーが発生しています。この問題を解決する方法を教えてください。**  
Amazon S3 の署名付き URL の使用時に `SignatureDoesNotMatch` エラーが発生した場合は、いくつかの一般的な原因を考慮してください。まず、システムクロックが Network Time Protocol (NTP) サーバーと同期されていることを確認します。わずかな時間のずれでも署名が無効になる可能性があります。次に、一部のコーポレートプロキシはヘッダーまたはクエリ文字列を変更し、署名の不一致を引き起こす可能性があることに注意してください。トラブルシューティングを行うには、プロキシを使用せずにテストを試してください。最後に、HTTP メソッド、ヘッダー、クエリ文字列を含むすべてのリクエストパラメータが、URL の生成と使用の間で正確に一致していることを確認します。これらの問題に対処すると、多くの場合、`SignatureDoesNotMatch` エラーが解決されます。

**Q: `ExpiredToken` エラーが発生しています。どうすればよいですか?**  
署名付き URL の使用中に `ExpiredToken` エラーが発生した場合、それは URL の生成に使用される AWS 認証情報が無効になったことを示します。この問題を解決するには、新しい署名付き URL を生成する前に AWS 認証情報を更新します。長時間実行されるアプリケーションでは、認証情報の更新ロジックを実装して継続的なアクセスを維持することをお勧めします。必要に応じて、存続期間の長い認証情報を使用することも、トークンの更新メカニズムを実装することもできます。AWS Security Token Service (AWS STS) AssumeRole を使用している場合は、設定したセッション期間がユースケースの要件を満たしていることを確認します。署名付き URL は、基盤となる認証情報の期間中のみ有効であるため、適切な認証情報管理の実装が不可欠です。