Ubuntu 20.04にC#をインストールしてAWS SDKを使ってみる

C#をほとんど触ったことがないので、手元のUbuntu 20.04に入れてHelloWorldを書きました。そしてC#AWS SDKをインストールしてAWSAPIにアクセスしてみました。

環境はUbuntu 20.04です。

C#のインストール

手順はMicrosoftのサイトに書いてあるとおりです。

$ wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

$ sudo dpkg -i packages-microsoft-prod.deb

$ sudo apt-get update

$ sudo apt-get install -y apt-transport-https dotnet-sdk-3.1
$ dotnet --version
3.1.402

C#のHelloWorld

CLIプログラムのテンプレート作成と実行は dotnet コマンドでできるようです。空ディレクトリを作成して、その中でテンプレート作成します。

$ mkdir sample
$ cd sample
$ dotnet new console

これを実行すると、以下の通りファイル一式がカレントディレクトリに作成されます。

$ tree
.
├── Program.cs
├── obj
│   ├── project.assets.json
│   ├── project.nuget.cache
│   ├── sample.csproj.nuget.dgspec.json
│   ├── sample.csproj.nuget.g.props
│   └── sample.csproj.nuget.g.targets
└── sample.csproj

1 directory, 7 files

$ cat Program.cs 
using System;

namespace sample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

ソースコードはすでにHelloWorldになってます。

実行は以下のコマンドです。

$ dotnet run
Hello World!

実行するとbinobjディレクトリにファイルが生成されます。

$ tree
.
├── Program.cs
├── bin
│   └── Debug
│       └── netcoreapp3.1
│           ├── sample
│           ├── sample.deps.json
│           ├── sample.dll
│           ├── sample.pdb
│           ├── sample.runtimeconfig.dev.json
│           └── sample.runtimeconfig.json
├── obj
│   ├── Debug
│   │   └── netcoreapp3.1
│   │       ├── sample
│   │       ├── sample.AssemblyInfo.cs
│   │       ├── sample.AssemblyInfoInputs.cache
│   │       ├── sample.assets.cache
│   │       ├── sample.csproj.CoreCompileInputs.cache
│   │       ├── sample.csproj.FileListAbsolute.txt
│   │       ├── sample.csprojAssemblyReference.cache
│   │       ├── sample.dll
│   │       ├── sample.genruntimeconfig.cache
│   │       └── sample.pdb
│   ├── project.assets.json
│   ├── project.nuget.cache
│   ├── sample.csproj.nuget.dgspec.json
│   ├── sample.csproj.nuget.g.props
│   └── sample.csproj.nuget.g.targets
└── sample.csproj

6 directories, 23 files

C# AWS SDKのインストール

AWSのサービスごとにC#のパッケージがあるようです。

NuGet Gallery | Packages matching id:AWSSDK owner:awsdotnet

今回はS3のパッケージをインストールしてみます。

$ dotnet add package AWSSDK.S3

このコマンドを実行すると、sample.csproj にパッケージの情報が書かれます。パッケージ自体は ~/.nuget/packages/ にダウンロードされるようです。

C#からS3のAPIにアクセス

Program.cs を以下のように書きます。AWSアカウント内にあるS3バケット一覧を取得してバケット名をシンプルに表示するのみです。

using System;
using System.Threading;
using Amazon;
using Amazon.S3;

namespace S3Sample
{
    class S3Sample
    {
        static void Main(string[] args)
        {
            var client = new AmazonS3Client(RegionEndpoint.APNortheast1);
            var cancelToken = new CancellationToken();
            var task = client.ListBucketsAsync(cancelToken);
            var response = task.Result;
            foreach (var bucket in response.Buckets)
            {
                Console.WriteLine("{0}", bucket.BucketName);
            }
        }
    }
}

~/.aws/config を設定してあれば、これを実行するとバケット一覧を表示します。

~/.aws/config に複数のプロファイルがあるならば AWS_PROFILE という環境変数でプロファイル名を指定できます。

$ AWS_PROFILE=foo dotnet run 

エラーメッセージの例

~/.aws/configcredential_source = Ec2InstanceMetadata と書くことで、EC2インスタンスにアタッチされているIAMロールを使うようにしている場合は、以下のようなエラーになります。

Unhandled exception. System.AggregateException: One or more errors occurred. (Assembly AWSSDK.SecurityToken could not be found or loaded. This assembly must be available at runtime to use Amazon.Runtime.AssumeRoleAWSCredentials.)

以下のように追加のパッケージをインストールするとエラー解消します。

$ dotnet add package AWSSDK.SecurityToken