署名付き URL を使用したオブジェクトのアップロード - Amazon Simple Storage Service

署名付き URL を使用したオブジェクトのアップロード

署名付き URL の作成者がそのオブジェクトへのアクセス許可を持っている場合、署名付き URL を使用して、URL で識別されるオブジェクトにアクセスすることができます。つまり、オブジェクトをアップロードするための署名付き URL を受け取った場合、オブジェクトをアップロードすることができるのは、署名付き URL の作成者がそのオブジェクトをアップロードするのに必要な権限を持っている場合のみです。

デフォルトでは、すべてのオブジェクトおよびバケットはプライベートです。署名付き URL は、ユーザー/顧客が特定のオブジェクトをバケットにアップロードできるようにする必要があるが、AWS セキュリティ認証情報またはアクセス許可を持つことを求めない場合に有用です。

署名付き URL を作成するときは、セキュリティ認証情報を提供し、次にバケット名、オブジェクトキー、HTTP メソッド (オブジェクトのアップロードの PUT)、および有効期限の日時を指定する必要があります。署名付き URL は、指定した期間のみ有効です。つまり、有効期限日時の前にアクションを開始する必要があります。マルチパートアップロードなど、アクションが複数のステップで構成されている場合、すべてのステップは有効期限が切れる前に開始する必要があります。そうしないと、Amazon S3 が期限切れ URL でステップを開始しようとした場合に、エラーが発生します。

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

署名付き URL アクセス

署名付き URL は、URL を持つすべてのユーザーに Amazon S3 バケットへのアクセスを許可するため、適切に保護することをお勧めします。署名付き URL の保護の詳細については、「署名付き URL 機能の制限」を参照してください。

有効なセキュリティ認証情報を持つすべてのユーザーが、署名付き URL を作成できます。ただし、オブジェクトを正常にアップロードするには、署名付き URL の基となるオペレーションを実行するアクセス許可を持つユーザーが、署名付き URL を作成する必要があります。

オブジェクトアップロード用の署名付き URL の生成

署名付き URL は、.NET、AWS SDK for Java、Ruby、Node.js、PHP、および Python を使用してプログラムで生成できます。

Microsoft Visual Studio を使用する場合は、AWS Explorer を使用して、コードを記述せずに署名付きオブジェクト URL を生成することもできます。有効な署名付き URL を受け取ったすべてのユーザーは、オブジェクトをプログラムでアップロードすることができます。詳細については、AWS Explorer で Amazon S3 を使用するを参照してください。AWS Explorer をインストールする方法については、「AWS SDK およびエクスプローラーを使用して Amazon S3 で開発する」を参照してください。

AWS SDK を使用して、ユーザーが提供した URL から署名付き URL を生成します。これは Amazon S3 にオブジェクトをアップロードするために使用できます。この URL を使用してオブジェクトをアップロードすると、Amazon S3 は指定したバケットにオブジェクトを作成します。署名付き URL で指定したのと同じキーを持つオブジェクトがバケット内に既存する場合、Amazon S3 は既存のオブジェクトをアップロードしたオブジェクトで置き換えます。

Examples

次の例では、署名付き URL を使用してオブジェクトをアップロードする方法を示します。

.NET

次の C# の例では、AWS SDK for .NET で署名付き URL を使用して S3 バケットにオブジェクトをアップロードする方法を示します。

この例では、特定のオブジェクト用の署名付き URL を生成し、これを使用してファイルをアップロードします。この例と特定バージョンの AWS SDK for .NET との互換性、および作業サンプルを作成してテストする手順の詳細については、「Amazon S3 .NET コード例の実行」を参照してください。

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.IO; using System.Net; namespace Amazon.DocSamples.S3 { class UploadObjectUsingPresignedURLTest { private const string bucketName = "*** provide bucket name ***"; private const string objectKey = "*** provide the name for the uploaded object ***"; private const string filePath = "*** provide the full path name of the file to upload ***"; // Specify how long the presigned URL lasts, in hours private const double timeoutDuration = 12; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(bucketRegion); var url = GeneratePreSignedURL(timeoutDuration); UploadObject(url); } private static void UploadObject(string url) { HttpWebRequest httpRequest = WebRequest.Create(url) as HttpWebRequest; httpRequest.Method = "PUT"; using (Stream dataStream = httpRequest.GetRequestStream()) { var buffer = new byte[8000]; using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { int bytesRead = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) { dataStream.Write(buffer, 0, bytesRead); } } } HttpWebResponse response = httpRequest.GetResponse() as HttpWebResponse; } private static string GeneratePreSignedURL(double duration) { var request = new GetPreSignedUrlRequest { BucketName = bucketName, Key = objectKey, Verb = HttpVerb.PUT, Expires = DateTime.UtcNow.AddHours(duration) }; string url = s3Client.GetPreSignedURL(request); return url; } } }
Java

アップロードを正常に完了するには、以下の操作を行う必要があります。

  • GeneratePresignedUrlRequest オブジェクトと HttpURLConnection オブジェクトの作成時に、HTTP PUT 動詞を指定します。

  • アップロードの終了後に何らかの方法で HttpURLConnection オブジェクトを操作します。次の例では、このために HttpURLConnection オブジェクトを使用して、HTTP レスポンスコードをチェックします。

この例では、署名付き URL を生成し、これを使用してサンプルデータをオブジェクトとしてアップロードします。作業サンプルを作成およびテストする方法については、「Amazon S3 Java コード例のテスト」を参照してください。

import com.amazonaws.AmazonServiceException; import com.amazonaws.HttpMethod; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; import com.amazonaws.services.s3.model.S3Object; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; public class GeneratePresignedUrlAndUploadObject { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String objectKey = "*** Object key ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Set the pre-signed URL to expire after one hour. java.util.Date expiration = new java.util.Date(); long expTimeMillis = expiration.getTime(); expTimeMillis += 1000 * 60 * 60; expiration.setTime(expTimeMillis); // Generate the pre-signed URL. System.out.println("Generating pre-signed URL."); GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectKey) .withMethod(HttpMethod.PUT) .withExpiration(expiration); URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest); // Create the connection and use it to upload the new object using the pre-signed URL. HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("PUT"); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); out.write("This text uploaded as an object via presigned URL."); out.close(); // Check the HTTP response code. To complete the upload and make the object available, // you must interact with the connection object in some way. connection.getResponseCode(); System.out.println("HTTP response code: " + connection.getResponseCode()); // Check to make sure that the object was uploaded successfully. S3Object object = s3Client.getObject(bucketName, objectKey); System.out.println("Object " + object.getKey() + " created in bucket " + object.getBucketName()); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
Python

SDK for Python (Boto3) を使用してオブジェクトをアップロードする署名付き URL を生成します。例えば、Boto3 クライアントと generate_presigned_url 関数を使用して、オブジェクトを PUT する署名付き URL を生成します。

import boto3 url = boto3.client('s3').generate_presigned_url( ClientMethod='put_object', Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'}, ExpiresIn=3600)

署名付き URL を生成する方法と、Requests パッケージを使用してオブジェクトをアップロードおよびダウンロードする方法を示す詳細な例については、GitHub の Python 署名付き URL の例を参照してください。SDK for Python (Boto3) を使用して署名付き URL を生成する方法の詳細については、AWS SDK for Python (Boto) API リファレンス Python を参照してください。

Ruby

以下のタスクは、Ruby スクリプトで SDK for Ruby - バージョン 3 の署名付き URL を使用してオブジェクトをアップロードする手順を示しています。

1

Aws::S3::Resource クラスのインスタンスを作成します。

2

#bucket[] クラスインスタンスの #object[] および Aws::S3::Resource メソッドを呼び出して、バケット名とオブジェクトキーを指定します。

URI クラスのインスタンスを作成し、これを使用して .presigned_url クラスインスタンスの Aws::S3::Resource メソッドを解析することにより、署名付き URL を生成します。オブジェクトをアップロードする場合、:put の引数として .presigned_url を指定し、PUTNet::HTTP::Session#send_request を指定する必要があります。

3

署名付き URL を利用できるすべてのユーザーは、オブジェクトをアップロードすることができます。

アップロードにより、オブジェクトが作成されるか、または署名付き URL で指定されたものと同じキーを持つ既存のオブジェクトが置き換えられます。

以下の Ruby コード例は、SDK for Ruby - バージョン 3 用の前述のタスクを実装したものです。

require 'aws-sdk-s3' require 'net/http' # Uploads an object to a bucket in Amazon Simple Storage Service (Amazon S3) # by using a presigned URL. # # Prerequisites: # # - An S3 bucket. # - An object in the bucket to upload content to. # # @param s3_client [Aws::S3::Resource] An initialized S3 resource. # @param bucket_name [String] The name of the bucket. # @param object_key [String] The name of the object. # @param object_content [String] The content to upload to the object. # @param http_client [Net::HTTP] An initialized HTTP client. # This is especially useful for testing with mock HTTP clients. # If not specified, a default HTTP client is created. # @return [Boolean] true if the object was uploaded; otherwise, false. # @example # exit 1 unless object_uploaded_to_presigned_url?( # Aws::S3::Resource.new(region: 'us-east-1'), # 'doc-example-bucket', # 'my-file.txt', # 'This is the content of my-file.txt' # ) def object_uploaded_to_presigned_url?( s3_resource, bucket_name, object_key, object_content, http_client = nil ) object = s3_resource.bucket(bucket_name).object(object_key) url = URI.parse(object.presigned_url(:put)) if http_client.nil? Net::HTTP.start(url.host) do |http| http.send_request( 'PUT', url.request_uri, object_content, 'content-type' => '' ) end else http_client.start(url.host) do |http| http.send_request( 'PUT', url.request_uri, object_content, 'content-type' => '' ) end end content = object.get.body puts "The presigned URL for the object '#{object_key}' in the bucket " \ "'#{bucket_name}' is:\n\n" puts url puts "\nUsing this presigned URL to get the content that " \ "was just uploaded to this object, the object\'s content is:\n\n" puts content.read return true rescue StandardError => e puts "Error uploading to presigned URL: #{e.message}" return false end