本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用IAM角色授予访问权限
本教程向您展示如何使用在 Amazon SDK for .NET Amazon EC2 实例上启用IAM角色。
概述
对的所有请求都 Amazon 必须使用颁发的凭证进行加密签名。 Amazon因此,您需要一种策略来管理在 Amazon EC2 实例上运行的应用程序的证书。您必须以安全的方式分发、存储和轮换这些凭证,并且能让应用程序访问这些凭证。
使用IAM角色,您可以有效地管理这些证书。您可以创建IAM角色并使用应用程序所需的权限对其进行配置,然后将该角色附加到EC2实例。要详细了解使用IAM角色的好处,请参阅《亚马逊EC2用户指南》EC2中的 Amazon IAM 角色。另请参阅《IAM用户指南》中有关IAM角色的信息。
对于使用构建的应用程序 Amazon SDK for .NET,当应用程序为 Amazon 服务构造客户端对象时,该对象会搜索来自多个潜在来源的证书。它搜索的顺序显示在凭证和配置文件解析中。
如果客户端对象找不到来自任何其他来源的证书,则它会检索临时证书,这些证书的权限与IAM角色中配置的证书相同,并且位于EC2实例的元数据中。这些凭据用于 Amazon 从客户端对象对进行调用。
关于本教程
在学习本教程时,您可以使用 Amazon SDK for .NET (和其他工具)启动附加IAM角色的 Amazon EC2 实例,然后使用该IAM角色的权限查看该实例上的应用程序。
创建示例 Amazon S3 应用程序
此示例应用程序从 Amazon S3 中检索对象。要运行示例应用程序,您需要:
-
包含文本文件的 Amazon S3 桶。
-
Amazon 您的开发计算机上允许您访问存储桶的凭据。
有关创建 Amazon S3 存储桶并上载对象的信息,请参阅 Amazon Simple Storage Service 用户指南。有关 Amazon 证书的信息,请参阅使用配置SDK身份验证 Amazon。
创建一个. NET包含以下代码的核心项目。然后在开发计算机上测试该应用程序。
注意
在您的开发计算机上,. NET安装了 Core Runtime,这样您就可以在不发布应用程序的情况下运行应用程序。在本教程的后面部分创建EC2实例时,可以选择安装。 NET实例上的核心运行时。这为您提供了类似的体验和较小的文件传输。
但是,您也可以选择不安装。 NET实例上的核心运行时。如果您选择此操作方案,则必须发布应用程序,以便在将其转移到实例时包含所有依赖关系。
NuGet 包裹:
编程元素:
-
命名空间 Amazon.S3
-
命名空间 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台
。 -
在导航窗格中,选择角色,然后选择创建角色。
-
选择Amazon 服务,查找并选择 EC2,然后选择下一步:权限。
-
在 “附加权限策略” 下,找到并选择 AmazonS3 ReadOnlyAccess。如果愿意,请查看该策略,然后选择下一步: 标签。
-
如果需要,可以添加标签,然后选择下一步: 查看。
-
键入角色的名称和描述,然后选择创建角色。请记住这个名称,因为启动EC2实例时会用到它。
启动EC2实例并附加IAM角色
使用您之前创建的IAM角色启动EC2实例。您可以通过下列方式来执行此操作。
-
使用控制EC2台
要使用EC2控制台启动实例,请参阅 Amazon EC2 用户指南中的使用新的启动实例向导启动实例。
浏览启动页面时,您至少应展开 “高级详细信息” 窗格,这样您就可以指定之前在IAM实例配置文件中创建的IAM角色。
-
使用 Amazon SDK for .NET
有关此操作的信息,请参阅启动亚马逊EC2实例,包括该主题接近末尾处的额外注意事项。
要启动附加了IAM角色的EC2实例,IAM用户的配置必须包含某些权限。有关所需权限的更多信息,请参阅 Amazon 用户指南中的授予EC2用户将IAM角色传递给实例的权限。
Connect 连接到EC2实例
连接到EC2实例,以便您可以将示例应用程序传输到该实例,然后运行该应用程序。您需要包含用于启动实例的 key pair 的私有部分的文件;也就是PEM文件。
有关连接到实例的信息,请参阅亚马逊EC2用户指南中的连接到您的 Linux 实例或连接到您的 Windows 实例。当您连接时,请确保您可以将文件从开发计算机传输到您的实例。
如果您在 Windows 上使用 Visual Studio,也可以使用 Toolkit for Visual Studio 连接到实例。有关更多信息,请参阅 Amazon Toolkit for Visual Studio 用户指南中的连接到 Amazon EC2 实例。
在EC2实例上运行示例应用程序
-
将应用程序从本地驱动器复制到您的实例。
您传输哪些文件取决于您如何构建应用程序以及您的实例是否具有。 NET已安装核心运行时。有关如何将文件传输到您的实例的信息,请参阅亚马逊EC2用户指南中的 Connect 到您的 Linux 实例(参见相应的小节)或将文件传输到 Windows 实例。
-
启动应用程序并验证其运行结果是否与开发计算机上的结果相同。
-
验证应用程序是否使用该IAM角色提供的证书。
-
打开 Amazon EC2 控制台
。 -
选择实例,然后通过操作、实例设置、附加/ IAM 替换IAM角色分离角色。
-
再次运行该应用程序,看看它是否返回了授权错误。
-
清理
完成本教程后,如果您不再需要自己创建的EC2实例,请务必终止该实例以避免不必要的开支。您可以在 Amazon EC2 控制台