駆け出しプログラマーの成長日記

駆け出しプログラマーの成長日記をご覧いただきありがとうございます。何かお気づきの点、このような場合どうすればよいかなど質問やアドバイスお待ちしております。僕の成長のため、皆様の成長の手助けのためになればよいなと思います。

C#でAWS S3にデータを送受信方法

実行環境

AWS S3, C#
Editer : VisualStadio2022
PC : Windows11

今回はAWS S3に関しては作成済みということで進めていく。

ソースコード

・usingパッケージ
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.IO;

using System, using System.IOは標準で呼び出せる。
using Amazon, using Amazon.S3, using Amazon.S3.ModelはNugetパッケージマネージャからインストールする。

C#からAWS S3へのデータ送信ソースコード
static IAmazonS3 client;
static string bucketName = "";  //バケット名の入力
static string profileName = "default";
static string accessKey = ""; //アクセスキーの入力
static string secretKey = ""; //シークレットキーの入力

[Obsolete]
static void Main(string[] args)
{
    Amazon.Util.ProfileManager.RegisterProfile(profileName, accessKey, secretKey);

    using (client = new AmazonS3Client(RegionEndpoint.APNortheast1))
    {
        string[] files = Directory.GetFiles("folder", "*", SearchOption.AllDirectories);

        foreach (string str in files)
        {
            string str2 = str.Replace("\\", "/");
            WritingAnObject(str, str2);
        }
    }
}
static async void WritingAnObject(string filename, string filename2)
{
    try
    {
        PutObjectRequest putRequest = new PutObjectRequest
        {
            BucketName = bucketName,
            Key = filename2,
            FilePath = filename
        };
        PutObjectResponse response = await client.PutObjectAsync(putRequest);
        Console.WriteLine("Status Code: " + response.HttpStatusCode);
    }
}
ソースコード解説

バケット名, アクセスキー, シークレットキーはご自身のAWSのキーを使用。
アクセスキー、シークレットキーはIAMユーザーの認証情報から取得可能。

Amazon.Util.ProfileManager.RegisterProfile("string", "string", "string")で後のprofileNameで参照できるプロファイルを登録する。

client = new AmazonS3Client(RegionEndPoint.APNortheast1)

new AmazonS3Client()でアプリケーションのデフォルト設定から読み込まれた認証情報を使用してAWSS3Clientを構築。

RegionEndPoint.APNortheast1はリージョンの設定。

using(){} はusingステートメントといってリソースの破棄を行う。
(ファイルなどはアンマネージド型リソースなのでリソースの権利取得から操作、破棄までのプログラムを記述しなければならないが、usingでリソースの破棄するプログラムを省略でき、簡略化することが可能)

string[] files = Directory.GetFiles("folder", "*", SearchOption.AllDirectories);

Directory.GetFiles()は指定したディレクトリ内のファイル名前(パスを含む)を返す。

folder, "*", SearchOption.AllDirectoriesは「(自分のソースコード配置位置)\bin\Debug\net6.0」内にfolderの中のデータすべてを意味する。

ワイルドカード"*"はすべてのフォルダを意味する。(正規表現

SearchOption.AllDirectoriesはサブフォルダも含めたすべてのフォルダを取得する。