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

是否要将 .NET 应用程序部署到Amazon通过几个简单点击即可? 尝试我们的新.NET CLI 工具为了简化部署体验!阅读我们的博客帖子然后提交反馈GitHub

有关更多信息,请参阅部署工具

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

通过 IAM 角色授予访问权限

本教程介绍如何使用Amazon SDK for .NET在 Amazon EC2 实例上启用 IAM 角色。

Overview

所有请求Amazon必须通过使用由下列公司颁发的凭证进行加密Amazon. 因此,您需要通过某种策略为 Amazon EC2 实例上运行的应用程序管理凭证。您必须以安全的方式分发、存储和轮换这些凭证,并且能让应用程序访问这些凭证。

使用 IAM 角色,您可以有效地管理这些证书。您可以创建 IAM 角色并使用应用程序所需的权限对其进行配置,然后将该角色附加到 EC2 实例。在中阅读更多有关使用 IAM 角色的好处。适用于 Linux 的 EC2 用户指南或者适用于 Windows 的 EC2 用户指南. 另请参阅有关的信息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 S3 入门指南. 有关的信息Amazon凭据,请参阅配置Amazon凭证.

使用以下代码创建 .NET Core 项目。然后在您的开发计算机上测试应用程序。

注意

在开发计算机上,安装了 .NET Core Runtime,这使您可以在不发布应用程序的情况下运行应用程序。在本教程稍后部分创建 EC2 实例时,您可以选择在该实例上安装 .NET Core Runtime。这为您提供了类似的体验和较小的文件传输。

但是,您也可以选择不在实例上安装 .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. SelectAmazon服务,查找和选择EC2,然后选择后续:Permissions (下一步:权限)

  4. UNDER附加权限策略,查找并选择AmazonS3ReadOnlyAccess. 如果需要查看策略,然后选择后续:标签

  5. 如果你愿意的话添加标签然后选择后续:审核

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

启动 EC2 实例并附加 IAM 角色

启动 EC2 实例,该实例具有您以前创建的 IAM 角色。您可以通过以下方法执行此操作。

要启动附加了 IAM 角色的 EC2 实例,IAM 用户的配置必须包含特定权限。有关所需权限的更多信息,请参阅适用于 Linux 的 EC2 用户指南或者适用于 Windows 的 EC2 用户指南.

Connect 到 EC2 实例

Connect 到 EC2 实例,以便您可以将示例应用程序传输到该实例,然后运行该应用程序。您需要的文件包含用于启动实例的 key pair 的私有部分,即 PEM 文件。

您可以通过按照中的连接过程来完成此操作适用于 Linux 的 EC2 用户指南或者适用于 Windows 的 EC2 用户指南. 当你连接时,这样做的方式是可以将文件从开发计算机传输到实例。

如果您在 Windows 上使用 Visual Studio,还可以使用适用于 Toolkit for Visual Studio 连接到实例。有关更多信息,请参阅 。连接到 Amazon EC2 实例中的Amazon Toolkit for Visual Studio用户指南。

在 EC2 实例上运行示例应用程序

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

    您传输哪些文件取决于您构建应用程序的方式以及实例是否安装了 .NET Core Runtime。有关如何将文件传输到实例的信息,请参阅适用于 Linux 的 EC2 用户指南或者适用于 Windows 的 EC2 用户指南.

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

  3. 验证应用程序使用 IAM 角色提供的凭证。

    1. 打开 Amazon EC2 控制台

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

    3. 再次运行应用程序并查看它返回授权错误。

清除

当您完成本教程后,如果您不再需要创建的 EC2 实例,请务必终止该实例以避免不必要的成本。您可以在Amazon EC2 控制台或者以编程方式进行,如中所述终止 Amazon EC2 实例. 如果您愿意,您还可以删除为本教程创建的其他资源。这些可能包括 IAM 角色、EC2 密钥对和 PEM 文件、安全组等。