Concesión de acceso mediante un rol de IAM - AWS SDK for .NET

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.

Concesión de acceso mediante un rol de IAM

En este tutorial, se muestra cómo utilizarlos AWS SDK for .NET para habilitar las funciones de IAM en las instancias de Amazon EC2.

Información general

Todas las solicitudes AWS deben estar firmadas criptográficamente con las credenciales emitidas por. AWS Por tanto, se necesita una estrategia para administrar las credenciales de las aplicaciones que se ejecutan en instancias de Amazon EC2. Debe distribuir, almacenar y rotar estas credenciales de forma segura, pero también mantenerlas accesibles en las aplicaciones.

Con los roles de IAM, estas credenciales se pueden administrar de forma eficaz. Debe crear un rol de IAM y configurarlo con los permisos que una aplicación requiere y, a continuación, asociar ese rol a una instancia de EC2. Para obtener más información sobre las ventajas de usar funciones de IAM, consulte Funciones de IAM para Amazon EC2 en la Guía del usuario de Amazon EC2. Consulte también la información sobre roles de IAM de la Guía del usuario de IAM.

En el caso de una aplicación creada con el AWS SDK for .NET, cuando la aplicación crea un objeto de cliente para un AWS servicio, el objeto busca credenciales de varias fuentes posibles. En Resolución de credencial y perfil se muestra el orden de la búsqueda.

Si el objeto de cliente no encuentra credenciales en ningún origen, recupera unas credenciales temporales que tienen los mismos permisos que los asociados al rol de IAM y que están en los metadatos de la instancia de EC2. Estas credenciales se utilizan para realizar llamadas AWS desde el objeto cliente.

Acerca de este tutorial

Al seguir este tutorial, utilizará la AWS SDK for .NET (y otras herramientas) para lanzar una instancia de Amazon EC2 con una función de IAM asociada y, a continuación, verá una aplicación en la instancia que utilice los permisos de la función de IAM.

Creación de una aplicación de Amazon S3 de ejemplo

Esta aplicación de ejemplo recupera un objeto de Amazon S3. Para ejecutar la aplicación de ejemplo, necesita lo siguiente:

  • Un bucket de Amazon S3 que contiene un archivo de texto

  • AWS credenciales de su máquina de desarrollo que le permiten acceder al depósito.

Para obtener información acerca de cómo crear un bucket de Amazon S3 y cómo cargar un archivo, consulte Guía del usuario de Amazon Simple Storage Service. Para obtener información sobre AWS las credenciales, consulteConfiguración de la autenticación de SDK con AWS.

Cree un proyecto .NET Core con el siguiente código. A continuación, pruebe la aplicación en el equipo de desarrollo.

nota

En el equipo de desarrollo está instalado el tiempo de ejecución de .NET Core, que permite ejecutar la aplicación sin publicarla. Al crear una instancia de EC2 más adelante en este tutorial, puede optar por instalar el tiempo de ejecución de .NET Core en esa instancia. Esto le proporciona una experiencia similar, y la transferencia de archivos es más pequeña.

Sin embargo, también puede optar por no instalar el tiempo de ejecución de .NET Core en la instancia. Si se decanta por esta opción, debe publicar la aplicación de forma que se incluya todas las dependencias al transferirla a la instancia.

NuGet paquetes:

Elementos de programación:

using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Amazon.S3; using Amazon.S3.Model; namespace S3GetTextItem { // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class to retrieve a text file from an S3 bucket and write it to a local file 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 bucket = CommandLine.GetArgument(parsedArgs, null, "-b", "--bucket-name"); string item = CommandLine.GetArgument(parsedArgs, null, "-t", "--text-object"); string outFile = CommandLine.GetArgument(parsedArgs, null, "-o", "--output-filename"); if( string.IsNullOrEmpty(bucket) || string.IsNullOrEmpty(item) || string.IsNullOrEmpty(outFile)) CommandLine.ErrorExit( "\nOne or more of the required arguments is missing or incorrect." + "\nRun the command with no arguments to see help."); // Create the S3 client object and get the file object from the bucket. var response = await GetObject(new AmazonS3Client(), bucket, item); // Write the contents of the file object to the given output file. var reader = new StreamReader(response.ResponseStream); string contents = reader.ReadToEnd(); using (var s = new FileStream(outFile, FileMode.Create)) using (var writer = new StreamWriter(s)) writer.WriteLine(contents); } // // Method to get an object from an S3 bucket. private static async Task<GetObjectResponse> GetObject( IAmazonS3 s3Client, string bucket, string item) { Console.WriteLine($"Retrieving {item} from bucket {bucket}."); return await s3Client.GetObjectAsync(bucket, item); } // // Command-line help private static void PrintHelp() { Console.WriteLine( "\nUsage: S3GetTextItem -b <bucket-name> -t <text-object> -o <output-filename>" + "\n -b, --bucket-name: The name of the S3 bucket." + "\n -t, --text-object: The name of the text object in the bucket." + "\n -o, --output-filename: The name of the file to write the text to."); } } // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // 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); } } }

Si lo desea, puede eliminar temporalmente las credenciales que use en el equipo de desarrollo para ver cómo responde la aplicación (no se olvide de restaurarlas cuando acabe).

Creación de un rol de IAM

Cree un rol de IAM que tenga los permisos adecuados para obtener acceso a Amazon S3.

  1. Abra la consola de IAM.

  2. En el panel de navegación, seleccione Roles y luego seleccione Crear rol.

  3. Seleccione Servicio de AWS , busque y seleccione EC2 y seleccione Siguiente: Permisos.

  4. En Adjuntar políticas de permisos, busca y selecciona AmazonS3 ReadOnlyAccess. Revise la política si lo desea y, a continuación, seleccione Siguiente: Etiquetas.

  5. Agregue etiquetas si lo desea y, a continuación, seleccione Siguiente: Revisar.

  6. Escriba un nombre y una descripción para el rol y, a continuación, elija Crear rol. Recuerde este nombre, ya que lo necesitará cuando lance su instancia EC2.

Lanzamiento de una instancia de EC2 y asociación del rol de IAM

Lance una instancia de EC2 con el rol de IAM que creó anteriormente. Puede hacerlo de las siguientes maneras:

Para lanzar una instancia de EC2 que tenga un rol de IAM asociado, la configuración de un usuario de IAM debe incluir determinados permisos. Para obtener más información sobre los permisos necesarios, consulte Conceder un permiso de usuario para transferir una función de IAM a una instancia en la Guía del usuario de Amazon EC2.

Conexión a la instancia EC2

Conéctese a la instancia EC2 para poder transferirle la aplicación de muestra y luego ejecutarla. Necesitarás el archivo que contiene la parte privada del par de claves que usaste para lanzar la instancia, es decir, el archivo PEM.

Para obtener información sobre cómo conectarse a una instancia, consulte Conectarse a su instancia de Linux o Conectarse a su instancia de Windows en la Guía del usuario de Amazon EC2. Cuando se conecte, hágalo de forma que pueda transferir archivos desde el equipo de desarrollo a la instancia.

Si usa Visual Studio en Windows, también se puede conectar a la instancia mediante el Kit de herramientas para Visual Studio. Para obtener más información, consulte Conexión a una instancia de Amazon EC2 en la Guía del AWS Toolkit for Visual Studio usuario.

Ejecutar la aplicación de muestra en la instancia EC2

  1. Copie los archivos de la aplicación de la unidad local en la instancia.

    Los archivos que transfiera dependen de cómo se haya creado la aplicación y de si la instancia tiene instalado el tiempo de ejecución de .NET Core. Para obtener información sobre cómo transferir archivos a su instancia, consulte Conectarse a su instancia de Linux (consulte la subsección correspondiente) o Transferir archivos a instancias de Windows en la Guía del usuario de Amazon EC2.

  2. Inicie la aplicación y compruebe que se ejecuta con los mismos resultados que en el equipo de desarrollo.

  3. Confirme que la aplicación usa las credenciales proporcionadas por el rol de IAM.

    1. Abra la consola de Amazon EC2.

    2. Seleccione la instancia y desasocie el rol de IAM mediante Acciones, Configuración de la instancia. Asociar o reemplazar rol de IAM.

    3. Vuelva a ejecutar la aplicación y vea que devuelve un error de autorización.

Limpieza

Cuando acabe este tutorial, si ya no quiere conservar la instancia de EC2 que ha creado, asegúrese de terminarla para no incurrir en costos no deseados. Puede hacerlo en la consola de Amazon EC2 o mediante programación, tal y como se describe en Terminación de una instancia de Amazon EC2. Si lo desea, también puede eliminar otros recursos que haya creado durante este tutorial. Estos pueden englobar un rol de IAM, un par de claves de EC2 y un archivo PEM, un grupo de seguridad, etc.