IAM ロールを使用したアクセスの許可 - AWS SDK for .NET

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

IAM ロールを使用したアクセスの許可

このチュートリアルでは、 AWS SDK for .NET を使用して Amazon IAM インスタンスで EC2 ロールを有効にする方法について説明します。

概要

へのすべてのリクエストは、 によって発行された認証情報を使用して暗号化署名 AWS する必要があります AWS。そのため、Amazon EC2 インスタンスで実行されるアプリケーションの認証情報を管理する戦略が必要です。これらの認証情報を、アプリケーションからのアクセスを維持したまま安全に配信、保存、ローテーションする必要があります。

IAM ロールを使用すると、これらの認証情報を効果的に管理できます。IAM ロールを作成し、アプリケーションに必要なアクセス許可を使用して設定し、そのロールを EC2 インスタンスにアタッチします。IAM ロールを使用する利点の詳細については、Amazon IAM ユーザーガイドの「Amazon EC2 の Word ロール」を参照してください。 EC2 また、IAM ユーザーガイドの Word ロールに関する情報も参照してください。 IAM

を使用して構築されたアプリケーションの場合 AWS SDK for .NET、アプリケーションが AWS サービスのクライアントオブジェクトを構築すると、オブジェクトはいくつかの潜在的なソースから認証情報を検索します。検索の順序は、「認証情報とプロファイルの解決」に示されています。

クライアントオブジェクトが他のソースから認証情報を見つけられない場合、Word ロールに設定され、IAM EC2インスタンスのメタデータにあるものと同じアクセス許可を持つ一時的な認証情報を取得します。これらの認証情報は、クライアントオブジェクト AWS から を呼び出すために使用されます。

このチュートリアルの内容

このチュートリアルに従って、 AWS SDK for .NET (およびその他のツール) を使用して EC2 ロールがアタッチされた Amazon IAM インスタンスを起動し、IAM ロールのアクセス許可を使用してインスタンス上のアプリケーションを確認します。

サンプルの Amazon S3 アプリケーションの作成

このサンプルアプリケーションは、Amazon S3 からオブジェクトを取得します。アプリケーションを実行するには、以下が必要です。

  • テキストファイルを含む Amazon S3 バケット。

  • AWS バケットへのアクセスを許可する開発マシンの認証情報。

Amazon S3 バケットの作成およびオブジェクトのアップロードの詳細については、「Amazon Simple Storage Service ユーザーガイド」を参照してください。 AWS 認証情報の詳細については、「」を参照してくださいで SDK 認証を設定する AWS

.NET を作成する 次のコードを持つコアプロジェクト。次に、開発マシンでアプリケーションをテストします。

注記

開発マシンでは、.NET Core Runtime がインストールされているため、アプリケーションを公開せずに実行できます。このチュートリアルの後半で EC2 インスタンスを作成するときは、.NET のインストールを選択できます。 インスタンスの Core Runtime。こうすることで同様のエクスペリエンスを実現でき、ファイル転送量が小さくなります。

ただし、.NET をインストールしないことを選択することもできます。 インスタンスの Core Runtime。この場合は、インスタンスを転送するときにすべての依存関係が含まれるようにアプリケーションを公開する必要があります。

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. ナビゲーションペインで [Roles] (ロール) を選択し、続いて [Create Role] (ロールの作成) を選択します。

  3. AWS サービスを選択し、EC2 を検索して選択し、次へ: アクセス許可を選択します。

  4. 「アクセス許可ポリシーの添付」で、AmazonS3ReadOnlyAccess を検索して選択します。必要に応じてポリシーを確認し、[Next: Tags] (次へ: タグ) を選択します。

  5. 必要に応じてタグを追加し、[Next: Review] (次へ: レビュー) を選択します。

  6. ロールの名前と説明を入力し、[Create role] (ロールの作成) を選択します。EC2 インスタンスを起動するときに必要になるため、この名前を覚えておいてください。

EC2 インスタンスを起動し、IAM ロールをアタッチする

以前に作成した EC2 ロールを使用して IAM インスタンスを起動します。これは以下の方法で実行できます。

EC2 ロールがアタッチされた IAM インスタンスを起動するには、IAM ユーザーの設定に特定のアクセス許可が含まれている必要があります。必要なアクセス許可の詳細については、Amazon IAM ユーザーガイドの「Word ロールをインスタンスに渡すアクセス許可をユーザーに付与する」を参照してください。 EC2

EC2 インスタンスに接続する

サンプルアプリケーションを EC2 インスタンスに接続して転送し、アプリケーションを実行できるようにします。インスタンスの起動に使用したキーペアのプライベート部分を含むファイル、つまり PEM ファイルが必要です。

インスタンスへの接続の詳細については、Amazon EC2 ユーザーガイド「Linux インスタンスに接続する」または「Windows インスタンスに接続する」を参照してください。接続する際は、開発マシンからインスタンスにファイルを転送できるように接続してください。

Windows で Visual Studio を使用している場合は、Toolkit for Visual Studio を使用してインスタンスに接続することもできます。詳細については、 AWS Toolkit for Visual Studio 「 ユーザーガイド」の「Amazon EC2 インスタンスへの接続」を参照してください。

EC2 インスタンスでサンプルアプリケーションを実行する

  1. ローカルドライブからインスタンスにアプリケーションファイルをコピーします。

    どのファイルを転送するかは、アプリケーションの構築方法とインスタンスに .NET があるかどうかによって異なります。 Core Runtime がインストールされています。インスタンスにファイルを転送する方法については、Amazon EC2 ユーザーガイド「Linux インスタンスに接続する」 (該当するサブセクションを参照) または「Windows インスタンスにファイルを転送する」を参照してください。

  2. アプリケーションを起動し、開発マシンと同じ実行結果が得られることを確認します。

  3. アプリケーションが IAM ロールから提供された認証情報を使用していることを確認します。

    1. Amazon EC2 コンソールを開きます。

    2. インスタンスを選択し、アクションインスタンス設定、IAM ロールのアタッチ/置き換えを通じて IAM ロールをデタッチします。

    3. アプリケーションを再度実行して、認可エラーが返されることを確認します。

クリーンアップ

このチュートリアルを終了し、作成した EC2 インスタンスが不要になった場合は、不要なコストが発生しないようにインスタンスを終了してください。これは、「」で説明されているように、Amazon EC2 コンソールまたはプログラムで行うことができますAmazon EC2 インスタンスの終了。必要に応じて、このチュートリアル用に作成した他のリソースも削除できます。これには、IAM ロール、EC2 キーペアと PEM ファイル、セキュリティグループなどが含まれます。