.NET Core で Google Cloud Storage にファイルをアップロードするメモ

Microsoft Azure を使っていた頃は重要なファイルのバックアップ先に Azure Storage を利用していたが、 最近は Google Cloud Platform で遊んでいるので、Google Cloud Storage を使ってみることにした。 NuGet に公式のクライアントライブラリが存在するので、それを使うと簡単。

www.nuget.org

手間なのはアクセスファイルキーの入手だけ。 Firestore のときと同様に、 GCP の 「API とサービス」の「認証情報」でサービスアカウントを作成して、 アクセスキーファイルをダウンロードする必要がある。 入手さえしてしまえば、あとはサクッとファイルをアップロードできた。

using Google.Cloud.Storage.V1;
using System;
using System.IO;
using System.Threading.Tasks;

namespace CloudStorageSample
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("コマンドライン引数でファイルを指定してください。");
            }
            else
            {
                MainAsync(args).GetAwaiter().GetResult();
            }

            Console.WriteLine("Enter で終了します。");
            Console.ReadLine();
        }

        static async Task MainAsync(string[] args)
        {
            var path = Path.GetFullPath(args[0]);

            var fileName = Path.GetFileName(path);

            // API とサービスの認証情報でサービスアカウントを作成し、
            // ダウンロードしたアクセスキーファイルのパスを環境変数で指定
            Environment.SetEnvironmentVariable(
                "GOOGLE_APPLICATION_CREDENTIALS",
                Path.Combine(AppContext.BaseDirectory, "your-access-key.json"));

            var client = StorageClient.Create();

            using (var stream = File.OpenRead(path))
            {
                // 既存のバケットにアップロード
                var obj = await client.UploadObjectAsync(
                    bucket: "your-bucket-name",
                    objectName: fileName,
                    contentType: "application/octet-stream",
                    source: stream,
                    options: new UploadObjectOptions
                    {
                        // バケットのオーナーだけが管理できるようにする
                        PredefinedAcl = PredefinedObjectAcl.BucketOwnerFullControl,
                    });

                Console.WriteLine($"{obj.SelfLink} をアップロードしました。");
            }
        }
    }
}