기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
IAM 역할을 사용하여 액세스 권한 부여
이 자습서에서는를 사용하여 Amazon IAM 인스턴스에서 EC2 역할을 활성화 AWS SDK for .NET 하는 방법을 보여줍니다.
개요
에 대한 모든 요청은에서 발급한 자격 증명을 사용하여 암호화 방식으로 서명해야 AWS 합니다 AWS. 따라서 Amazon EC2 인스턴스에서 실행되는 애플리케이션의 보안 인증을 관리하는 전략이 필요합니다. 이 자격 증명을 안전하게 배포, 저장, 교체해야 할 뿐 아니라 애플리케이션에 접근할 수 있는 상태로 유지해야 합니다.
IAM 역할을 사용하면 이러한 보안 인증을 효과적으로 관리할 수 있습니다. IAM 역할을 생성하고 애플리케이션에 필요한 권한으로 구성한 다음 해당 역할을 EC2 인스턴스에 연결합니다. IAM 역할 사용의 이점에 대한 자세한 내용은 Amazon IAM 사용 설명서의 Amazon EC2용 Word 역할을 참조하세요. EC2 IAM 사용 설명서의 Word 역할에 대한 정보도 참조하세요. 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 보안 인증에 대한 자세한 내용은 섹션을 참조하세요를 사용하여 SDK 인증 구성 AWS.
.NET 생성 다음 코드가 있는 코어 프로젝트입니다. 그런 다음 개발 머신에서 애플리케이션을 테스트합니다.
참고
개발 시스템에서 .NET Core Runtime이 설치되어 애플리케이션을 게시하지 않고 실행할 수 있습니다. 이 자습서의 뒷부분에서 EC2 인스턴스를 생성할 때 .NET를 설치하도록 선택할 수 있습니다. 인스턴스의 코어 런타임입니다. 이렇게 하면 비슷한 환경에서 더 작은 파일을 전송할 수 있습니다.
그러나 .NET를 설치하지 않도록 선택할 수도 있습니다. 인스턴스의 코어 런타임입니다. 이 작업 과정을 선택하는 경우 애플리케이션을 인스턴스로 전송할 때 모든 종속성이 포함되도록 애플리케이션을 게시해야 합니다.
NuGet 패키지:
프로그래밍 요소:
-
네임스페이스 Amazon.S3
클래스 AmazonS3Client
-
네임스페이스 Amazon.S3.Model
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 역할을 생성합니다.
-
IAM 콘솔
을 엽니다. -
탐색 창에서 역할을 선택한 후 역할 생성을 선택합니다.
-
AWS 서비스를 선택하고 Word를 찾아 선택한 다음 다음: 권한을 EC2선택합니다.
-
권한 정책 연결에서 AmazonS3ReadOnlyAccess를 찾아 선택합니다. 원하는 경우 정책을 검토한 후 다음: 태그를 선택합니다.
-
원하는 경우 태그를 추가한 후 다음: 검토를 선택합니다.
-
역할 이름 및 설명을 입력한 후 역할 생성을 선택합니다. EC2 인스턴스를 시작할 때 필요하므로이 이름을 기억하세요.
EC2 인스턴스를 시작하고 IAM 역할을 연결합니다.
이전에 생성한 EC2 역할로 IAM 인스턴스를 시작합니다. 다음과 같은 방법으로 수행할 수 있습니다.
-
EC2 콘솔 사용
EC2 콘솔을 사용하여 인스턴스를 시작하려면 Amazon EC2 사용 설명서의 새 인스턴스 시작 마법사를 사용하여 인스턴스 시작을 참조하세요.
시작 페이지를 살펴보면서 Word IAM 인스턴스 프로필에서 이전에 생성한 IAM 역할을 지정할 수 있도록 최소한 고급 세부 정보 창을 확장해야 합니다.
-
사용 AWS SDK for .NET
이에 대한 자세한 내용은 해당 주제의 끝 부분에 있는 추가 고려 사항을 포함하여 Amazon EC2 인스턴스 시작을 참조하세요.
EC2 역할이 연결된 IAM 인스턴스를 시작하려면 IAM 사용자의 구성에 특정 권한이 포함되어야 합니다. 필요한 권한에 대한 자세한 내용은 Amazon IAM 사용 설명서의 인스턴스에 Word 역할을 전달할 수 있는 사용자 권한 부여를 참조하세요. EC2
EC2 인스턴스에 연결
샘플 애플리케이션을 Word 인스턴스로 전송한 다음 애플리케이션을 실행할 수 있도록 EC2 인스턴스에 연결합니다. 인스턴스를 시작하는 데 사용한 키 페어의 프라이빗 부분, 즉 PEM 파일이 포함된 파일이 필요합니다.
인스턴스 연결에 대한 자세한 내용은 Amazon EC2 사용 설명서의 Linux 인스턴스에 연결 또는 Windows 인스턴스에 연결을 참조하세요. 연결할 때는 개발 머신에서 인스턴스로 파일을 전송할 수 있는 방식으로 연결합니다.
Windows에서 Visual Studio를 사용하는 경우, Visual Studio용 도구 키트를 사용하여 인스턴스에 연결할 수도 있습니다. 자세한 내용은 AWS Toolkit for Visual Studio 사용 설명서의 Amazon EC2 인스턴스에 연결을 참조하세요.
EC2 인스턴스에서 샘플 애플리케이션 실행
-
애플리케이션 파일을 로컬 드라이브에서 인스턴스로 복사합니다.
전송하는 파일은 애플리케이션을 빌드한 방식과 인스턴스에 .NET가 있는지 여부에 따라 달라집니다. 코어 런타임이 설치되었습니다. 인스턴스로 파일을 전송하는 방법에 대한 자세한 내용은 Amazon EC2 사용 설명서의 Linux 인스턴스에 연결(해당 하위 섹션 참조) 또는 Windows 인스턴스로 파일 전송을 참조하세요.
-
애플리케이션을 시작하고 개발 머신에서와 동일한 결과로 실행되는지 확인합니다.
-
애플리케이션이 IAM 역할에서 제공하는 보안 인증을 사용하는지 확인합니다.
-
Amazon EC2 콘솔
을 엽니다. -
인스턴스를 선택하고 작업, 인스턴스 설정, IAM 역할 연결/교체를 통해 IAM 역할을 분리합니다.
-
애플리케이션을 다시 실행하여 권한 부여 오류가 반환되는지 확인합니다.
-
정리
이 자습서를 마치고 생성한 EC2 인스턴스를 더 이상 원하지 않는 경우 원치 않는 비용을 방지하기 위해 인스턴스를 종료해야 합니다. 에 설명된 대로 Amazon EC2 콘솔