使用 AWS IAM 角色 - 适用于 .NET 的 AWS 开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

使用 AWS IAM 角色

本教程将向您展示如何使用 适用于 .NET 的 AWS 开发工具包 实现 IAM 角色 Amazon EC2 实例。

Overview

所有请求 AWS 必须使用颁发的凭证进行密码签名 AWS. 因此,您需要策略来管理运行于的应用程序的凭据 Amazon EC2 实例。您必须安全地分发、存储和旋转这些凭据,同时保持它们可供应用程序访问。

有 IAM 角色,您可以有效地管理这些凭证。您创建了一个 IAM 使用应用程序所需的权限对其进行配置,然后将该角色附加到EC2实例。阅读更多关于使用的好处 IAM 角色 适用于 Linux 的 EC2 用户指南适用于 Windows 的 EC2 用户指南. 另请参见有关 IAM 角色 在 IAM 用户指南.

对于使用 适用于 .NET 的 AWS 开发工具包,当应用程序为 AWS 服务,对象搜索来自多个潜在来源的凭证。它的搜索顺序显示在 凭证和配置文件解析.

如果客户端对象从任何其他来源找不到凭证,它将检索与已在中配置的权限相同的临时凭证。 IAM 角色和位于EC2实例的元数据中。这些凭证用于拨打呼叫 AWS 从客户端对象。

关于本教程

遵循本教程时,您将使用 适用于 .NET 的 AWS 开发工具包 (和其他工具) Amazon EC2 附加了IAM角色的实例,然后使用IAM角色的权限查看实例上的应用程序。

创建样本 Amazon S3 申请

此示例应用程序从以下位置检索对象: Amazon S3. 要运行应用程序,您需要:

  • 一种 Amazon S3 包含文本文件的存储桶。

  • AWS 凭证,允许您访问bucket。

有关创建 Amazon S3 bucket并上传对象,请参阅 AmazonS3入门指南. 有关 AWS 凭证,请参阅 配置 AWS 凭证.

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

注意

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

但是,您也可以选择不在实例上安装.NETCoreRuntime。如果选择此操作方式,则必须发布应用程序,以便在将其传输到实例时包含所有依赖项。

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 parameters from the parsed arguments string bucket = CommandLine.GetParameter(parsedArgs, null, "-b", "--bucket-name"); string item = CommandLine.GetParameter(parsedArgs, null, "-t", "--text-object"); string outFile = CommandLine.GetParameter(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: "--param value" or "-p value". // If "param" is found without a matching "value", Dictionary.Value is an empty string. // If "value" is found without a matching "param", Dictionary.Key is "--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 = string.Empty; // Is there 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 a parameter from the parsed command-line arguments public static string GetParameter( Dictionary<string,string> parsedArgs, string def, params string[] keys) { string retval = null; foreach(var key in keys) if(parsedArgs.TryGetValue(key, out retval)) break; return retval ?? def; } // // Exit 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. 选择 AWS服务,查找并选择 二十二,并选择 下一步: 权限。

  4. 低于 附加权限策略,查找并选择 AmazonS3ReadOnlyAccess。回顾政策(如您想要),然后选择 下一步: 标签.

  5. 如果需要,添加标记,然后选择 下一步: 回顾.

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

启动EC2实例并附加 IAM 角色

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

  • 使用 适用于 .NET 的 AWS 开发工具包

    有关此方面的信息,请参阅 启动 Amazon EC2 实例,包括 其他注意事项 接近该主题的末尾。

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

连接到EC2实例

连接到EC2实例,以便将示例应用程序传输到它,然后运行应用程序。您需要包含用于启动实例的密钥对私有部分的文件,即PEM文件。

您可以按照 适用于 Linux 的 EC2 用户指南适用于 Windows 的 EC2 用户指南. 连接时,可以这样将文件从开发计算机传输到实例。

如果您正在Windows上使用VisualStudio,您还可以使用 Toolkit for Visual Studio. 有关更多信息,请参阅 连接到AmazonEC2实例 在 AWS Toolkit for Visual Studio 用户指南.

在EC2实例上运行样本应用程序

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

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

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

  3. 验证应用程序是否使用 IAM 角色。

    1. 打开 Amazon EC2 控制台。

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

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

清除

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