オブジェクトのアップロード
Amazon S3 にファイルをアップロードすると、S3 オブジェクトとして保存されます。オブジェクトは、オブジェクトを記述するファイルデータとメタデータから構成されます。バケット内のオブジェクトの数に制限はありません。Amazon S3 バケットにファイルをアップロードするには、バケットに対する書き込みアクセス許可が必要です。アクセス許可の詳細については、Amazon S3 用 Identity and Access Management を参照してください。
ファイルタイプ (イメージ、バックアップ、データ、ムービーなど) を問わず、各種のファイルを S3 バケットにアップロードできます。Amazon S3 コンソールを使用すると、アップロードできるファイルの最大サイズが 160 GB になります。160 GB を超えるファイルをアップロードするには、AWS Command Line Interface (AWS CLI)、AWS SDK、または Amazon S3 REST API を使用します。
バージョニングが有効なバケットに既に存在するキー名の付いたオブジェクトをアップロードした場合、Amazon S3 は既存のオブジェクトを置き換える代わりにオブジェクトの別バージョンを作成します。バージョニングを有効にする方法の詳細については、「バケットでのバージョニングの有効化」を参照してください。
アップロードするデータのサイズに応じて、Amazon S3 には以下のオプションが用意されています。
AWS SDK、REST API、または AWS CLI を使用して 1 回のオペレーションでオブジェクトをアップロードする — 1 回の PUT
オペレーションでは、最大 5 GB の単一のオブジェクトをアップロードできます。
Amazon S3 コンソールを使用して 1 つのオブジェクトをアップロードする — Amazon S3 コンソールでは、最大 160 GB のオブジェクトをアップロードできます。
AWS SDK、REST API、または AWS CLI を使用してオブジェクトをいくつかに分けてアップロードする — マルチパートアップロード API を使用すると、最大 5 TB のサイズの単一の大容量オブジェクトをアップロードできます。
マルチパートアップロード API オペレーションは大容量オブジェクトのアップロードを効率よく行えるように設計されています。1 つのオブジェクトをいくつかに分けてアップロードできます。オブジェクトのパートは、単独で、任意の順序で、または並行してアップロードできます。マルチパートアップロードは 5 MB~5 TB のオブジェクトで使用できます。詳細については、「Amazon S3 でのマルチパートアップロードを使用したオブジェクトのアップロードとコピー」を参照してください。
オブジェクトをアップロードすると、そのオブジェクトは、デフォルトでは Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) を使用して自動的に暗号化されます。ダウンロードすると、オブジェクトは復号化されます。詳細については、「Amazon S3 バケット向けのサーバー側のデフォルトの暗号化動作の設定」および「暗号化によるデータの保護」を参照してください。
オブジェクトをアップロードするときに、別の種類のデフォルト暗号化を使用する場合は、S3 PUT
リクエストで AWS Key Management Service (AWS KMS) キーによるサーバー側の暗号化 (SSE-KMS) を指定するか、SSE-KMS を使用してデータを暗号化するように送信先バケットのデフォルトの暗号化設定を設定することもできます。SSE-KMS に関する詳細は、「AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定」を参照してください。別のアカウントが所有している KMS キーを使用する場合は、そのキーを使用するアクセス許可が必要です。KMS キーのクロスアカウント権限の詳細については、「AWS Key Management Service デベロッパーガイド」の「他のアカウントで使用できる KMS キーを作成する」を参照してください。
Amazon S3 でアクセス拒否 (403 Forbidden) エラーが発生したとき、一般的な原因の詳細については「Amazon S3 でのアクセス拒否 (403 Forbidden) エラーのトラブルシューティング 」を参照してください。
オブジェクトのアップロード
この手順では、コンソールを使用してオブジェクトおよびフォルダを Amazon S3 バケットにアップロードする方法について説明します。
オブジェクトをアップロードする場合、オブジェクトキー名はファイル名および任意のプレフィックスになります。Amazon S3 コンソールでは、フォルダを作成してオブジェクトを整理できます。Amazon S3 では、フォルダはオブジェクトキー名に表示されるプレフィックスとして表されます。Amazon S3 コンソールのフォルダに個々のオブジェクトをアップロードする場合、フォルダ名はオブジェクトキー名に含まれます。
例えば、「sample1.jpg
」という名前のオブジェクトを「backup
」という名前のフォルダにアップロードすると、キー名は「backup/sample1.jpg
」になります。ただし、オブジェクトはコンソールの sample1.jpg
フォルダ内で backup
として表示されます。有効なキー名の詳細については、オブジェクトメタデータの使用 を参照してください。
Amazon S3 コンソールでオブジェクトの名前を変更したり、ストレージクラス、暗号化、またはメタデータなどのプロパティを変更したりすると、新しいオブジェクトが作成され、古いオブジェクトが置き換えられます。S3 バージョニングが有効になっている場合は、オブジェクトの新しいバージョンが作成され、既存のオブジェクトが古いバージョンになります。また、プロパティを変更するロールは、新しいオブジェクト (またはオブジェクトのバージョン) の所有者になります。
フォルダをアップロードすると、Amazon S3 は、そのフォルダからすべてのファイルとサブフォルダをバケットにアップロードします。その後、アップロードしたファイルの名前とフォルダの名前を組み合わせたオブジェクトキー名が割り当てられます。例えば、/images
と sample1.jpg
の 2 つのファイルを含む sample2.jpg
というフォルダをアップロードすると、Amazon S3 はファイルのアップロード後に、対応するキー名である images/sample1.jpg
と images/sample2.jpg
を割り当てます。キー名にはプレフィックスとしてフォルダ名が含まれています。Amazon S3 コンソールには、最後の /
に続くキー名の部分のみが表示されます。例えば、images
フォルダ内では images/sample1.jpg
オブジェクトと images/sample2.jpg
オブジェクトが sample1.jpg
および sample2.jpg
として表示されます。
単一のオペレーションで、最大 5 GB のオブジェクトをアップロードする PUT
リクエストを送信できます。詳細については、PutObject
AWS CLI コマンドリファレンスでの例を参照してください。
REST リクエストを送信してオブジェクトをアップロードできます。PUT
リクエストを送信して 1 回のオペレーションでデータをアップロードできます。詳細については、「PutObject」を参照してください。
AWS SDK を使用して、Amazon S3 にオブジェクトをアップロードできます。SDK にはデータを容易にアップロードできるラッパーライブラリが用意されています。詳細については、サポートされている SDK のリスト を参照してください。
次に、いくつかの SDK を選択した例を数例挙げます。
- .NET
次の C# コード例では、2 つの PutObjectRequest
リクエストで 2 つのオブジェクトを作成します。
最初の PutObjectRequest
リクエストでは、サンプルオブジェクトデータとしてテキスト文字列を保存します。また、バケット名とオブジェクトキー名を指定します。
2 番目の PutObjectRequest
リクエストでは、ファイル名を指定してファイルをアップロードします。また、このリクエストは、ContentType
ヘッダーとオプションのオブジェクトメタデータ (タイトル) を指定します。
コード例を設定および実行する方法の詳細については、「AWS SDK for .NET デベロッパーガイド」の「AWS SDK for .NET の開始方法」 を参照してください。
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;
namespace Amazon.DocSamples.S3
{
class UploadObjectTest
{
private const string bucketName = "*** bucket name ***";
// For simplicity the example creates two objects from the same file.
// You specify key names for these objects.
private const string keyName1 = "*** key name for first object created ***";
private const string keyName2 = "*** key name for second object created ***";
private const string filePath = @"*** file path ***";
private static readonly RegionEndpoint bucketRegion = RegionEndpoint.EUWest1;
private static IAmazonS3 client;
public static void Main()
{
client = new AmazonS3Client(bucketRegion);
WritingAnObjectAsync().Wait();
}
static async Task WritingAnObjectAsync()
{
try
{
// 1. Put object-specify only key name for the new object.
var putRequest1 = new PutObjectRequest
{
BucketName = bucketName,
Key = keyName1,
ContentBody = "sample text"
};
PutObjectResponse response1 = await client.PutObjectAsync(putRequest1);
// 2. Put the object-set ContentType and add metadata.
var putRequest2 = new PutObjectRequest
{
BucketName = bucketName,
Key = keyName2,
FilePath = filePath,
ContentType = "text/plain"
};
putRequest2.Metadata.Add("x-amz-meta-title", "someTitle");
PutObjectResponse response2 = await client.PutObjectAsync(putRequest2);
}
catch (AmazonS3Exception e)
{
Console.WriteLine(
"Error encountered ***. Message:'{0}' when writing an object"
, e.Message);
}
catch (Exception e)
{
Console.WriteLine(
"Unknown encountered on server. Message:'{0}' when writing an object"
, e.Message);
}
}
}
}
- Java
次の例では 2 つのオブジェクトを作成します。最初のオブジェクトにはデータとしてテキスト文字列があり、2 番目のオブジェクトはファイルです。この例では、AmazonS3Client.putObject()
への呼び出しでバケット名、オブジェクトキー、およびテキストデータを直接指定して、最初のオブジェクトを作成します。例では、バケット名、オブジェクトキー、およびファイルパスを指定する PutObjectRequest
を指定して 2 番目のオブジェクトを作成します。PutObjectRequest
では、ContentType
ヘッダーとタイトルメタデータも指定します。
作業サンプルの作成およびテストの手順については、「AWS SDK for Java のデベロッパーガイド」の「使用開始」を参照してください。
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import java.io.File;
import java.io.IOException;
public class UploadObject {
public static void main(String[] args) throws IOException {
Regions clientRegion = Regions.DEFAULT_REGION;
String bucketName = "*** Bucket name ***";
String stringObjKeyName = "*** String object key name ***";
String fileObjKeyName = "*** File object key name ***";
String fileName = "*** Path to file to upload ***";
try {
// This code expects that you have AWS credentials set up per:
// https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-credentials.html
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(clientRegion)
.build();
// Upload a text string as a new object.
s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");
// Upload a file as a new object with ContentType and title specified.
PutObjectRequest request = new PutObjectRequest(bucketName, fileObjKeyName, new File(fileName));
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("plain/text");
metadata.addUserMetadata("title", "someTitle");
request.setMetadata(metadata);
s3Client.putObject(request);
} 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();
}
}
}
- JavaScript
次の例では、特定のリージョンの Amazon S3 バケットに既存のファイルをアップロードします。
import { readFile } from "node:fs/promises";
import {
PutObjectCommand,
S3Client,
S3ServiceException,
} from "@aws-sdk/client-s3";
/**
* Upload a file to an S3 bucket.
* @param {{ bucketName: string, key: string, filePath: string }}
*/
export const main = async ({ bucketName, key, filePath }) => {
const client = new S3Client({});
const command = new PutObjectCommand({
Bucket: bucketName,
Key: key,
Body: await readFile(filePath),
});
try {
const response = await client.send(command);
console.log(response);
} catch (caught) {
if (
caught instanceof S3ServiceException &&
caught.name === "EntityTooLarge"
) {
console.error(
`Error from S3 while uploading object to ${bucketName}. \
The object was too large. To upload objects larger than 5GB, use the S3 console (160GB max) \
or the multipart upload API (5TB max).`,
);
} else if (caught instanceof S3ServiceException) {
console.error(
`Error from S3 while uploading object to ${bucketName}. ${caught.name}: ${caught.message}`,
);
} else {
throw caught;
}
}
};
- PHP
この例では、AWS SDK for PHP のクラスを使用して、5 GB までのサイズのオブジェクトをアップロードする手順を示します。ファイルのサイズが大きい場合には、マルチパートアップロード API オペレーションを使用する必要があります。詳細については、「Amazon S3 でのマルチパートアップロードを使用したオブジェクトのアップロードとコピー」を参照してください。
AWS SDK for Ruby API の詳細については、AWS SDK for Ruby - バージョン 2 を参照してください。
例 - データをアップロードして Amazon S3 バケットにオブジェクトを作成する
以下の PHP コード例では、putObject()
メソッドを使用してデータをアップロードすることで、指定されたバケットにオブジェクトを作成しています。
require 'vendor/autoload.php';
use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;
$bucket = '*** Your Bucket Name ***';
$keyname = '*** Your Object Key ***';
$s3 = new S3Client([
'version' => 'latest',
'region' => 'us-east-1'
]);
try {
// Upload data.
$result = $s3->putObject([
'Bucket' => $bucket,
'Key' => $keyname,
'Body' => 'Hello, world!',
'ACL' => 'public-read'
]);
// Print the URL to the object.
echo $result['ObjectURL'] . PHP_EOL;
} catch (S3Exception $e) {
echo $e->getMessage() . PHP_EOL;
}
- Ruby
AWS SDK for Ruby − バージョン 3 には、Amazon S3 にオブジェクトをアップロードする 2 つの方法があります。1 つ目の方法では、ディスクから任意のサイズのファイルを簡単にアップロードできる、マネージド型ファイルアップローダーを使用します。マネージド型ファイルアップローダーによる方法を使用するには、次の操作を行います。
Aws::S3::Resource
クラスのインスタンスを作成します。
バケット名とキーで、ターゲットオブジェクトを参照します。オブジェクトはバケット内に保持され、各オブジェクトを特定するための一意のキーを持っています。
オブジェクトで #upload_file
を呼び出します。
require 'aws-sdk-s3'
# Wraps Amazon S3 object actions.
class ObjectUploadFileWrapper
attr_reader :object
# @param object [Aws::S3::Object] An existing Amazon S3 object.
def initialize(object)
@object = object
end
# Uploads a file to an Amazon S3 object by using a managed uploader.
#
# @param file_path [String] The path to the file to upload.
# @return [Boolean] True when the file is uploaded; otherwise false.
def upload_file(file_path)
@object.upload_file(file_path)
true
rescue Aws::Errors::ServiceError => e
puts "Couldn't upload file #{file_path} to #{@object.key}. Here's why: #{e.message}"
false
end
end
# Example usage:
def run_demo
bucket_name = "amzn-s3-demo-bucket"
object_key = "my-uploaded-file"
file_path = "object_upload_file.rb"
wrapper = ObjectUploadFileWrapper.new(Aws::S3::Object.new(bucket_name, object_key))
return unless wrapper.upload_file(file_path)
puts "File #{file_path} successfully uploaded to #{bucket_name}:#{object_key}."
end
run_demo if $PROGRAM_NAME == __FILE__
AWS SDK for Ruby − バージョン 3 でオブジェクトをアップロードできる 2 つ目の方法では、#put
の Aws::S3::Object
メソッドを使用します。この方法は、オブジェクトが文字列であるか、ディスク上のファイルではない I/O オブジェクトである場合に役立ちます。この方法を使用するには、次の操作を行います。
Aws::S3::Resource
クラスのインスタンスを作成します。
バケット名とキーで、ターゲットオブジェクトを参照します。
#put
を呼び出し、文字列または I/O オブジェクトを渡します。
require 'aws-sdk-s3'
# Wraps Amazon S3 object actions.
class ObjectPutWrapper
attr_reader :object
# @param object [Aws::S3::Object] An existing Amazon S3 object.
def initialize(object)
@object = object
end
def put_object(source_file_path)
File.open(source_file_path, 'rb') do |file|
@object.put(body: file)
end
true
rescue Aws::Errors::ServiceError => e
puts "Couldn't put #{source_file_path} to #{object.key}. Here's why: #{e.message}"
false
end
end
# Example usage:
def run_demo
bucket_name = "amzn-s3-demo-bucket"
object_key = "my-object-key"
file_path = "my-local-file.txt"
wrapper = ObjectPutWrapper.new(Aws::S3::Object.new(bucket_name, object_key))
success = wrapper.put_object(file_path)
return unless success
puts "Put file #{file_path} into #{object_key} in #{bucket_name}."
end
run_demo if $PROGRAM_NAME == __FILE__
同じキー名を持つオブジェクトのアップロードを禁止する
アップロード時の条件付き書き込みオペレーションを使用して、バケット内にオブジェクトが存在するかどうかを確認してからオブジェクトを作成できるようになりました。これにより、既存のデータの上書きを阻止できます。条件付き書き込みでは、アップロードする際にバケット内に同じキー名を持つ既存のオブジェクトが存在しないことを検証します。
条件付き書き込みは、PutObject リクエストまたは CompleteMultipartUpload リクエストに使用できます。
条件付きリクエストの詳細については、「条件付きリクエストを使用して S3 オペレーションに前提条件を追加する」を参照してください。