

# 署名付き URL を使用したオブジェクトのアップロード
<a name="PresignedUrlUploadObject"></a>



署名付き URL を使用して、自分の Amazon S3 バケットにオブジェクトをアップロードすることを他のユーザーに許可できます。署名付き URL を使用すると、他のユーザーは AWS セキュリティ認証情報やアクセス許可を持っていなくてもアップロードできます。署名付き URL は、それを作成したユーザーのアクセス許可によって制限されます。つまり、オブジェクトをアップロードするための署名付き URL を受け取った場合、オブジェクトをアップロードできるのは、署名付き URL の作成者がそのオブジェクトのアップロードに必要なアクセス許可を持っている場合のみです。

この URL を使用してオブジェクトをアップロードすると、Amazon S3 は指定されたバケットにオブジェクトを作成します。署名付き URL で指定したのと同じキーを持つオブジェクトがバケット内に既存する場合、Amazon S3 は既存のオブジェクトをアップロードしたオブジェクトで置き換えます。アップロード後は、バケット所有者がオブジェクトを所有します。

署名付き URL の一般的な情報については、「[署名付き URL を使用したオブジェクトのダウンロードおよびアップロード](using-presigned-url.md)」を参照してください。

AWS Explorer for Visual Studio を使用すると、コードを一切記述せずに、オブジェクトをアップロードするための署名付き URL を作成できます。AWS SDK を使用して署名付き URL をプログラムで生成することもできます。

**注記**  
現時点では、AWS Toolkit for Visual Studio は Visual Studio for Mac をサポートしていません。

## AWS Toolkit for Visual Studio の使用 (Windows)
<a name="upload-object-presignedurl-vsexplorer"></a>

1. 「*AWS Toolkit for Visual Studio ユーザーガイド*」の「[Toolkit for Visual Studio のインストールとセットアップ](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html)」の手順に従って、AWS Toolkit for Visual Studio をインストールします。

1. 「*AWS Toolkit for Visual Studio ユーザーガイド*」の「[Connecting to AWS](https://docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/connect.html)」の手順に従って、AWS に接続します。

1. **[AWS Explorer]** というラベルの左側のパネルで、オブジェクトをアップロードするバケットを右クリックします。

1. **[署名付き URL を作成]** を選択します。

1. ポップアップウィンドウで、署名付き URL の有効期限日時を設定します。

1. **[オブジェクトキー]** で、アップロードするファイルの名前を設定します。アップロードするファイルは、この名前と正確に一致する必要があります。バケットに同じキーを持つオブジェクトがバケット内に既に存在する場合、Amazon S3 は既存のオブジェクトを新しくアップロードしたオブジェクトで置き換えます。

1. **[PUT]** を選択し、この署名付き URL をオブジェクトのアップロードに使用するように指定します。

1. **[生成]** ボタンを選択します。

1. URL をクリップボードにコピーするには、**[コピー]** を選択します。

1. この URL を使用するには、`curl` コマンドを使って PUT リクエストを送信できます。ファイルへのフルパスと署名付き URL 自体を含めます。

   ```
   curl -X PUT -T "/path/to/file" "presigned URL"
   ```

## ファイルをアップロードするための `PUT` 署名付き URL の生成に AWS SDK を使用
<a name="presigned-urls-upload-sdk"></a>

 S3 アクションを期間限定で実行できる署名付き URL を生成できます。

**注記**  
AWS CLI または AWS SDK を使用する場合、署名付き URL の有効期限は最大 7 日間に設定できます。詳細については、「[署名付き URL の有効期限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html#PresignedUrl-Expiration)」を参照してください。

------
#### [ Python ]

 次の Python スクリプトは、オブジェクトを S3 汎用バケットにアップロードするための `PUT` 署名付き URL を生成します。

1. スクリプトの内容をコピーし、「*put-only-url.py*」ファイルとして保存します。次の例を使用する際は、*ユーザー入力用プレースホルダー*を独自の情報 (ファイル名など) に置き換えます。

   ```
   import argparse
   import boto3
   from botocore.exceptions import ClientError
   
   def generate_presigned_url(s3_client, client_method, method_parameters, expires_in):
       """
       Generate a presigned Amazon S3 URL that can be used to perform an action.
       
       :param s3_client: A Boto3 Amazon S3 client.
       :param client_method: The name of the client method that the URL performs.
       :param method_parameters: The parameters of the specified client method.
       :param expires_in: The number of seconds the presigned URL is valid for.
       :return: The presigned URL.
       """
       try:
           url = s3_client.generate_presigned_url(
               ClientMethod=client_method,
               Params=method_parameters,
               ExpiresIn=expires_in
           )
       except ClientError:
           print(f"Couldn't get a presigned URL for client method '{client_method}'.")
           raise
       return url
   
   def main():
       parser = argparse.ArgumentParser()
       parser.add_argument("bucket", help="The name of the bucket.")
       parser.add_argument(
           "key", help="The key (path and filename) in the S3 bucket.",
       )
       parser.add_argument(
           "--region", help="The AWS region where the bucket is located.", default="us-east-1"
       )
       parser.add_argument(
           "--content-type", help="The content type of the file to upload.", default="application/octet-stream"
       )
       args = parser.parse_args()
       
       # Create S3 client with explicit region configuration
       s3_client = boto3.client("s3", region_name=args.region)
       
       # Optionally set signature version if needed for older S3 regions
       # s3_client.meta.config.signature_version = 's3v4'
       
       # The presigned URL is specified to expire in 1000 seconds
       url = generate_presigned_url(
           s3_client, 
           "put_object", 
           {
               "Bucket": args.bucket, 
               "Key": args.key,
               "ContentType": args.content_type  # Specify content type
           }, 
           1000
       )
       print(f"Generated PUT presigned URL: {url}")
   
   if __name__ == "__main__":
       main()
   ```

1. ファイルをアップロードするための `PUT` 署名付き URL を生成するには、バケット名と目的のオブジェクトパスを使用して次のスクリプトを実行します。

    次のコマンドでは、値の例を使用しています。*ユーザー入力プレースホルダー*を独自の情報に置き換えます。

   ```
   python put-only-url.py amzn-s3-demo-bucket <object-path> --region us-east-1 --content-type application/octet-stream
   ```

   スクリプトは以下の `PUT` 署名付き URL を出力します。

   ```
   Generated PUT presigned URL: https://amzn-s3-demo-bucket.s3.amazonaws.com/object.txt?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=vjbyNxybdZaMmLa%2ByT372YEAiv4%3D&Expires=1741978496
   ```

1. 生成された署名付き URL と curl を使用してファイルをアップロードできるようになりました。以下のように、URL の生成時に使用したのと同じコンテンツタイプを必ず含めてください。

   ```
   curl -X PUT -T "path/to/your/local/file" -H "Content-Type: application/octet-stream" "generated-presigned-url"
   ```

   URL の生成時に別のコンテンツタイプを指定した場合は、curl コマンドで同じコンテンツタイプを使用してください。

AWS SDK を使用してオブジェクトをアップロードするための署名付き URL を生成する例の詳細については、「[AWS SDK を使用して Amazon S3 の署名付き URL を作成する](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_Scenario_PresignedUrl_section.html)」を参照してください。

**SignatureDoesNotMatch エラーのトラブルシューティング**  
署名付き URL の使用時に `SignatureDoesNotMatch` エラーが発生した場合は、以下を確認してください。  
システム時刻が信頼できるタイムサーバーと同期されていることを確認します。
変更を加えずに、生成された URL とまったく同じ URL を使用していることを確認します。
URL の有効期限が切れているかどうかを確認し、必要に応じて新しい URL を生成します。
アップロードリクエストのコンテンツタイプが、URL の生成時に指定したコンテンツタイプと一致することを確認します。
バケットに正しいリージョンを使用していることを確認します。
curl を使用する場合は、URL を引用符で囲み、特殊文字を適切に処理します。

------