Meluncurkan instans Amazon EC2 - AWS SDK for .NET

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Meluncurkan instans Amazon EC2

Contoh ini menunjukkan kepada Anda cara menggunakan AWS SDK for .NET untuk meluncurkan satu atau lebih instans Amazon EC2 yang dikonfigurasi secara identik dari Amazon Machine Image (AMI) yang sama. Menggunakan beberapa input yang Anda berikan, aplikasi meluncurkan instans EC2 dan kemudian memonitor instance hingga keluar dari status “Tertunda”.

Saat instans EC2 Anda berjalan, Anda dapat menghubungkannya dari jarak jauh, seperti yang dijelaskan dalam. (opsional) Connect ke instance

Anda dapat meluncurkan instans EC2 di VPC atau EC2-Classic (jika akun AWS Anda mendukung ini). Untuk informasi selengkapnya tentang EC2 dalam VPC versus EC2-Classic, lihat Panduan Pengguna Amazon EC2 atau Panduan Pengguna Amazon EC2.

Awas

Kami pensiun EC2-Classic pada 15 Agustus 2022. Kami menyarankan Anda bermigrasi dari EC2-Classic ke VPC. Untuk informasi selengkapnya, lihat Memigrasi dari EC2-Classic ke VPC di Panduan Pengguna Amazon EC2 atau Panduan Pengguna Amazon EC2. Lihat juga posting blog EC2-Classic Networking is Retiring - Inilah Cara Mempersiapkan.

Bagian berikut menyediakan cuplikan dan informasi lain untuk contoh ini. Kode lengkap untuk contoh ditampilkan setelah cuplikan, dan dapat dibangun dan dijalankan apa adanya.

Kumpulkan apa yang Anda butuhkan

Untuk meluncurkan instans EC2, Anda memerlukan beberapa hal.

  • VPC tempat instance akan diluncurkan. Jika itu adalah instance Windows dan Anda akan menghubungkannya melalui RDP, VPC kemungkinan besar harus memiliki gateway internet yang terpasang padanya, serta entri untuk gateway internet di tabel rute. Untuk informasi lebih lanjut, lihat Gateway internet di Panduan Pengguna Amazon VPC.

  • ID subnet yang ada di VPC tempat instance akan diluncurkan. Cara mudah untuk menemukan atau membuat ini adalah dengan masuk ke konsol VPC Amazon, tetapi Anda juga dapat memperolehnya secara terprogram dengan menggunakan metode dan. CreateSubnetAsyncDescribeSubnetsAsync

    catatan

    Jika AWS akun Anda mendukung EC2-Classic dan itulah jenis instans yang ingin Anda luncurkan, parameter ini tidak diperlukan. Namun, jika akun Anda tidak mendukung EC2-Classic dan Anda tidak menyediakan parameter ini, instans baru akan diluncurkan di VPC default untuk akun Anda.

  • Jika Anda ingin terhubung ke instance baru, grup keamanan yang disebutkan sebelumnya harus memiliki aturan masuk yang sesuai yang memungkinkan lalu lintas SSH pada port 22 (instance Linux) atau lalu lintas RDP pada port 3389 (instance Windows). Untuk informasi tentang cara melakukan iniMemperbarui grup keamanan, lihat, termasuk Pertimbangan tambahan mendekati akhir topik itu.

  • Nama file PEM yang berisi kunci pribadi dari key pair EC2 yang disebutkan sebelumnya. File PEM digunakan saat Anda terhubung dari jarak jauh ke instance.

Luncurkan sebuah instans

Cuplikan berikut meluncurkan instans EC2.

Contoh di dekat akhir topik ini menunjukkan cuplikan ini digunakan.

// // Method to launch the instances // Returns a list with the launched instance IDs private static async Task<List<string>> LaunchInstances( IAmazonEC2 ec2Client, RunInstancesRequest requestLaunch) { var instanceIds = new List<string>(); RunInstancesResponse responseLaunch = await ec2Client.RunInstancesAsync(requestLaunch); Console.WriteLine("\nNew instances have been created."); foreach (Instance item in responseLaunch.Reservation.Instances) { instanceIds.Add(item.InstanceId); Console.WriteLine($" New instance: {item.InstanceId}"); } return instanceIds; }

Pantau instance

Cuplikan berikut memonitor instance hingga keluar dari status “Tertunda”.

Contoh di dekat akhir topik ini menunjukkan cuplikan ini digunakan.

Lihat InstanceStatekelas untuk nilai valid dari Instance.State.Code properti.

// // Method to wait until the instances are running (or at least not pending) private static async Task CheckState(IAmazonEC2 ec2Client, List<string> instanceIds) { Console.WriteLine( "\nWaiting for the instances to start." + "\nPress any key to stop waiting. (Response might be slightly delayed.)"); int numberRunning; DescribeInstancesResponse responseDescribe; var requestDescribe = new DescribeInstancesRequest{ InstanceIds = instanceIds}; // Check every couple of seconds int wait = 2000; while(true) { // Get and check the status for each of the instances to see if it's past pending. // Once all instances are past pending, break out. // (For this example, we are assuming that there is only one reservation.) Console.Write("."); numberRunning = 0; responseDescribe = await ec2Client.DescribeInstancesAsync(requestDescribe); foreach(Instance i in responseDescribe.Reservations[0].Instances) { // Check the lower byte of State.Code property // Code == 0 is the pending state if((i.State.Code & 255) > 0) numberRunning++; } if(numberRunning == responseDescribe.Reservations[0].Instances.Count) break; // Wait a bit and try again (unless the user wants to stop waiting) Thread.Sleep(wait); if(Console.KeyAvailable) break; } Console.WriteLine("\nNo more instances are pending."); foreach(Instance i in responseDescribe.Reservations[0].Instances) { Console.WriteLine($"For {i.InstanceId}:"); Console.WriteLine($" VPC ID: {i.VpcId}"); Console.WriteLine($" Instance state: {i.State.Name}"); Console.WriteLine($" Public IP address: {i.PublicIpAddress}"); Console.WriteLine($" Public DNS name: {i.PublicDnsName}"); Console.WriteLine($" Key pair name: {i.KeyName}"); } }

Kode lengkap

Bagian ini menunjukkan referensi yang relevan dan kode lengkap untuk contoh ini.

using System; using System.Threading; using System.Threading.Tasks; using System.Collections.Generic; using Amazon.EC2; using Amazon.EC2.Model; namespace EC2LaunchInstance { // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class to launch an EC2 instance class Program { static async Task Main(string[] args) { // Parse the command line and show help if necessary var parsedArgs = CommandLine.Parse(args); if(parsedArgs.Count == 0) { PrintHelp(); return; } // Get the application arguments from the parsed list string groupID = CommandLine.GetArgument(parsedArgs, null, "-g", "--group-id"); string ami = CommandLine.GetArgument(parsedArgs, null, "-a", "--ami-id"); string keyPairName = CommandLine.GetArgument(parsedArgs, null, "-k", "--keypair-name"); string subnetID = CommandLine.GetArgument(parsedArgs, null, "-s", "--subnet-id"); if( (string.IsNullOrEmpty(groupID) || !groupID.StartsWith("sg-")) || (string.IsNullOrEmpty(ami) || !ami.StartsWith("ami-")) || (string.IsNullOrEmpty(keyPairName)) || (!string.IsNullOrEmpty(subnetID) && !subnetID.StartsWith("subnet-"))) CommandLine.ErrorExit( "\nOne or more of the required arguments is missing or incorrect." + "\nRun the command with no arguments to see help."); // Create an EC2 client var ec2Client = new AmazonEC2Client(); // Create an object with the necessary properties RunInstancesRequest request = GetRequestData(groupID, ami, keyPairName, subnetID); // Launch the instances and wait for them to start running var instanceIds = await LaunchInstances(ec2Client, request); await CheckState(ec2Client, instanceIds); } // // Method to put together the properties needed to launch the instance. private static RunInstancesRequest GetRequestData( string groupID, string ami, string keyPairName, string subnetID) { // Common properties var groupIDs = new List<string>() { groupID }; var request = new RunInstancesRequest() { // The first three of these would be additional command-line arguments or similar. InstanceType = InstanceType.T1Micro, MinCount = 1, MaxCount = 1, ImageId = ami, KeyName = keyPairName }; // Properties specifically for EC2 in a VPC. if(!string.IsNullOrEmpty(subnetID)) { request.NetworkInterfaces = new List<InstanceNetworkInterfaceSpecification>() { new InstanceNetworkInterfaceSpecification() { DeviceIndex = 0, SubnetId = subnetID, Groups = groupIDs, AssociatePublicIpAddress = true } }; } // Properties specifically for EC2-Classic else { request.SecurityGroupIds = groupIDs; } return request; } // // Method to launch the instances // Returns a list with the launched instance IDs private static async Task<List<string>> LaunchInstances( IAmazonEC2 ec2Client, RunInstancesRequest requestLaunch) { var instanceIds = new List<string>(); RunInstancesResponse responseLaunch = await ec2Client.RunInstancesAsync(requestLaunch); Console.WriteLine("\nNew instances have been created."); foreach (Instance item in responseLaunch.Reservation.Instances) { instanceIds.Add(item.InstanceId); Console.WriteLine($" New instance: {item.InstanceId}"); } return instanceIds; } // // Method to wait until the instances are running (or at least not pending) private static async Task CheckState(IAmazonEC2 ec2Client, List<string> instanceIds) { Console.WriteLine( "\nWaiting for the instances to start." + "\nPress any key to stop waiting. (Response might be slightly delayed.)"); int numberRunning; DescribeInstancesResponse responseDescribe; var requestDescribe = new DescribeInstancesRequest{ InstanceIds = instanceIds}; // Check every couple of seconds int wait = 2000; while(true) { // Get and check the status for each of the instances to see if it's past pending. // Once all instances are past pending, break out. // (For this example, we are assuming that there is only one reservation.) Console.Write("."); numberRunning = 0; responseDescribe = await ec2Client.DescribeInstancesAsync(requestDescribe); foreach(Instance i in responseDescribe.Reservations[0].Instances) { // Check the lower byte of State.Code property // Code == 0 is the pending state if((i.State.Code & 255) > 0) numberRunning++; } if(numberRunning == responseDescribe.Reservations[0].Instances.Count) break; // Wait a bit and try again (unless the user wants to stop waiting) Thread.Sleep(wait); if(Console.KeyAvailable) break; } Console.WriteLine("\nNo more instances are pending."); foreach(Instance i in responseDescribe.Reservations[0].Instances) { Console.WriteLine($"For {i.InstanceId}:"); Console.WriteLine($" VPC ID: {i.VpcId}"); Console.WriteLine($" Instance state: {i.State.Name}"); Console.WriteLine($" Public IP address: {i.PublicIpAddress}"); Console.WriteLine($" Public DNS name: {i.PublicDnsName}"); Console.WriteLine($" Key pair name: {i.KeyName}"); } } // // Command-line help private static void PrintHelp() { Console.WriteLine( "\nUsage: EC2LaunchInstance -g <group-id> -a <ami-id> -k <keypair-name> [-s <subnet-id>]" + "\n -g, --group-id: The ID of the security group." + "\n -a, --ami-id: The ID of an Amazon Machine Image." + "\n -k, --keypair-name - The name of a key pair." + "\n -s, --subnet-id: The ID of a subnet. Required only for EC2 in a VPC."); } } // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // 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); } } }

Pertimbangan tambahan

  • Saat memeriksa status instans EC2, Anda dapat menambahkan filter ke Filter properti DescribeInstancesRequestobjek. Dengan menggunakan teknik ini, Anda dapat membatasi permintaan ke instance tertentu; misalnya, instance dengan tag tertentu yang ditentukan pengguna.

  • Untuk singkatnya, beberapa properti diberi nilai tipikal. Salah satu atau semua properti ini dapat ditentukan secara terprogram atau dengan masukan pengguna.

  • Anda juga dapat melampirkan peran IAM ke instance saat meluncurkannya. Untuk melakukannya, buat IamInstanceProfileSpecificationobjek yang Name propertinya disetel ke nama peran IAM. Kemudian tambahkan objek itu ke IamInstanceProfile properti RunInstancesRequestobjek.

    catatan

    Untuk meluncurkan instans EC2 yang memiliki peran IAM terpasang, konfigurasi pengguna IAM harus menyertakan izin tertentu. Untuk informasi selengkapnya tentang izin yang diperlukan, lihat Panduan Pengguna Amazon EC2 atau Panduan Pengguna Amazon EC2.

(opsional) Connect ke instance

Setelah instance berjalan, Anda dapat menghubungkannya dari jarak jauh dengan menggunakan klien jarak jauh yang sesuai. Untuk instance Linux dan Windows, Anda memerlukan alamat IP publik instans atau nama DNS publik. Anda juga membutuhkan yang berikut ini.

Untuk instance Linux

Anda dapat menggunakan klien SSH untuk terhubung ke instance Linux Anda. Pastikan bahwa grup keamanan yang Anda gunakan saat meluncurkan instans memungkinkan lalu lintas SSH pada port 22, seperti yang dijelaskan dalamMemperbarui grup keamanan.

Anda juga memerlukan bagian pribadi dari key pair yang Anda gunakan untuk meluncurkan instance; yaitu, file PEM.

Untuk informasi selengkapnya, lihat Connect ke instans Linux Anda di Panduan Pengguna Amazon EC2.

Untuk contoh Windows

Anda dapat menggunakan klien RDP untuk terhubung ke instans Anda. Pastikan bahwa grup keamanan yang Anda gunakan saat meluncurkan instans memungkinkan lalu lintas RDP pada port 3389, seperti yang dijelaskan dalam. Memperbarui grup keamanan

Anda juga memerlukan kata sandi Administrator. Anda dapat memperoleh ini dengan menggunakan kode contoh berikut, yang memerlukan ID instance dan bagian pribadi dari key pair yang digunakan untuk meluncurkan instance; yaitu, file PEM.

Untuk informasi selengkapnya, lihat Menyambungkan ke instans Windows Anda di Panduan Pengguna Amazon EC2.

Awas

Kode contoh ini mengembalikan kata sandi Administrator plaintext untuk instance Anda.

using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Amazon.EC2; using Amazon.EC2.Model; namespace EC2GetWindowsPassword { // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class to get the Administrator password of a Windows EC2 instance class Program { static async Task Main(string[] args) { // Parse the command line and show help if necessary var parsedArgs = CommandLine.Parse(args); if(parsedArgs.Count == 0) { PrintHelp(); return; } // Get the application arguments from the parsed list string instanceID = CommandLine.GetArgument(parsedArgs, null, "-i", "--instance-id"); string pemFileName = CommandLine.GetArgument(parsedArgs, null, "-p", "--pem-filename"); if( (string.IsNullOrEmpty(instanceID) || !instanceID.StartsWith("i-")) || (string.IsNullOrEmpty(pemFileName) || !pemFileName.EndsWith(".pem"))) CommandLine.ErrorExit( "\nOne or more of the required arguments is missing or incorrect." + "\nRun the command with no arguments to see help."); // Create the EC2 client var ec2Client = new AmazonEC2Client(); // Get and display the password string password = await GetPassword(ec2Client, instanceID, pemFileName); Console.WriteLine($"\nPassword: {password}"); } // // Method to get the administrator password of a Windows EC2 instance private static async Task<string> GetPassword( IAmazonEC2 ec2Client, string instanceID, string pemFilename) { string password = string.Empty; GetPasswordDataResponse response = await ec2Client.GetPasswordDataAsync(new GetPasswordDataRequest{ InstanceId = instanceID}); if(response.PasswordData != null) { password = response.GetDecryptedPassword(File.ReadAllText(pemFilename)); } else { Console.WriteLine($"\nThe password is not available for instance {instanceID}."); Console.WriteLine($"If this is a Windows instance, the password might not be ready."); } return password; } // // Command-line help private static void PrintHelp() { Console.WriteLine( "\nUsage: EC2GetWindowsPassword -i <instance-id> -p pem-filename" + "\n -i, --instance-id: The name of the EC2 instance." + "\n -p, --pem-filename: The name of the PEM file with the private key."); } } // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // 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); } } }

Bersihkan

Ketika Anda tidak lagi membutuhkan instans EC2 Anda, pastikan untuk menghentikannya, seperti yang dijelaskan dalam. Mengakhiri instans Amazon EC2