使用IAM角色授予访问权限 - Amazon SDK for .NET
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用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 包裹:

编程元素:

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台

  2. 在导航窗格中,选择角色,然后选择创建角色

  3. 选择Amazon 服务,查找并选择 EC2,然后选择下一步:权限

  4. 在 “附加权限策略” 下,找到并选择 AmazonS3 ReadOnlyAccess。如果愿意,请查看该策略,然后选择下一步: 标签

  5. 如果需要,可以添加标签,然后选择下一步: 查看

  6. 键入角色的名称和描述,然后选择创建角色。请记住这个名称,因为启动EC2实例时会用到它。

启动EC2实例并附加IAM角色

使用您之前创建的IAM角色启动EC2实例。您可以通过下列方式来执行此操作。

  • 使用控制EC2台

    要使用EC2控制台启动实例,请参阅 Amazon EC2 用户指南中的使用新的启动实例向导启动实例。

    浏览启动页面时,您至少应展开 “高级详细信息” 窗格,这样您就可以指定之前在IAM实例配置文件中创建的IAM角色。

要启动附加了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实例上运行示例应用程序

  1. 将应用程序从本地驱动器复制到您的实例。

    您传输哪些文件取决于您如何构建应用程序以及您的实例是否具有。 NET已安装核心运行时。有关如何将文件传输到您的实例的信息,请参阅亚马逊EC2用户指南中的 Connect 到您的 Linux 实例(参见相应的小节)或将文件传输到 Windows 实例

  2. 启动应用程序并验证其运行结果是否与开发计算机上的结果相同。

  3. 验证应用程序是否使用该IAM角色提供的证书。

    1. 打开 Amazon EC2 控制台

    2. 选择实例,然后通过操作实例设置附加/ IAM 替换IAM角色分离角色。

    3. 再次运行该应用程序,看看它是否返回了授权错误。

清理

完成本教程后,如果您不再需要自己创建的EC2实例,请务必终止该实例以避免不必要的开支。您可以在 Amazon EC2 控制台中或以编程方式执行此操作,如中所述。终止 Amazon 实例 EC2您还可以删除为本教程创建的其它资源。其中可能包括IAM角色、EC2密钥对和PEM文件、安全组等。