Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Lanzamiento de una EC2 instancia de Amazon
En este ejemplo, se muestra cómo utilizar el AWS SDK for .NET para lanzar una o más EC2 instancias de Amazon configuradas de forma idéntica desde la misma Amazon Machine Image (AMI). Con varias entradas que usted proporciona, la aplicación lanza una EC2 instancia y, a continuación, la monitorea hasta que deja de estar en estado «pendiente».
Cuando la EC2 instancia esté en ejecución, puede conectarse a ella de forma remota, tal y como se describe en(opcional) Conexión a la instancia.
aviso
EC2-Classic se retiró el 15 de agosto de 2022. Le recomendamos que migre de EC2 -Classic a un. VPC Para obtener más información, consulte la entrada del blog EC2-Classic Networking is Retiring: aquí le mostramos cómo prepararse
En las siguientes secciones se proporcionan fragmentos de código y otra información de este ejemplo. Después de los fragmentos de código se muestra el código completo del ejemplo, que se puede compilar y ejecutar tal cual.
Temas
Reunir todo lo necesario
Para lanzar una EC2 instancia, necesitarás varias cosas.
-
A: VPCDónde se lanzará la instancia. Si se trata de una instancia de Windows y te vas a conectar a ella a través de ellaRDP, lo más VPC probable es que necesites tener una puerta de enlace a Internet conectada, así como una entrada para la puerta de enlace a Internet en la tabla de enrutamiento. Para obtener más información, consulta las pasarelas de Internet en la Guía del VPC usuario de Amazon.
-
El ID de una subred existente en la que VPC se lanzará la instancia. Una forma sencilla de encontrarlo o crearlo es iniciar sesión en la VPCconsola de Amazon
, pero también puedes obtenerlo mediante programación mediante los métodos CreateSubnetAsyncy DescribeSubnetsAsync. nota
Si no especificas este parámetro, la nueva instancia se lanzará de forma predeterminada VPC para tu cuenta.
-
El ID de un grupo de seguridad existente que pertenece al VPC lugar donde se lanzará la instancia. Para obtener más información, consulte Trabajar con grupos de seguridad en Amazon EC2.
-
Si desea conectarse a la nueva instancia, el grupo de seguridad mencionado anteriormente debe tener una regla de entrada adecuada que permita el SSH tráfico en el puerto 22 (instancia de Linux) o el RDP tráfico en el puerto 3389 (instancia de Windows). Para obtener información sobre cómo hacerlo, consulte Actualización de grupos de seguridad, así como la sección Consideraciones adicionales al final de ese tema.
-
La imagen de máquina de Amazon (AMI) que se utilizará para crear la instancia. Para obtener más informaciónAMIs, consulte Amazon Machine Images (AMIs) en la Guía del EC2 usuario de Amazon. En concreto, consulte Find an AMI and Shared AMIs.
-
El nombre de un EC2 key pair existente, que se utiliza para conectarse a la nueva instancia. Para obtener más información, consulte Trabajar con pares de EC2 claves de Amazon.
-
El nombre del PEM archivo que contiene la clave privada del par de EC2 claves mencionado anteriormente. El PEM archivo se usa cuando te conectas remotamente a la instancia.
Iniciar una instancia
El siguiente fragmento lanza una EC2 instancia.
El ejemplo que aparece cerca del final de este tema muestra este fragmento de código en uso.
// // 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; }
Monitorización de la instancia
El siguiente fragmento de código monitoriza la instancia hasta que deja de estar en estado “Pendiente”.
El ejemplo que aparece cerca del final de este tema muestra este fragmento de código en uso.
Consulta la InstanceStateclase para ver los valores válidos de la Instance.State.Code
propiedad.
// // 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}"); } }
Código completo
En esta sección se muestran las referencias relevantes y el código completo de este ejemplo.
NuGet paquetes:
Elementos de programación:
-
Espacio de nombres Amazon. EC2
Clase Amazon EC2Client
Clase InstanceType
-
Espacio de nombres Amazon. EC2.Modelo
Clase DescribeInstancesRequest
Clase DescribeInstancesResponse
Clase Instance
Clase InstanceNetworkInterfaceSpecification
Clase RunInstancesRequest
Clase RunInstancesResponse
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); } } }
Consideraciones adicionales
-
Al comprobar el estado de una EC2 instancia, puede añadir un filtro a la
Filter
propiedad del DescribeInstancesRequestobjeto. Con esta técnica, puede limitar la solicitud a unas instancias determinadas, por ejemplo, las instancias con una etiqueta concreta especificada por el usuario.
-
En aras de una mayor brevedad, se han asignado valores típicos a algunas propiedades, pero cualquiera o todas estas propiedades se pueden determinar mediante programación o usando entradas de usuario.
-
Los valores que puede usar para el RunInstancesRequestobjeto
MinCount
yMaxCount
sus propiedades vienen determinados por la zona de disponibilidad de destino y el número máximo de instancias permitido para el tipo de instancia. Para obtener más información, consulta ¿Cuántas instancias puedo ejecutar en Amazon EC2? en Amazon EC2 GeneralFAQ.
-
Si quieres usar un tipo de instancia diferente al de este ejemplo, puedes elegir entre varios tipos de instancias. Para obtener más información, consulta los tipos de EC2 instancias de Amazon en la Guía del EC2 usuario de Amazon. Consulte también los detalles del tipo de instancia
y el explorador de tipos de instancia .
-
También puedes adjuntar un IAMrol a una instancia al lanzarla. Para ello, crea un IamInstanceProfileSpecificationobjeto cuya
Name
propiedad esté configurada con el nombre de un IAM rol. A continuación, añada ese objeto a laIamInstanceProfile
propiedad del RunInstancesRequestobjeto.nota
Para lanzar una EC2 instancia que tenga un IAM rol asociado, la configuración de un IAM usuario debe incluir ciertos permisos. Para obtener más información sobre los permisos necesarios, consulta la sección Cómo conceder un permiso a un usuario para transferir un IAM rol a una instancia en la Guía del EC2 usuario de Amazon.
(opcional) Conexión a la instancia
En cuanto se esté ejecutando una instancia, puede conectarse de forma remota a ella utilizando el cliente remoto adecuado. Tanto para las instancias de Linux como para las de Windows, necesitas la dirección IP pública o el DNS nombre público de la instancia. También necesitará lo siguiente.
Instancias de Linux
Puedes usar un SSH cliente para conectarte a tu instancia de Linux. Asegúrese de que el grupo de seguridad que utilizó al lanzar la instancia permita el SSH tráfico en el puerto 22, tal y como se describe enActualización de grupos de seguridad.
También necesitas la parte privada del key pair que usaste para lanzar la instancia, es decir, el PEM archivo.
Para obtener más información, consulta Conéctate a tu instancia de Linux en la Guía del EC2 usuario de Amazon.
Instancias de Windows
Puedes usar un RDP cliente para conectarte a tu instancia. Asegúrese de que el grupo de seguridad que utilizó al lanzar la instancia permita el RDP tráfico en el puerto 3389, tal y como se describe enActualización de grupos de seguridad.
También necesitará una contraseña de administrador. Puedes obtenerlo mediante el siguiente código de ejemplo, que requiere el ID de la instancia y la parte privada del key pair utilizado para lanzar la instancia, es decir, el PEM archivo.
Para obtener más información, consulta Connect to your Windows instance en la Guía del EC2 usuario de Amazon.
aviso
Este código de ejemplo devuelve la contraseña de administrador de la instancia en texto si formato.
NuGet paquetes:
Elementos de programación:
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); } } }
Limpieza
Cuando ya no necesite la EC2 instancia, asegúrese de cancelarla, tal y como se describe enFinalización de una instancia de Amazon EC2.