Creating and displaying key pairs - AWS SDK for .NET

Do you want to deploy your .NET applications to AWS in just a few simple clicks? Try our new .NET CLI tooling for a simplified deployment experience! Read our blog post and submit your feedback on GitHub!

For additional information, see the section for the deployment tool in this guide.

Creating and displaying key pairs

This example shows you how to use the AWS SDK for .NET to create a key pair. The application takes the name for the new key pair and the name of a PEM file (with a ".pem" extension). It creates the keypair, writes the private key to the PEM file, and then displays all available key pairs. If you provide no command-line arguments, the application simply displays all available key pairs.

The following sections provide snippets of this example. The complete code for the example is shown after that, and can be built and run as is.

Create the key pair

The following snippet creates a key pair and then stores the private key to the given PEM file.

The example at the end of this topic shows this snippet in use.

// // Method to create a key pair and save the key material in a PEM file private static async Task CreateKeyPair( IAmazonEC2 ec2Client, string keyPairName, string pemFileName) { // Create the key pair CreateKeyPairResponse response = await ec2Client.CreateKeyPairAsync(new CreateKeyPairRequest{ KeyName = keyPairName }); Console.WriteLine($"\nCreated new key pair: {response.KeyPair.KeyName}"); // Save the private key in a PEM file using (var s = new FileStream(pemFileName, FileMode.Create)) using (var writer = new StreamWriter(s)) { writer.WriteLine(response.KeyPair.KeyMaterial); } }

Display available key pairs

The following snippet displays a list of the available key pairs.

The example at the end of this topic shows this snippet in use.

// // Method to show the key pairs that are available private static async Task EnumerateKeyPairs(IAmazonEC2 ec2Client) { DescribeKeyPairsResponse response = await ec2Client.DescribeKeyPairsAsync(); Console.WriteLine("Available key pairs:"); foreach (KeyPairInfo item in response.KeyPairs) Console.WriteLine($" {item.KeyName}"); }

Complete code

This section shows relevant references and the complete code for this example.

NuGet packages:

Programming elements:

using System; using System.Threading.Tasks; using System.IO; using Amazon.EC2; using Amazon.EC2.Model; using System.Collections.Generic; namespace EC2CreateKeyPair { // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class to create and store a key pair class Program { static async Task Main(string[] args) { // Create the EC2 client var ec2Client = new AmazonEC2Client(); // Parse the command line and show help if necessary var parsedArgs = CommandLine.Parse(args); if(parsedArgs.Count == 0) { // In the case of no command-line arguments, // just show help and the existing key pairs PrintHelp(); Console.WriteLine("\nNo arguments specified."); Console.Write( "Do you want to see a list of the existing key pairs? ((y) or n): "); string response = Console.ReadLine(); if((string.IsNullOrEmpty(response)) || (response.ToLower() == "y")) await EnumerateKeyPairs(ec2Client); return; } // Get the application arguments from the parsed list string keyPairName = CommandLine.GetArgument(parsedArgs, null, "-k", "--keypair-name"); string pemFileName = CommandLine.GetArgument(parsedArgs, null, "-p", "--pem-filename"); if(string.IsNullOrEmpty(keyPairName)) CommandLine.ErrorExit("\nNo key pair name specified." + "\nRun the command with no arguments to see help."); if(string.IsNullOrEmpty(pemFileName) || !pemFileName.EndsWith(".pem")) CommandLine.ErrorExit("\nThe PEM filename is missing or incorrect." + "\nRun the command with no arguments to see help."); // Create the key pair await CreateKeyPair(ec2Client, keyPairName, pemFileName); await EnumerateKeyPairs(ec2Client); } // // Method to create a key pair and save the key material in a PEM file private static async Task CreateKeyPair( IAmazonEC2 ec2Client, string keyPairName, string pemFileName) { // Create the key pair CreateKeyPairResponse response = await ec2Client.CreateKeyPairAsync(new CreateKeyPairRequest{ KeyName = keyPairName }); Console.WriteLine($"\nCreated new key pair: {response.KeyPair.KeyName}"); // Save the private key in a PEM file using (var s = new FileStream(pemFileName, FileMode.Create)) using (var writer = new StreamWriter(s)) { writer.WriteLine(response.KeyPair.KeyMaterial); } } // // Method to show the key pairs that are available private static async Task EnumerateKeyPairs(IAmazonEC2 ec2Client) { DescribeKeyPairsResponse response = await ec2Client.DescribeKeyPairsAsync(); Console.WriteLine("Available key pairs:"); foreach (KeyPairInfo item in response.KeyPairs) Console.WriteLine($" {item.KeyName}"); } // // Command-line help private static void PrintHelp() { Console.WriteLine( "\nUsage: EC2CreateKeyPair -k <keypair-name> -p <pem-filename>" + "\n -k, --keypair-name: The name you want to assign to the key pair." + "\n -p, --pem-filename: The name of the PEM file to create, with a \".pem\" extension."); } } // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class that represents a command line on the console or terminal. // (This is the same for all examples. When you have seen it once, you can ignore it.) static class CommandLine { // // Method to parse a command line of the form: "--key value" or "-k value". // // Parameters: // - args: The command-line arguments passed into the application by the system. // // Returns: // A Dictionary with string Keys and Values. // // If a key is found without a matching value, Dictionary.Value is set to the key // (including the dashes). // If a value is found without a matching key, Dictionary.Key is set to "--NoKeyN", // where "N" represents sequential numbers. public static Dictionary<string,string> Parse(string[] args) { var parsedArgs = new Dictionary<string,string>(); int i = 0, n = 0; while(i < args.Length) { // If the first argument in this iteration starts with a dash it's an option. if(args[i].StartsWith("-")) { var key = args[i++]; var value = key; // Check to see if there's a value that goes with this option? if((i < args.Length) && (!args[i].StartsWith("-"))) value = args[i++]; parsedArgs.Add(key, value); } // If the first argument in this iteration doesn't start with a dash, it's a value else { parsedArgs.Add("--NoKey" + n.ToString(), args[i++]); n++; } } return parsedArgs; } // // Method to get an argument from the parsed command-line arguments // // Parameters: // - parsedArgs: The Dictionary object returned from the Parse() method (shown above). // - defaultValue: The default string to return if the specified key isn't in parsedArgs. // - keys: An array of keys to look for in parsedArgs. public static string GetArgument( Dictionary<string,string> parsedArgs, string defaultReturn, params string[] keys) { string retval = null; foreach(var key in keys) if(parsedArgs.TryGetValue(key, out retval)) break; return retval ?? defaultReturn; } // // Method to exit the application with an error. public static void ErrorExit(string msg, int code=1) { Console.WriteLine("\nError"); Console.WriteLine(msg); Environment.Exit(code); } } }

Additional considerations

  • When you create a key pair, you must save the private key that is returned because you can't retrieve the private key later.