📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の6版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
Amazon S3 (Simple Storage Service) は、AWSが提供するオブジェクトストレージサービスである。<br> | |||
インターネット経由でデータの保存と取得が可能であり、スケーラビリティ、可用性、セキュリティ、パフォーマンスに優れている。<br> | |||
<br> | |||
S3では、データは「オブジェクト」として保存され、各オブジェクトは「バケット」と呼ばれるコンテナ内に格納される。<br> | |||
オブジェクトは、ファイル本体とそのメタデータで構成され、一意の「キー」 (ファイル名やパス) により識別される。<br> | |||
バケット名はグローバルに一意である必要がある。<br> | |||
<br> | |||
主な特徴として、事実上無制限のストレージ容量、高い耐久性 (99.999999999[%])、複数のストレージクラスによるコスト最適化、バージョニング機能、アクセス制御、暗号化等がある。<br> | |||
静的Webサイトのホスティング、バックアップとアーカイブ、ビッグデータ分析、アプリケーションデータの保存等、幅広い用途で利用されている。<br> | |||
<br> | |||
S3へのアクセスは、AWSマネジメントコンソール、AWS CLI、AWS SDKを通じて行うことができ、RESTful APIを介してプログラムから操作することが可能である。<br> | |||
<br><br> | <br><br> | ||
== AWS SDK for C++のインストール == | == AWS SDK for C++のインストール == | ||
[[Qtの応用_-_AWS|Qtの応用_-_AWS#AWS_SDK_for_C++のインストール]]のページを参照すること。<br> | [[Qtの応用_-_AWS|Qtの応用_-_AWS#AWS_SDK_for_C++のインストール]]のページを参照すること。<br> | ||
<br><br> | |||
== S3へのアップロード == | |||
ローカルファイルをS3バケットにストリーム経由でアップロードするフローを以下に示す。<br> | |||
# ClientConfigurationの作成 | |||
#: AWS SDKのクライアント設定オブジェクトを生成する。 | |||
# リージョンの設定 | |||
#: 指定されたAWSリージョンを設定する。 | |||
# S3クライアントの生成 | |||
<br> | |||
==== S3クライアントの初期化 ==== | |||
指定されたリージョンでS3クライアントを初期化する。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
QString region = "<リージョン名>" | |||
Aws::Client::ClientConfiguration clientConfig; | |||
clientConfig.region = region.toStdString(); | |||
auto s3Client = std::make_unique<Aws::S3::S3Client>(clientConfig); | |||
</syntaxhighlight> | |||
<br> | |||
==== アップロードフロー ==== | |||
* bucketName | |||
*: アップロード先のS3バケット名 | |||
* objectKey | |||
*: S3上でのオブジェクトキー (パス) | |||
* filePath | |||
*: アップロードするローカルファイルのパス | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// 1. ファイル存在チェック | |||
QFileInfo fileInfo(filePath); | |||
if (!fileInfo.exists()) { | |||
return false; | |||
} | |||
// 2. PutObjectRequestの設定 | |||
Aws::S3::Model::PutObjectRequest request; | |||
request.SetBucket(bucketName.toStdString()); | |||
request.SetKey(objectKey.toStdString()); | |||
// 3. ファイルストリームの作成 | |||
// Aws::MakeSharedは、AWS SDK専用のスマートポインタ | |||
auto inputData = Aws::MakeShared<Aws::FStream>( | |||
"PutObjectInputStream", | |||
filePath.toStdString().c_str(), | |||
std::ios_base::in | std::ios_base::binary // std::ios_base::binary でバイナリファイルにも対応 | |||
); | |||
// 4. リクエストにデータを設定 | |||
request.SetBody(inputData); | |||
request.SetContentLength(fileInfo.size()); // ファイルサイズを明示的に設定 (Content-Length) | |||
// 5. アップロード実行 | |||
auto outcome = s3Client->PutObject(request); | |||
if (outcome.IsSuccess()) { // outcome.IsSuccessメソッドは、成功 / 失敗を判定することができる | |||
std::cout << "✓ アップロード成功" << std::endl; | |||
return true; | |||
} | |||
else { | |||
std::cerr << "✗ アップロード失敗: " << outcome.GetError().GetMessage() << std::endl; | |||
return false; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== S3へのダウンロード == | |||
S3バケットからファイルをストリーム経由でダウンロードするフローを以下に示す。<br> | |||
# ClientConfigurationの作成 | |||
#: AWS SDKのクライアント設定オブジェクトを生成する。 | |||
# リージョンの設定 | |||
#: 指定されたAWSリージョンを設定する。 | |||
# S3クライアントの生成 | |||
<br> | |||
==== S3クライアントの初期化 ==== | |||
指定されたリージョンでS3クライアントを初期化する。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
QString region = "<リージョン名>" | |||
Aws::Client::ClientConfiguration clientConfig; | |||
clientConfig.region = region.toStdString(); | |||
auto s3Client = std::make_unique<Aws::S3::S3Client>(clientConfig); | |||
</syntaxhighlight> | |||
<br> | |||
==== アップロードフロー ==== | |||
* bucketName | |||
*: ダウンロード元のS3バケット名 | |||
* objectKey | |||
*: S3上でのオブジェクトキー (パス) | |||
* filePath | |||
*: ダウンロード先のローカルファイルパス | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// 1. GetObjectRequestの設定 | |||
Aws::S3::Model::GetObjectRequest request; | |||
request.SetBucket(bucketName.toStdString()); | |||
request.SetKey(objectKey.toStdString()); | |||
// 2. ダウンロード実行 | |||
auto outcome = m_s3Client->GetObject(request); | |||
// 3. 成功時の処理 | |||
if (outcome.IsSuccess()) { | |||
// ストリームの取得 | |||
// GetResultWithOwnership : 結果オブジェクトの所有権を取得 | |||
auto& retrieved_file = outcome.GetResultWithOwnership().GetBody(); // ダウンロードしたデータのストリームを取得 | |||
// ローカルファイルへの書き込み | |||
std::ofstream output_file(filePath.toStdString(), std::ios::binary); // ファイル書き込み時もバイナリモードを使用 | |||
output_file << retrieved_file.rdbuf(); // ストリームバッファを直接ファイルに書き込み | |||
output_file.close(); | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
| 11行目: | 135行目: | ||
全ての設定 (リージョン、バケット名、オブジェクトキー) を任意の設定ファイルから読み込んでいる。<br> | 全ての設定 (リージョン、バケット名、オブジェクトキー) を任意の設定ファイルから読み込んでいる。<br> | ||
<br> | <br> | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="ini"> | ||
# config.iniファイル | # config.iniファイル | ||
| 38行目: | 162行目: | ||
<br> | <br> | ||
<syntaxhighlight lang="cmake"> | <syntaxhighlight lang="cmake"> | ||
# CMakeLists.txtファイル | |||
cmake_minimum_required(VERSION 3.16) | cmake_minimum_required(VERSION 3.16) | ||
project(<プロジェクト名> VERSION 1.0 LANGUAGES CXX) | project(<プロジェクト名> VERSION 1.0 LANGUAGES CXX) | ||
| 59行目: | 185行目: | ||
# 実行ファイル | # 実行ファイル | ||
add_executable( | add_executable(<プロジェクト名> | ||
main.cpp | main.cpp | ||
) | ) | ||
| 70行目: | 196行目: | ||
) | ) | ||
else() | else() | ||
target_link_libraries( | target_link_libraries(<プロジェクト名> | ||
Qt5::Core | Qt5::Core | ||
${AWSSDK_LINK_LIBRARIES} | ${AWSSDK_LINK_LIBRARIES} | ||
| 77行目: | 203行目: | ||
# インストール | # インストール | ||
install(TARGETS | install(TARGETS <プロジェクト名> | ||
RUNTIME DESTINATION bin | RUNTIME DESTINATION bin | ||
) | ) | ||