近年、AWSを利用したプラットフォーム開発が増えている中、今回はこのAWSで提供されているサービスである「Amazon S3」に対して、C#を利用して操作する方法のまとめとなります。
Amazon S3を操作するために必要なのが「AWS SDK for .NET」というライブラリです。このライブラリのインストール方法から、S3 Bucketの作成、ファイルのアップロード/ダウンロードなど、基本的な操作についてまとめます。
\自身のスキルを向上するには技術書で!!/
月額¥980で技術書が読み放題!!
- ビジネススキルとマインド向上したい!!
- 決断や行動を先送りにしてしまう方!!
Amazon S3とは
Amazon S3 (Amazon Simple Storage Service) とは、データを格納、管理することができるオブジェクトストレージサービスとなります。
Webサイトやアプリケーションなどのバックアップや復元など、非常に幅広い使い方ができるサービスで、AWSを利用している場合は今では利用必須のサービスと言えるでしょう。
C#を利用したAmazon S3操作のための準備
まずは、Amazon S3を操作する前に Visual Studioで作成するための準備を行います。
NuGetでのパッケージインストール
AWS S3の操作を行うために、NuGetより「AWSSDK.Core」および「AWSSDK.S3」のパッケージをインストールします。
項目 | バージョン |
---|---|
Visual Studio | 2019 |
AWSSDK.Core | 3.5.1.12 |
AWSSDK.S3 | 3.5.1.3 |
APIに関する詳細は「V3 API Documentation」を参照ください。
インストール手順
1) [ツール]-[NuGet パッケージ マネージャー(N)]-[ソリューションのNuGetパッケージの管理(N)…]を選択する
2) [参照]を選択し、入力欄に「AWSSDK」と入力後、「AWSSDK.Core」と「AWSSDK.S3」を必要なプロジェクトにインストールする
3) インストール済みに、先ほどインストールしたパッケージが表示されていることを確認します。
Amazon S3 への認証情報を設定
Amazon S3に対して操作を行う前に、認証情報の設定を下記のように行います。
private IAmazonS3 m_client;
/// <summary>
/// コンストラクタ
/// </summary>
public void Initialized()
{
AmazonS3Config config = new AmazonS3Config();
config.RegionEndpoint = RegionEndpoint.APNortheast1;
// プロキシの設定を行う場合は、下記を設定
config.ProxyHost = "127.0.0.1";
config.ProxyPort = xxx;
SharedCredentialsFile credentialsFile = new SharedCredentialsFile();
CredentialProfile profile = null;
if(credentialsFile.TryGetProfile("default", out profile) == false){
Console.WriteLine("プロファイルの取得に失敗しました。");
return;
}
AWSCredentials awsCredentials = null;
if(AWSCredentialsFactory.TryGetAWSCredentials(profile, credentialsFile, out awsCredentials) == false){
Console.WriteLine("認証情報の生成に失敗しました。");
}
m_client = new AmazonS3Client(awsCredentials, config);
}
ここでは、AWSCredentialsを引数としてAmazonS3Clientオブジェクトを作成していますが、アクセスキーと秘密鍵を利用しても可能です。
AmazonS3Configで様々なオプションを設定できるので、プロファイルを作成しておき、そのプロファイルを読み込むようにしておくと、以降は保守観点で考えると便利になります。
S3関連の関数を利用するために、usingで下記を定義しておきます。
using Amazon;
using Amazon.Runtime;
using Amazon.Runtime.CredentialManagement;
using Amazon.S3;
using Amazon.S3.Util;
using Amazon.S3.Model;
これでとりあえず準備はOKです。
Amazon S3を操作する
Amazon S3 Bucketの作成
Bucketの作成は下記の構文を利用します。
Syntax
IAmazonS3.PutBucketAsync (string, CancellationToken)
public virtual Task<PutBucketResponse> PutBucketAsync(
String bucketName,
[CancellationToken cancellationToken]
)
IAmazonS3.PutBucketAsync (PutBucketRequest, CancellationToken)
public virtual Task<PutBucketResponse> PutBucketAsync(
PutBucketRequest request,
[CancellationToken cancellationToken]
)
実際に作成するコードは下記となります。
private const string BUCKET_NAME = "samplebucket";
public void CreateS3Bucket()
{
Task<bool> res = CreateS3BucketAsync();
if(res.Result == true)
{
Console.WriteLine("Succeeded!!");
return;
}
Console.WriteLine("Failed.");
}
private async Task<bool> CreateS3BucketAsync()
{
try
{
bool isExisted = await AmazonS3Util.DoesS3BucketExistV2Async(m_client, BUCKET_NAME);
if(isExisted == false)
{
PutBucketRequest request = new PutBucketRequest { BucketName = BUCKET_NAME, UseClientRegion = true };
PutBucketResponse res = await m_client.PutBucketAsync(request);
if(res != null)
{
return true;
}
}
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
return false;
}
上記コードでは、先に「DoesS3BucketExistV2Async」を利用し、Bucketが存在するかどうかのチェックを行っています。
もし存在しない場合は、Bucketを作成するという流れです。
ファイルのアップロード
ファイルをアップロードする場合は下記構文を利用します。
Syntax
public abstract Task UploadObjectFromFilePathAsync(
String bucketName,
String objectKey,
String filepath,
IDictionary<String, Object> additionalProperties,
CancellationToken cancellationToken
)
実際にファイルをアップロードしてみましょう。
private const string BUCKET_NAME = "samplebucket";
private const string KEY_NAME = "sampleKey/sample.txt";
private const string FILE_PATH = @"C:\Sample\sample.txt";
public void UploadS3Buckect()
{
UploadS3BucketAsync().Wait();
}
private async Task UploadS3BucketAsync()
{
try
{
bool isExisted = await AmazonS3Util.DoesS3BucketExistV2Async(m_client, BUCKET_NAME);
if (isExisted == true)
{
await m_client.UploadObjectFromFilePathAsync(BUCKET_NAME, KEY_NAME, FILE_PATH, null);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
アップロード方法のサンプルとして、下記でも紹介されていますので参考までに。
AWS SDK for .NET を使用して S3 バケットにファイルをアップロードする (低レベル API)
アップロードしたファイル情報を確認する
アップロード後にファイルを確認する場合は「GetObjectAsync」を利用します。
Syntax
IAmazonS3.GetObjectAsync (string, string, CancellationToken)
public abstract Task<GetObjectResponse> GetObjectAsync(
String bucketName,
String key,
CancellationToken cancellationToken
)
実際に確認するコードは下記の通りです。
private const string BUCKET_NAME = "samplebucket";
private const string KEY_NAME = "sampleKey/sample.txt";
public void GetS3Object()
{
Task<GetObjectResponse> response = GetS3ObjectAsync();
if(response.Result != null)
{
var result = response.Result;
Console.WriteLine($"BucketName : {result.BucketName}");
Console.WriteLine($"Key : {result.Key}");
}
return;
}
private async Task<GetObjectResponse> GetS3ObjectAsync()
{
try
{
GetObjectResponse res = await m_client.GetObjectAsync(BUCKET_NAME, KEY_NAME]);
return res;
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
return null;
}
上記を実行すると下記のような結果が標準出力で出力されます。
BucketName : samplebucket
Key : sampleKey/sample.txt
ファイルダウンロード (DownloadToFilePathAsync利用)
アップロードしたファイルをダウンロードします。
ダウンロードするには、DownloadToFilePathAsyncメソッドを利用します。
Syntax
public abstract Task DownloadToFilePathAsync(
String bucketName,
String objectKey,
String filepath,
IDictionary<String, Object> additionalProperties,
CancellationToken cancellationToken
)
実際にダウンロードしてみましょう。
private const string BUCKET_NAME = "samplebucket";
private const string KEY_NAME = "sampleKey/sample.txt";
private const string LOCATION_PATH = @"C:\Sample\sample.txt";
public void DownloadS3Buckect()
{
DownloadS3BucketAsync().Wait();
}
private async Task DownloadS3BucketAsync()
{
try
{
bool isExisted = await AmazonS3Util.DoesS3BucketExistV2Async(m_client, BUCKET_NAME);
if (isExisted == true)
{
await m_client.DownloadToFilePathAsync(BUCKET_NAME, KEY_NAME, LOCATION_PATH, null);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
上記実行後、LOCATION_PATHに設定したファイルパスとして、smaple.txtファイルがダウンロードされます。
ファイルダウンロード (ListObjectsでStreamを利用)
ListObjectsからStreamを利用してファイルをダウンロードする方法となります。
Syntax
AmazonS3Client.ListObjects (ListObjectsRequest)
public virtual ListObjectsResponse ListObjects(
ListObjectsRequest request
)
実際にListObjectsでStreamを利用したコードは下記の通りです。
ListObjectsRequest req = new ListObjectsRequest();
req.BucketName = "samplebucket";
req.Prefix = "sampleKey";
ListObjectsResponse res = m_client.ListObjects(req);
if(res != null) {
foreach(S3Object target in res.S3Objects) {
GetObjectRequest req1 = new GetObjectRequest();
req1.BucketName = "samplebucket";
req1.Key = target.Key;
if(target.Size > 0) {
using(Stream resStream = Response.ResponseStream) {
Response.WriteResponseStreamToFile(Path.Combine("C:¥Smaple¥", target.Key))
}
}
}
}
対象キープレフィックス配下にあるファイルすべてをダウンロードします。
DownloadToFilePathAsyncでは、ファイルに対して操作を行いますが、上記ではディレクトリ単位で操作を行う方法となります。
ファイルの削除
アップロードしたファイルをS3から削除します。
Syntax
AmazonS3Client.DeleteObjectAsync (DeleteObjectRequest, CancellationToken)
public virtual Task<DeleteObjectResponse> DeleteObjectAsync(
DeleteObjectRequest request,
CancellationToken cancellationToken
)
実際にアップロードされているファイルを削除してみます。
private const string BUCKET_NAME = "samplebucket";
private const string KEY_NAME = "sampleKey/sample.txt";
public void DeleteS3Object()
{
DeleteS3ObjectAsync().Wait();
}
private async Task DeleteS3ObjectAsync()
{
try
{
DeleteObjectRequest req = new DeleteObjectRequest { BucketName = BUCKET_NAME, Key = KEY_NAME };
await m_client.DeleteObjectAsync(req);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
上記コードのように、DeleteObjectRequestを作成してDeleteObjectAsync関数の引数に渡してあげます。
最後に
他にもいろいろやり方はありますが、基本的には上記でほぼ対応できてしまうかと思います。
他にもJavaなどでも同じことができますが、Javaについてはまた時間がある時にでもまとめてみたいと思います。