C#を利用したAmazon S3操作まとめ

近年、AWSを利用したプラットフォーム開発が増えている中、今回はこのAWSで提供されているサービスである「Amazon S3」に対して、C#を利用して操作する方法のまとめとなります。

Amazon S3を操作するために必要なのが「AWS SDK for .NET」というライブラリです。このライブラリのインストール方法から、S3 Bucketの作成、ファイルのアップロード/ダウンロードなど、基本的な操作についてまとめます。

\自身のスキルを向上するには技術書で!!/

月額¥980で技術書が読み放題!!

  • ビジネススキルとマインド向上したい!!
  • 決断や行動を先送りにしてしまう方!!

Kindle Unlimitedでは30日間無料体験実施中!登録はこちら!

Amazon S3とは

Amazon S3 (Amazon Simple Storage Service) とは、データを格納、管理することができるオブジェクトストレージサービスとなります。

Webサイトやアプリケーションなどのバックアップや復元など、非常に幅広い使い方ができるサービスで、AWSを利用している場合は今では利用必須のサービスと言えるでしょう。

Amazon S3 とは

C#を利用したAmazon S3操作のための準備

まずは、Amazon S3を操作する前に Visual Studioで作成するための準備を行います。

NuGetでのパッケージインストール

AWS S3の操作を行うために、NuGetより「AWSSDK.Core」および「AWSSDK.S3」のパッケージをインストールします。

項目バージョン
Visual Studio2019
AWSSDK.Core3.5.1.12
AWSSDK.S33.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

ICoreAmazonS3.UploadObjectFromFilePathAsync (string, string, string, IDictionary<String, Object>, CancellationToken)

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

ICoreAmazonS3.DownloadToFilePathAsync (string, string, string, IDictionary<String, Object>, CancellationToken)

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についてはまた時間がある時にでもまとめてみたいと思います。

タイトルとURLをコピーしました