Ubuntu 20.04にC#をインストールしてAWS SDKを使ってみる
C#をほとんど触ったことがないので、手元のUbuntu 20.04に入れてHelloWorldを書きました。そしてC#のAWS SDKをインストールしてAWSのAPIにアクセスしてみました。
環境は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!
実行するとbin
やobj
ディレクトリにファイルが生成されます。
$ 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のインストール
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/config
に credential_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