web-dev-qa-db-fra.com

Comment spécifier les informations d'identification AWS dans le programme de console principale C # .NET

J'essaie de tester un programme de console de base .NET pour publier un message sur SNS. Comme j'ai eu des problèmes pour le faire fonctionner dans Lambda, je veux l'essayer dans un environnement non-Lambda. Dans Lambda, la sécurité est couverte par le rôle, mais dans un programme de console, je suppose que je dois spécifier ma clé d'accès et mon secret d'une manière ou d'une autre.

J'ai lu cette page: http://docs.aws.Amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#net-dg-config -creds-sdk-store , mais toujours totalement confus.

J'exécute sur mon ordinateur de développement local, pas une instance EC2. Aucune intention d'aller en production avec cela, juste en essayant de tester du code.

Je suis sur Visual Studio 2015, .NET Core 1.0. J'ai utilisé Nuget pour obtenir les éléments suivants: "AWSSDK.Extensions.NETCore.Setup": "3.3.3", "AWSSDK.SimpleNotificationService": "3.3.0.23",

Basé sur la réponse à Comment définir les informations d'identification sur AWS SDK sur NET Core? J'ai créé le fichier /user/.aws/credentials (en supposant que les informations d'identification étaient le nom du fichier et non le nom du répertoire).

Mais cette question/réponse ne traite pas de l'utilisation réelle de ce fichier. Le code que j'utilise est ci-dessous.

    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(); 
    }

L'erreur que je reçois sur le nouveau client est:

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

Additional information: Unable to find credentials

Je vois qu'il existe un moyen de passer un objet AWSCredentials à ce constructeur, mais je ne comprends pas comment le construire. Amazon.Runtime.AWSCredentials est une classe abstraite, donc je ne peux pas l'utiliser dans une "nouvelle" déclaration.

12
NealWalters

Basé sur la réponse de Dan Pantry, voici une réponse courte simple avec le code mis en évidence (notez l'énumération de la région sur la deuxième ligne):

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

Utilisez un rôle si possible, mais ci-dessus fonctionne si nécessaire. Ensuite, la question est de savoir où stocker la clé d'accès/clé secrète; pourrait être une variable d'environnement, un fichier de configuration, une invite de l'utilisateur ou l'un des suspects habituels.

12
NealWalters

Vous voudrez construire une de ses classes enfants au lieu de la classe abstraite. Vous pouvez jeter un œil à la hiérarchie des classes ici .

Pour la postérité, les options sont:

  • AnonymousAWSCredentials - S'authentifie en tant qu'utilisateur anonyme.
  • BasicAWSCredentials - Vous fournissez vos informations d'identification directement au constructeur de classe.
  • EnvironmentAWSCredentials - Les informations d'identification sont extraites des variables d'environnement de l'exécutable en cours d'exécution.
  • InstanceProfileAWSCredentials - Extrait les informations d'identification du profil d'instance de l'instance EC2 exécutant l'exécutable. Cela, évidemment, ne fonctionne que sur EC2.
  • SessionAWSCredentials - Semblable à BasicAWSCredentials, sauf qu'il utilise une session AWS utilisant un jeton de session temporaire d'AWS STS.
  • RefreshingSessionAWSCredentials - Similaire à SessionAWSCredentials, mais s'actualise lorsque le jeton STS expire.

Notez que la stratégie par défaut en l'absence d'un objet d'informations d'identification implique la vérification des variables d'environnement, puis le profil d'instance.

Si vous souhaitez que le programme extrait les informations d'identification de ~/.aws/credentials, vous devrez faire quelques démarches. Il y avait autrefois une classe StoredProfileAWSCredentials, mais cela semble avoir été supprimé - vous pouvez trouver plus d'informations en regardant this github issue. Ceci n'est utile que dans le développement car vous n'utiliserez pas ~/.aws/credentials dans les profils de production mais probablement d'instance - je suggère d'utiliser à la place la stratégie par défaut et l'utilisation des informations d'identification d'AWS dans les environnements de test ou de développement.

J'utilise cette approche au travail car nous utilisons un outil de ligne de commande pour nous saisir des jetons à durée limitée d'AWS STS et les plonger dans le shell actuel pour une utilisation pendant l'heure suivante.

EDIT: Il semble que vous utilisez AWS Lambda. Ceux-ci ont un accès fédéré aux ressources AWS en fonction des rôles qui leur sont attribués, donc cela devrait fonctionner en utilisant la stratégie d'informations d'identification par défaut dans la bibliothèque aws-sdk qui utilise des profils d'instance. Donc, cela n'est vraiment nécessaire que pour le développement/test, auquel cas je recommanderais à nouveau d'utiliser uniquement des variables d'environnement.

16
Dan Pantry

C'est une très vieille question, et les réponses existantes fonctionnent, mais je vraiment n'aime pas coder en dur mon ID de clé d'accès et mes valeurs de clé secrète directement dans le code source, même pour les projets jetables que je fais sur ma machine locale. D'une part, je pourrais révoquer ces clés à l'avenir, donc je veux tirer parti des informations d'identification dans mon fichier .aws\credentials.

Pour ce faire, pour mes applications principales .NET (y compris les applications de console, etc.), j'ajoute d'abord deux packages NuGet:

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

Ensuite, j'ajoute un fichier applications.json à mon projet, qui contient les éléments suivants (remarque - vous devez cliquer avec le bouton droit sur le fichier et définir "Copier vers la sortie" comme "copier si plus récent" ou "toujours"):

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

Enfin, je crée une instance du client AWS SDK à l'aide des éléments suivants:

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

De cette façon, si je mets à jour mon fichier d'informations d'identification, je vais bien. Ou si mon code est compressé et envoyé par e-mail à un ami ou un collègue, je ne leur envoie pas accidentellement mes informations d'identification également.

Il existe une autre façon de le faire, sans avoir à ajouter également les packages NuGet, ce que de nombreuses personnes préféreront peut-être. Vous pouvez utiliser la nouvelle classe SharedCredentialsFile et AWSCredentialsFactory, comme ceci (en utilisant le profil "par défaut" ici et en supposant que votre fichier d'informations d'identification se trouve à l'emplacement par défaut, comme pour l'autre méthode):

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

var s3Client = new AmazonS3Client(credentials);

Remarque - Je ne vérifie pas que les deux méthodes Try * réussissent ici, ce que vous devriez probablement faire. Les détails sur l'utilisation de ces classes sont ici: 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