IAM 역할을 사용하여 액세스 권한 부여 - AWS SDK for .NET

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

IAM 역할을 사용하여 액세스 권한 부여

이 자습서에서는 를 사용하여 Amazon EC2 인스턴스에서 IAM 역할을 AWS SDK for .NET 활성화하는 방법을 보여줍니다.

개요

에 대한 모든 요청은 에서 발급한 자격 증명을 사용하여 암호로 AWS 서명해야 합니다. AWS따라서 Amazon EC2 인스턴스에서 실행되는 애플리케이션에 대한 자격 증명을 관리할 전략이 필요합니다. 이 자격 증명을 안전하게 배포, 저장, 교체해야 할 뿐 아니라 애플리케이션에 접근할 수 있는 상태로 유지해야 합니다.

IAM 역할을 사용하면 이러한 자격 증명을 효과적으로 관리할 수 있습니다. IAM 역할을 생성하고 애플리케이션에 필요한 권한으로 구성한 다음 해당 역할을 EC2 인스턴스에 연결합니다. Linux 인스턴스용 Amazon EC2 사용 설명서 또는 Windows 인스턴스용 Amazon EC2 사용 설명서에서 IAM 역할을 사용할 때의 이점에 대해 자세히 알아보세요. 또한 IAM 사용 설명서의 IAM 역할에 대한 정보도 참조하세요.

를 사용하여 구축된 응용 프로그램의 경우 응용 프로그램이 AWS 서비스의 클라이언트 개체를 생성할 때 개체는 여러 잠재적 소스에서 자격 증명을 검색합니다. AWS SDK for .NET검색 순서는 보안 인증 정보 및 프로파일 확인에 나와 있습니다.

클라이언트 객체가 다른 소스에서 보안 인증을 찾을 수 없는 경우, IAM 역할에 구성된 것과 동일한 권한이 있고 EC2 인스턴스의 메타데이터에 있는 임시 보안 인증을 검색합니다. 이러한 자격 증명은 클라이언트 AWS 객체에서 를 호출하는 데 사용됩니다.

이 자습서 소개

이 자습서를 따라하면서 AWS SDK for .NET (및 기타 도구) 를 사용하여 IAM 역할이 연결된 Amazon EC2 인스턴스를 시작한 다음 IAM 역할의 권한을 사용하는 인스턴스의 애플리케이션을 확인합니다.

샘플 Amazon S3 애플리케이션 생성

이 샘플 애플리케이션은 Amazon S3에서 객체를 검색합니다. 애플리케이션을 실행하려면 다음이 필요합니다.

  • 텍스트 파일이 포함된 Amazon S3 버킷입니다.

  • AWS 개발 시스템의 자격 증명으로 버킷에 액세스할 수 있습니다.

Amazon S3 버킷 생성 및 객체 업로드 방법에 대한 자세한 내용은 Amazon Simple Storage Service 사용 설명서를 참조하세요. AWS 자격 증명에 대한 자세한 내용은 을 참조하십시오AWS를 사용하여 SDK 인증 구성.

다음 코드를 사용하여 .NET Core 프로젝트를 생성합니다. 그런 다음 개발 머신에서 애플리케이션을 테스트합니다.

참고

개발 머신에 .NET Core 런타임이 설치되어 있으므로 애플리케이션을 게시하지 않고도 애플리케이션을 실행할 수 있습니다. 이 자습서의 후반부에서 EC2 인스턴스를 생성할 때 인스턴스에 .NET Core 런타임을 설치하도록 선택할 수 있습니다. 이렇게 하면 비슷한 환경에서 더 작은 파일을 전송할 수 있습니다.

하지만 인스턴스에 .NET Core 런타임을 설치하지 않도록 선택할 수도 있습니다. 이 작업 과정을 선택하는 경우 애플리케이션을 인스턴스로 전송할 때 모든 종속성이 포함되도록 애플리케이션을 게시해야 합니다.

NuGet 패키지:

프로그래밍 요소:

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

원하는 경우 개발 머신에서 사용하는 보안 인증을 일시적으로 제거하여 애플리케이션이 어떻게 반응하는지 확인할 수 있습니다. (하지만 작업을 마치면 보안 인증을 복원해야 합니다.)

IAM 역할 생성

Amazon S3에 액세스할 수 있는 적절한 권한이 있는 IAM 역할을 생성합니다.

  1. IAM 콘솔(IAM console)을 엽니다.

  2. 탐색 창에서 역할을 선택한 후 역할 생성을 선택합니다.

  3. AWS 서비스를 선택하고, EC2를 찾아 선택하고, 다음: 권한을 선택합니다.

  4. 연결 권한 정책에서 Amazon ReadOnlyAccess S3를 찾아 선택합니다. 원하는 경우 정책을 검토한 후 다음: 태그를 선택합니다.

  5. 원하는 경우 태그를 추가한 후 다음: 검토를 선택합니다.

  6. 역할 이름 및 설명을 입력한 후 역할 생성을 선택합니다. EC2 인스턴스를 시작할 때 필요하므로 이 이름을 기억해 두십시오.

EC2 인스턴스 시작 및 IAM 역할 연결

앞에서 생성한 IAM 역할로 EC2 인스턴스를 시작합니다. 다음과 같은 방법으로 수행할 수 있습니다.

IAM 역할이 연결된 EC2 인스턴스를 시작하려면 IAM 사용자의 구성에 특정 권한이 포함되어야 합니다. 필수 권한에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서 또는 Windows 인스턴스용 Amazon EC2 사용 설명서를 참조하세요.

EC2 인스턴스에 연결

EC2 인스턴스에 연결하여 샘플 애플리케이션을 전송한 다음 실행할 수 있습니다. 인스턴스를 시작하는 데 사용한 키 쌍의 비공개 부분이 들어 있는 파일, 즉 PEM 파일이 필요합니다.

이렇게 하려면 Linux 인스턴스용 Amazon EC2 사용 설명서의 Linux 인스턴스 또는 Windows 인스턴스용 Amazon EC2 사용 설명서에서 연결 절차를 따르십시오. 연결할 때는 개발 머신에서 인스턴스로 파일을 전송할 수 있는 방식으로 연결합니다.

Windows에서 Visual Studio를 사용하는 경우, Visual Studio용 도구 키트를 사용하여 인스턴스에 연결할 수도 있습니다. 자세한 내용은 AWS Toolkit for Visual Studio 사용 설명서의 Amazon EC2 인스턴스에 연결을 참조하십시오.

EC2 인스턴스에서 샘플 애플리케이션 실행

  1. 애플리케이션 파일을 로컬 드라이브에서 인스턴스로 복사합니다.

    전송하는 파일은 애플리케이션을 빌드한 방법과 인스턴스에 .NET Core 런타임이 설치되어 있는지 여부에 따라 달라집니다. 인스턴스로 파일 전송하는 방법에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서 또는 Windows 인스턴스용 Amazon EC2 사용 설명서를 참조하세요.

  2. 애플리케이션을 시작하고 개발 머신에서와 동일한 결과로 실행되는지 확인합니다.

  3. 애플리케이션이 IAM 역할에서 제공하는 보안 인증을 사용하는지 확인합니다.

    1. Amazon EC2 콘솔을 엽니다.

    2. 인스턴스를 선택하고 작업, 인스턴스 설정, IAM 역할 연결/바꾸기를 통해 IAM 역할을 분리합니다.

    3. 애플리케이션을 다시 실행하여 권한 부여 오류가 반환되는지 확인합니다.

정리

이 자습서를 마치고 생성한 EC2 인스턴스를 더 이상 사용하지 않으려면 인스턴스를 종료하여 원치 않는 비용이 발생하지 않도록 하십시오. Amazon EC2 콘솔에서 또는 Amazon EC2 인스턴스 종료에 설명된 대로 프로그래밍 방식으로 이 작업을 수행할 수 있습니다. 필요에 따라 이 자습서를 위해 생성한 다른 리소스도 삭제할 수 있습니다. 여기에는 IAM 역할, EC2 키 페어 및 PEM 파일, 보안 그룹 등이 포함될 수 있습니다.