.NET Core と AWS SDK for .NETを用いてS3へのアップロードとダウンロードを行った際にハマったポイントを共有します。
はじめに
好物はインフラとフロントエンドのかじわらゆたかです。 今回の案件では、.NET Core と AWS SDK for .NETを用いたプログラミングを行ったのですが、 その際の注意点を共有します。
なお、今回私が用いた環境は下記のとおりです。
- macOS High Sierra 10.13.6
- .NET Core 2.1.403
- Visual Studio Code 1.28.2
雛形の作成
コンソールアプリケーションのプロジェクトを作成します。
$ dotnet new console
次に、S3を扱うAWS SDK for .NETをプロジェクトに追加します。 以下のサイトで追加する際のコマンドを確認することができます。
$ dotnet add package AWSSDK.S3 --version 3.3.26.4
.NET Core環境下でのAWS SDKのメソッド呼び出しはすべて非同期メソッドを用います。
AWS SDK for .NETのドキュメント に以下の記載があります。
AWS サービスクライアントは、NET Core の非同期の呼び出しパターンのみをサポートしています。
そのため、S3のバケットからオブジェクトを取得すると言った際に用いるメソッドは、PutObject
ではなくPutObjectAsync
を用いる必要があります。
また、今回の作例ではConsoleアプリケーションを作っているので、非同期呼び出しはWait()メソッド
やResult
を用いて非同期の終了を待つ必要があります。
できる!C#で非同期処理(Taskとasync-await) – kekyoの丼
.NET Core環境でS3にファイルをアップロードし、ダウンロードするサンプルを用意しました。
using System; using System.IO; using Amazon; using Amazon.S3; using Amazon.S3.Model; namespace cm_blog_aws_sdk_for_dot_net { class Program { static void Main(string[] args) { using (var streamWriter = new StreamWriter(@"HelloWorld.txt")) { streamWriter.WriteLine("hello world"); } var s3Client = new AmazonS3Client(RegionEndpoint.APNortheast1); var bucket = args[0]; var putRequest = new PutObjectRequest{ BucketName = bucket, Key = "HelloWorld.txt", FilePath = @"HelloWorld.txt" }; s3Client.PutObjectAsync(putRequest).Wait(); var request = new GetObjectRequest { BucketName = bucket, Key = "HelloWorld.txt" }; using (var response = s3Client.GetObjectAsync(request)) using (var streamReader = new StreamReader(response.Result.ResponseStream)){ Console.WriteLine(streamReader.ReadToEnd()); } } } }
まとめ
.NET Core + AWS SDK for .NETを用いたコンソールアプリケーションの実装の際の注意点としては以下となります。
- AWS SDK for .NETのサービスクライアントのメソッドの呼び出しは非同期である
- コンソールアプリケーションの実装の場合は、非同期メソッドで取得したTaskオブジェクトの
Wait()
やResult
を用いて処理を待つ必要がある