web-dev-qa-db-ja.com

C#.NETコアコンソールプログラムでAWS認証情報を指定する方法

.NETコアコンソールプログラムをテストして、SNSにメッセージを公開しようとしています。 Lambdaで動作させるために問題が発生したため、Lambda以外の環境で試してみたいと思います。 Lambdaでは、セキュリティはロールでカバーされますが、コンソールプログラムでは、何らかの方法でアクセスキーとシークレットを指定する必要があると思います。

私はこのページを読みました: http://docs.aws.Amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#net-dg-config -creds-sdk-store 、しかしそれでも完全に混乱しています。

EC2インスタンスではなく、ローカル開発コンピューターで実行しています。これを使って本番に行くつもりはなく、コードをテストするだけです。

私はVisual Studio 2015、.NET Core 1.0を使用しています。 Nugetを使用して以下を取得しました: "AWSSDK.Extensions.NETCore.Setup": "3.3.3"、 "AWSSDK.SimpleNotificationService": "3.3.0.23"、

NET Core上のAWS SDKで認証情報を設定する方法? の回答に基づいて、/ user/.aws/credentialsファイルを作成しました(認証情報はディレクトリ名ではなくファイル名であると仮定しています)。

しかし、その質問/回答は、このファイルを実際に使用する方法を扱っていません。私が実行しているコードは次のとおりです。

    public static void Main(string[] args)
    {
        Console.WriteLine("Started");
        //var awsCredentials = new Amazon.Runtime.AWSCredentials()
        var client = new Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.EUWest2);
        //var client = new Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceClient(awsCredentials, Amazon.RegionEndpoint.EUWest2);
        //Amazon.SimpleNotificationService.Model.PublishResponse publishResp = null;
        SendMessage(client).Wait();
        Console.WriteLine("Completed call to SendMessage: Press enter to end:");
        Console.ReadLine(); 
    }

私が新しいクライアントで取得しているエラーは次のとおりです。

An unhandled exception of type 'Amazon.Runtime.AmazonServiceException' occurred in AWSSDK.Core.dll

Additional information: Unable to find credentials

AWSCredentialsオブジェクトをそのコンストラクターに渡す方法はありますが、構築方法がわかりません。 Amazon.Runtime.AWSCredentialsは抽象クラスなので、「新しい」ステートメントでは使用できません。

12
NealWalters

Dan Pantryの回答に基づいて、コードを強調表示した簡単な短い回答を次に示します(2行目の領域列挙に注意してください)。

var awsCredentials = new Amazon.Runtime.BasicAWSCredentials("myaccesskey", "mysecretkey"); 
var client = new Amazon.SimpleNotificationService.AmazonSimpleNotificationSer‌​viceClient(awsCreden‌​tials, Amazon.RegionEndpoint.EUWest2);

可能であればロールを使用しますが、必要に応じて上記の機能を使用できます。質問は、アクセスキー/シークレットキーの保存場所です。環境変数、設定ファイル、ユーザーへのプロンプト、または通常の容疑者のいずれかです。

12
NealWalters

抽象クラスではなく、子クラスの1つを構築する必要があります。クラス階層 here を見ることができます。

後世の場合、オプションは次のとおりです。

  • AnonymousAWSCredentials-匿名ユーザーとして認証します。
  • BasicAWSCredentials-資格情報をクラスコンストラクターに直接提供します。
  • EnvironmentAWSCredentials-資格情報は、実行中の実行可能ファイルの環境変数から取得されます。
  • InstanceProfileAWSCredentials-実行可能ファイルを実行しているEC2インスタンスのインスタンスプロファイルから資格情報を取得します。これは明らかに、EC2でのみ機能します。
  • SessionAWSCredentials-BasicAWSCredentialsに似ていますが、AWS STSからの一時セッショントークンを使用してAWSセッションを利用する点が異なります。
  • RefreshingSessionAWSCredentials-SessionAWSCredentialsに似ていますが、STSトークンの有効期限が切れると更新されます。

資格情報オブジェクトがない場合のデフォルト戦略では、環境変数をチェックしてからインスタンスプロファイルをチェックすることに注意してください。

プログラムが~/.aws/credentialsから資格情報をプルするようにしたい場合は、いくつかの作業を行う必要があります。以前はStoredProfileAWSCredentialsクラスがありましたが、削除されたようです- this github issueで詳細を確認できます。これは、実稼働環境では~/.aws/credentialsを使用せず、おそらくインスタンスプロファイルを使用するため、開発環境でのみ有効です。代わりに、テスト環境または開発環境でデフォルトの戦略と環境AWS認証情報を使用することをお勧めします。

コマンドラインツールを使用して、AWS STSから限られた時間のトークンを取得し、次の時間に使用するために現在のシェルに格納するため、このアプローチを採用しています。

編集:AWS Lambdaを使用しているようです。これらは、割り当てられたロールに基づいてAWSリソースへのフェデレーションアクセスを持っているため、インスタンスプロファイルを使用するaws-sdkライブラリのデフォルトの認証情報戦略を使用して機能します。したがって、これは開発/テストにのみ必要です。その場合は、環境変数を使用することをお勧めします。

16
Dan Pantry

これは本当に古い質問であり、既存の回答は機能しますが、私reallyはアクセスキーIDとシークレットキーの値を直接ハードコーディングすることを嫌いますローカルマシンで行っている使い捨てプロジェクトでも、ソースコードに変換します。 1つには、将来これらのキーを無効にする可能性があるため、.aws\credentialsファイルの資格情報を活用したいです。

.NETコアアプリ(コンソールアプリなどを含む)でこれを行うには、まず2つのNuGetパッケージを追加します。

  • Microsoft.Extensions.Configuration.Json
  • AWSSDK.Extensions.NETCore.Setup

次に、applications.jsonファイルをプロジェクトに追加します。このファイルには、次のものが含まれています(注-ファイルを右クリックし、[出力にコピー]を[新しい場合はコピー]または[常に]に設定)。

{
  "AWS": {
    "Profile": "default",
    "ProfilesLocation": "C:\\Users\\my-user-profile-folder\\.aws\\credentials",
    "Region": "us-west-2"
  }
}

最後に、次を使用してAWS SDKクライアントのインスタンスを作成します。

var builder = new ConfigurationBuilder().AddJsonFile("appsettings.Development.json", optional: false, reloadOnChange: true);
var options = builder.Build().GetAWSOptions();
var s3client = options.CreateServiceClient<IAmazonS3>();

このようにして、資格情報ファイルを更新しても問題ありません。または、コードが圧縮されて友人や同僚にメールで送信された場合、誤って資格情報を送信することはありません。

anotherこれを行う方法があります。NuGetパッケージも追加する必要がなく、多くの人が好むでしょう。次のように、新しいSharedCredentialsFileクラスとAWSCredentialsFactoryを使用できます(ここで「デフォルト」プロファイルを使用し、資格情報ファイルが他の方法と同じデフォルトの場所にあると想定しています):

var sharedFile = new SharedCredentialsFile();
sharedFile.TryGetProfile("default", out var profile);
AWSCredentialsFactory.TryGetAWSCredentials(profile, sharedFile, out var credentials);

var s3Client = new AmazonS3Client(credentials);

注-ここでは、2つのTry *メソッドが成功していることを確認していませんが、おそらく実行する必要があります。これらのクラスの使用方法の詳細はこちら: https://docs.aws.Amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#how-to- create-an-amazons3client-using-the-sharedcredentialsfile-class

7
Kirkaiya