Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス許可を付与する
Amazon EC2 インスタンスで実行されるアプリケーションはその AWS API リクエストに AWS 認証情報を含める必要があります。デベロッパーは Amazon EC2 インスタンス内に直接 AWS 認証情報を保存し、そのインスタンス内のアプリケーションに対してそれらの認証情報の使用を許可できます。しかし、デベロッパーは認証情報を管理し、その更新時には各インスタンスに安全に渡して、各 Amazon EC2 インスタンスを更新する必要があります。これは、かなりの追加作業です。
代わりに、IAM ロールを使用すると、Amazon EC2 インスタンスで実行されるアプリケーションに対して一時的な認証情報を管理するだけで済みます。ロールを使用する場合、長期認証情報 (サインイン認証情報、アクセスキーなど) を Amazon EC2 インスタンスに配布する必要はありません。代わりに、ロールは、アプリケーションが他の AWS リソースへの呼び出しを行うときに使用できる一時的なアクセス権限を提供します。Amazon EC2 インスタンスを起動するときに、そのインスタンスに関連付ける IAM ロールを指定します。そのインスタンスで実行されるアプリケーションは、そのロールから提供される一時的な認証情報を使用して API リクエストに署名できます。
ロールを使用して、Amazon EC2 インスタンスで実行されるアプリケーションに許可を付与するには、いくつかの追加設定が必要です。Amazon EC2 インスタンスで実行されるアプリケーションは、仮想化されたオペレーティングシステムによって AWS から抽象化されます。この追加の分離のため、AWS ロールとその関連付けられた許可を Amazon EC2 インスタンスに割り当て、アプリケーションに対してそれらの使用を許可するための追加の手順が必要になります。この別手順は、インスタンスにアタッチされるインスタンスプロファイルの作成です。インスタンスプロファイルは、ロールを含んでおり、インスタンスで実行されるアプリケーションにロールの一時的な認証情報を提供できます。それらの一時的な認証情報は、アプリケーションの API コールで、リソースへのアクセスを許可するために、または、ロールで指定されたリソースのみにアクセスを制限するために使用できます。
注記
同時に Amazon EC2 インスタンスに割り当てることができるのは 1 つのロールだけです。インスタンスのすべてのアプリケーションは、同じロールとアクセス許可を共有します。Amazon ECS を利用して Amazon EC2 インスタンスを管理する場合、Amazon ECS タスクが実行されている Amazon EC2 インスタンスのロールと区別できるロールを Amazon ECS タスクに割り当てることができます。各タスクにロールを割り当てることは、最小権限アクセスの原則に沿っており、アクションとリソースをよりきめ細かく制御できます。
詳細については、Amazon Elastic Container Service ベストプラクティスガイドの「Amazon ECS のタスクによる IAM ロールの使用」を参照してください。
この方法によるロールの使用には、いくつかの利点があります。ロールの認証情報は一時的なもので、自動的に更新されるため、開発者は認証情報を管理する必要がなく、長期のセキュリティリスクを心配する必要もありません。また、複数のインスタンスに 1 つのロールを使用する場合、その 1 つのロールに変更を加えるとその変更がすべてのインスタンスに自動的に反映されます。
注記
ロールは通常、起動時に Amazon EC2 インスタンスに割り当てられますが、現在実行中の Amazon EC2 インスタンスにロールをアタッチすることもできます。実行中のインスタンスにロールをアタッチする方法については、「Amazon EC2 の IAM ロール」を参照してください。
Amazon EC2 インスタンスのロールの仕組み
以下の図では、デベロッパーは Amazon EC2 インスタンスでアプリケーションを実行しており、そのアプリケーションは amzn-s3-demo-bucket-photos
という名前の S3 バケットにアクセスする必要があります。管理者は、Get-pics
サービスロールを作成し、Amazon EC2 インスタンスにロールをアタッチします。ロールには、指定された S3 バケットへの読み取り専用アクセスを付与するアクセス許可ポリシーが含まれています。また、Amazon EC2 インスタンスがロールを引き受けて一時的な認証情報を取得することを許可する信頼ポリシーも含まれています。アプリケーションはインスタンスで実行されると、ロールの一時的な認証情報を使用して写真バケットにアクセスできます。管理者はデベロッパーに写真バケットにアクセスする権限を与える必要はなく、デベロッパーが認証情報を共有または管理する必要はありません。
-
管理者は、
Get-pics
ロールの作成に IAM を使用します。ロールの信頼ポリシーでは、Amazon EC2 インスタンスのみがロールを引き受けることができることを指定します。ロールのアクセス許可ポリシーでは、amzn-s3-demo-bucket-photos
バケットに対する読み取り専用アクセス許可を指定します。 -
デベロッパーは Amazon EC2 インスタンスを起動し、
Get-pics
ロールをそのインスタンスに割り当てます。注記
IAM コンソールを使用する場合、インスタンスプロファイルは自動的に管理され、ほとんど透過的です。ただし、AWS CLI または API を使用してロールと Amazon EC2 インスタンスを作成および管理する場合、インスタンスプロファイルを作成し、別の手順でそのプロファイルにロールを割り当てる必要があります。次に、インスタンスを起動するときに、ロール名ではなくインスタンスのプロファイル名を指定する必要があります。
-
「インスタンスメタデータからのセキュリティ認証情報の取得」で説明されているように、アプリケーションは実行時に Amazon EC2 インスタンスメタデータからセキュリティ認証情報を取得します。これらは、ロールを表す一時的セキュリティ認証情報で、制限された期間の間有効です
一部の AWS SDK
では、デベロッパーは、一時的なセキュリティ認証情報を透過的に管理するプロバイダーを使用できます (認証情報を管理するためにその SDK によってサポートされている機能については、各 AWS SDK のドキュメントを参照してください。) あるいは、アプリケーションは Amazon EC2 インスタンスのインスタンスメタデータから一時的な認証情報を直接取得することもできます。認証情報とその関連する値はメタデータの
iam/security-credentials/
カテゴリ (この場合はrole-name
iam/security-credentials/Get-pics
) から入手できます。アプリケーションがインスタンスメタデータから認証情報を取得する場合、アプリケーションは認証情報をキャッシュすることができます。 -
取得された一時的な認証情報を使用して、アプリケーションは写真バケットにアクセスします。
Get-pics
ロールにアタッチされたポリシーのために、アプリケーションには読み取り専用のアクセス許可があります。インスタンスで使用可能な一時的な認証情報は、失効前に自動的に更新されるため、有効な認証情報のセットを常に使用できます。アプリケーションは、現在の認証情報セットが失効する前に、インスタンスメタデータから新しい認証情報セットを取得するだけで済みます。AWS SDK を使用して認証情報を管理できるため、認証情報を更新するための追加のロジックをアプリケーションに含める必要がありません。たとえば、インスタンスプロファイル認証情報プロバイダーを使用してクライアントをインスタンス化します。ただし、アプリケーションがインスタンスメタデータから一時的な認証情報を取得してキャッシュしている場合、1 時間おき、または少なくとも現在のセットが失効する 15 分前までに、更新された認証情報セットを取得する必要があります。失効時刻は、
iam/security-credentials/
カテゴリに返された情報に含まれます。role-name
Amazon EC2 でのロールの使用に必要なアクセス許可
ロールを割り当てたインスタンスを起動するために、デベロッパーには Amazon EC2 インスタンスを起動する許可と IAM ロールを割り当てる許可が必要です。
以下のポリシーサンプルは、ロールを使用してインスタンスを起動させるために、ユーザーに AWS Management Console を使用することを許可します。ポリシーにアスタリスク (*
) を含めることで、任意のロールの割り当てとリストにある Amazon EC2 アクションの実行をユーザーに許可します。ListInstanceProfiles
アクションでは、AWS アカウント で使用できるすべてのロールの表示をユーザーに許可します。
例 任意のロールが割り当てられたインスタンスを Amazon EC2 コンソールで起動するアクセス許可をユーザーに付与するポリシーの例
{ "Version": "2012-10-17", "Statement": [ { "Sid": "IamPassRole", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "*", "Condition": { "StringEquals": { "iam:PassedToService": "ec2.amazonaws.com" } } }, { "Sid": "ListEc2AndListInstanceProfiles", "Effect": "Allow", "Action": [ "iam:ListInstanceProfiles", "ec2:Describe*", "ec2:Search*", "ec2:Get*" ], "Resource": "*" } ] }
Amazon EC2 インスタンスに割り当て可能なロールを制限する (PassRole を使用)
PassRole
許可を使用すると、インスタンスの起動時にユーザーが Amazon EC2 インスタンスに割り当てることのできるロールを制限できます。これにより、ユーザーに付与されているアクセス許可よりも多くのアクセス許可を持つアプリケーションをユーザーが実行することを回避できます。つまり、ユーザーは、昇格されたアクセス許可を取得することができなくなります。例えば、ユーザー Alice には、Amazon EC2 インスタンスを起動し Amazon S3 バケットを操作する許可のみがあるが、このユーザーが Amazon EC2 インスタンスに割り当てるロールには、IAM と Amazon DynamoDB を操作する許可があるとします。その場合、Alice はインスタンスを起動してログインし、一時的セキュリティ認証情報を取得して、彼女にはアクセス許可がない IAM または DynamoDB アクションを実行できます。
ユーザーが Amazon EC2 インスタンスに割り当てることのできるロールを制限するには、PassRole
アクションを許可するポリシーを作成します。その後、Amazon EC2 インスタンスを起動するユーザー (またはそのユーザーが属する IAM グループ) にそのポリシーをアタッチします。ポリシーの Resource
の要素に、ユーザーが Amazon EC2 インスタンスに渡すことを許可するロールを記載します。ユーザーがインスタンスを起動し、そのインスタンスにロールを割り当てるとき、Amazon EC2 は、ユーザーがそのロールの割り当てを許可されているかどうかを確認します。もちろん、ユーザーが割り当てることのできるロールに想定外のアクセス権限が含まれていないことを確認する必要があります。
注記
PassRole
は、RunInstances
や ListInstanceProfiles
とは異なり、API アクションではありません。それは API にロールの ARN がパラメータとして渡されるときに、必ず AWS が確認を行う許可です (またはユーザーの代わりにコンソールがこれを行います)。これにより管理者は、渡すことができるロールと、そのロールを渡すことができるユーザーを制御するのに役立ちます。この場合では、ユーザーが特定のロールを Amazon EC2 インスタンスにアタッチできるようにします。
例 特定のロールが割り当てられた Amazon EC2 インスタンスを起動する許可をユーザーに付与するポリシーの例
以下のポリシーサンプルは、ロールを使用してインスタンスを起動するために、ユーザーに Amazon EC2 API の使用を許可します。Resource
要素は、ロールの Amazon リソースネーム (ARN) を指定します。ポリシーで ARN を指定することで、Get-pics
ロールのみを割り当てるアクセス許可をユーザーに付与します。インスタンスの起動時にユーザーが異なるロールを指定した場合、アクションは失敗します。ユーザーには、ロールを渡したかどうかにかかわらず、すべてのインスタンスを実行する権限があります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:RunInstances", "Resource": "*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::
account-id
:role/Get-pics" } ] }
インスタンスプロファイルロールが他のアカウントのロールへの切り替えることを許可する
Amazon EC2 インスタンスで実行されているアプリケーションが別のアカウントでコマンドを実行することを許可できます。これを行うには、最初のアカウントの Amazon EC2 インスタンスロールを 2 番目のアカウントのロールに切り替えることを許可する必要があります。
2 つの AWS アカウント を使用していて Amazon EC2 インスタンスで実行されているアプリケーションが両方のアカウントで AWS CLI111111111111
に Amazon EC2 インスタンスが存在すると仮定します。このインスタンスには、同じ abcd
アカウント内の amzn-s3-demo-bucket1
バケットで読み取り専用の 111111111111
タスクをアプリケーションが実行する Amazon S3 インスタンスプロファイルのロールが含まれています。ただし、アプリケーションは、アカウント amzn-s3-demo-bucket2
の efgh
Amazon S3 バケットにアクセスするために 222222222222
クロスアカウントロールを引き受けることも許可されている必要があります。
アプリケーションが amzn-s3-demo-bucket1
Amazon S3 バケットにアクセスできるようにするには、abcd
Amazon EC2 インスタンスプロファイルロールは次のアクセス許可ポリシーを持っている必要があります。
アカウント 111111111111 abcd
ロールのアクセス許可ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetAccountPublicAccessBlock", "s3:ListAccessPoints", "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::
amzn-s3-demo-bucket1
/*", "arn:aws:s3:::amzn-s3-demo-bucket1
" ] }, { "Sid": "AllowIPToAssumeCrossAccountRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::222222222222:role/efgh" } ] }
この abcd
ロールは、ロールを引き受ける上で Amazon EC2 サービスを信頼する必要があります。これを行うには、abcd
ロールは次の信頼ポリシーを持っている必要があります。
アカウント 111111111111 abcd
ロールの信頼ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "abcdTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"Service": "ec2.amazonaws.com"} } ] }
efgh
クロスアカウントのロールが、同じ amzn-s3-demo-bucket2
アカウント内の222222222222
バケットで読み取り専用 Amazon S3 タスクを許可すると仮定します。これを行うには、efgh
クロスアカウントのロールは、以下のアクセス許可ポリシーを持っている必要があります。
アカウント 222222222222 efgh
ロールのアクセス許可ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccountLevelS3Actions", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetAccountPublicAccessBlock", "s3:ListAccessPoints", "s3:ListAllMyBuckets" ], "Resource": "arn:aws:s3:::*" }, { "Sid": "AllowListAndReadS3ActionOnMyBucket", "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": [ "arn:aws:s3:::
amzn-s3-demo-bucket2
/*", "arn:aws:s3:::amzn-s3-demo-bucket2
" ] } ] }
efgh
ロールは abcd
インスタンスプロファイルのロールがそれを引き受けることを信頼する必要があります。これを行うには、efgh
ロールは次の信頼ポリシーを持っている必要があります。
アカウント 222222222222 efgh
ロールの信頼ポリシー
{ "Version": "2012-10-17", "Statement": [ { "Sid": "efghTrustPolicy", "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"} } ] }
使用を開始するには
Amazon EC2 インスタンスでロールがどのように機能するかを理解するには、IAM コンソールでロールを作成し、そのロールが割り当てられた Amazon EC2 インスタンスを起動して、実行中のインスタンスを調べる必要があります。インスタンスのメタデータを調べて、ロールの一時的な認証情報がインスタンスでどのようにして使用可能になったかを確認できます。また、インスタンスで実行されるアプリケーションがそのロールをどのように使用できるかも確認できます。詳細については、以下のリソースを参照してください。
-
IAM Roles on Amazon EC2 Instances Tutorial
(Amazon EC2 インスタンスでの IAM ロールのチュートリアル)。リンクされている動画では、IAM ロールを Amazon EC2 インスタンスに割り当てて、インスタンスでのアプリケーション実行時に行える操作を制御する方法について説明します。この動画は、アプリケーション (AWS SDK で記述) がロールから一時的セキュリティ認証情報を取得する仕組みについて説明しています。 -
SDK ウォークスルー。AWS SDK ドキュメント内のこれらのチュートリアルでは、Amazon EC2 インスタンスで実行されるアプリケーションがロールの一時的な認証情報を使用して Amazon S3 バケットを読み取る手順について説明しています。以下の各ウォークスルーでは、別のプログラミング言語での同様の手順について説明しています。
-
AWS SDK for Java デベロッパーガイドのJava 用 SDK を使用した Amazon EC2 の IAM ロールの設定
-
「AWS SDK for .NET デベロッパーガイド」の「Launch an Amazon EC2 Instance using the SDK for .NET」(SDK for .NET を使用した Amazon EC2 インスタンスの起動)
-
AWS SDK for Ruby デベロッパーガイドのRuby 用の SDK for Ruby を使用した Amazon EC2 インスタンスの作成
-
関連情報
ロールの作成または Amazon EC2 インスタンスのロールに関する詳細については、次の情報を参照してください。
-
Amazon EC2 インスタンスでの IAM ロールの使用の詳細については、「Amazon EC2 ユーザーガイド」を参照してください。
-
ロールの作成については、「IAM ロールの作成」を参照してください。
-
一時的なセキュリティ認証情報の使用方法の詳細については、「IAM の一時的な認証情報」を参照してください。
-
IAM API または CLI で作業する場合、IAM インスタンスプロファイルを作成および管理する必要があります。インスタンスプロファイルの詳細については、「インスタンスプロファイルを使用する」を参照してください。
-
インスタンスメタデータにあるロールの一時的なセキュリティ認証情報に関する詳細については、「Amazon EC2 ユーザーガイド」の「インスタンスメタデータからのセキュリティ認証情報の取得」を参照してください。