Amazon EC2 の IAM ロール
アプリケーションは AWS 認証情報を使用して API リクエストに署名する必要があります。したがって、アプリケーションデベロッパーである場合、EC2 インスタンスで実行するアプリケーションの認証情報を管理する戦略が必要です。例えば、AWS 認証情報をインスタンスに安全に配布することで、他のユーザーから認証情報を保護しながら、それらのインスタンスのアプリケーションで認証情報を使用してリクエストに署名できます。ただし、各インスタンスに認証情報を安全に配布することは難しく、特に AWS がユーザーの代わりに作成するスポットインスタンスや Auto Scaling グループのインスタンスなどではそれが顕著です。また、AWS 認証情報を循環させる場合、各インスタンスの認証情報を更新できる必要もあります。
Amazon EC2 ワークロードでは、次に説明する方法を使用してセッション認証情報を取得することをお勧めします。これらの認証情報により、インスタンスに既に関連付けられている同じロールを引き受けるために sts:AssumeRole
を使用する必要なしに、ワークロードが AWS API リクエストを実行できるようにすることができます。属性ベースのアクセスコントロール (ABAC) のためにセッションタグを渡す必要がある場合や、ロールの許可をさらに制限するためにセッションポリシーを渡す必要がある場合でない限り、このようなロール引き受け呼び出しは不要です。これは、同じ一時的なロールセッション認証情報の新しいセットを作成するためです。
ワークロードがロールを使用してそれ自体を引き受ける場合は、その旨を明示的に許可する信頼ポリシーを作成する必要があります。信頼ポリシーを作成しない場合、AccessDenied
エラーが発生します。詳細については、「IAM ユーザーガイド」の「Modifying a role trust policy」(ロールの信頼ポリシーの変更) を参照してください。
アプリケーションが使用するセキュリティ認証情報をお客様が管理する必要なく、アプリケーションがインスタンスから API リクエストを安全に作成できるように、IAM ロールをデザインしました。AWS 認証情報を作成および配布する代わりに、以下の方法で、IAM ロールを使用して API リクエストを作成するアクセス許可を委任できます。
-
IAM ロールを作成します。
-
ロールを行うアカウントまたは AWS のサービスを定義する
-
ロールを引き受けた後で、アプリケーションで使用できる API アクションおよびリソースを定義します。
-
インスタンスの起動時にロールを指定するか、既存のインスタンスにロールをアタッチします。
-
アプリケーションで一時的な認証情報のセットを取得して使用します。
例えば、IAM ロールを使用し、Amazon S3 のバケットを使用する必要のあるインスタンスで実行中のアプリケーションに、アクセス許可を与えることができます。JSON 形式のポリシーを作成することにより、IAM ロールのアクセス許可を指定できます。これらのポリシーは、 ユーザー用に作成するポリシーに類似しています。ロールを変更すると、その変更はすべてのインスタンスに反映されます。
インスタンスにアタッチできる IAM ロールは 1 つだけですが、同じロールを複数のインスタンスにアタッチできます。IAM ロールの作成と使用の詳細については、IAM ユーザーガイドのロールを参照してください。
リソースレベルのアクセス許可を IAM ポリシーに適用して、インスタンスの IAM ロールのアタッチ、置換、またはデタッチをユーザーに許可するかどうを制御できます。詳細については、Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可と、例: IAM ロールの使用の例を参照してください。
インスタンスプロファイル
Amazon EC2 は、IAM ロールのコンテナとしてインスタンスプロファイルを使用します。IAM コンソールを使用して IAM ロールを作成すると、コンソールによりインスタンスプロファイルが自動的に作成され、対応するロールと同じ名前が付けられます。Amazon EC2 コンソールを使用して IAM ロールを持つインスタンスを起動する場合、またはインスタンスに IAM ロールをアタッチする場合は、インスタンスプロファイル名のリストに基づいてロールを選択します。
AWS CLI、API、または AWS SDK を使用してロールを作成する場合、ロールとインスタンスプロファイルを別個のアクションとして作成します。名前は異なる可能性があります。次に AWS CLI、API、または AWS SDK を使用して IAM ロールを持つインスタンスを起動する場合、またはインスタンスに IAM ロールをアタッチする場合は、インスタンスプロファイル名を指定します。
インスタンスプロファイルに含めることができる IAM ロールの数は 1 つのみです。この制限を増やすことはできません。
詳細については、IAM ユーザーガイドのインスタンスプロファイルを参照してください。
インスタンスのアプリケーションは、インスタンスメタデータアイテム iam/security-credentials/
role-name のロールから提供されたセキュリティ認証情報を取得します。アプリケーションには、ロールに関連付けられたセキュリティ認証情報によって、ロールに対して定義したアクションおよびリソースのアクセス許可が付与されます。これらのセキュリティ認証情報は一時的なものであり、私たちが自動的に循環させます。新しい認証情報は、古い認証情報が失効する少なくとも 5 分前から有効になるようにします。
IAM ロールでインスタンスメタデータを使用するサービスを使用する場合は、サービスで HTTP 呼び出しが行われるときに認証情報を公開しないように注意する必要があります。認証情報を公開できるサービスの種類には、HTTP プロキシ、HTML/CSS 検証サービス、および XML インクルードをサポートする XML プロセッサーが含まれます。
以下のコマンドでは、s3access
という名前の IAM ロールのセキュリティ認証情報を取得します。
- IMDSv2
-
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
- IMDSv1
-
PS C:\>
Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access
出力例を次に示します。
{
"Code" : "Success",
"LastUpdated" : "2012-04-26T16:39:16Z",
"Type" : "AWS-HMAC",
"AccessKeyId" : "ASIAIOSFODNN7EXAMPLE",
"SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"Token" : "token",
"Expiration" : "2017-05-17T15:09:54Z"
}
インスタンスで実行されるアプリケーション、AWS CLI、および Tools for Windows PowerShell コマンドのために、一時的なセキュリティ認証情報を明示的に取得する必要はありません。AWS SDK、AWS CLI、および Tools for Windows PowerShell は、EC2 インスタンスメタデータサービスから自動的に認証情報を取得し、使用します。一時的なセキュリティ認証情報を使用してインスタンスの外部で呼び出しを行う (IAM ポリシーをテストするなど) には、アクセスキー、秘密キー、およびセッショントークンを提供する必要があります。詳細については、IAM ユーザーガイドのAWS リソースへのアクセスを要求するための一時的なセキュリティ認証情報の使用を参照してください。
インスタンスのメタデータの詳細については、インスタンスメタデータとユーザーデータを参照してください。インスタンスメタデータの IP アドレスについては、インスタンスメタデータの取得を参照してください。
IAM ロールをインスタンスに渡すための許可をユーザーに付与する
ユーザーに対して、IAM ロールを持つインスタンスの起動、および既存インスタンスへの IAM ロールのアタッチと置き換えを許可するには、以下の API アクションを実行するための許可を付与します。
例えば、次の IAM ポリシーでは、IAM ロールを持つインスタンスの起動や、既存のインスタンスへの IAM ロールのアタッチならびに置換を行うためのアクセス許可を、AWS CLI を使用しながらユーザーに付与しています。
ユーザーにすべてのロールへのアクセス許可を付与するポリシーが必要な場合は、そのポリシーの中でリソースを *
として指定します。ただし、最小権限の原則によるベストプラクティスを考慮してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:RunInstances",
"ec2:AssociateIamInstanceProfile",
"ec2:ReplaceIamInstanceProfileAssociation"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::123456789012:role/DevTeam*"
}
]
}
Amazon EC2 コンソールを使用して、IAM ロールを持つインスタンスを起動したり、既存のインスタンスで IAM ロールをアタッチおよび置換したりするための、アクセス許可をユーザーに付与するには、必要であれば他の権限を追加しながら iam:ListInstanceProfiles
、iam:PassRole
、ec2:AssociateIamInstanceProfile
、および ec2:ReplaceIamInstanceProfileAssociation
を使用します。エンドポイントポリシーの例については、Amazon EC2 コンソールで機能するサンプル ポリシーを参照してください。
IAM ロールの使用
IAM ロールは、インスタンスの起動時または起動後に作成してインスタンスにアタッチできます。インスタンスの IAM ロールは、置換またはデタッチすることもできます。
IAM ロールを作成する
IAM ロールを持つインスタンスを起動したり、インスタンスにアタッチしたりするには、そのロールを事前に作成する必要があります。
- Console
-
IAM コンソールを使用して IAM ロールを作成するには
IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。
-
ナビゲーションペインで、[ロール]、[ロールの作成] の順に選択します。
-
[信頼できるエンティティの選択] ページで [AWS のサービス] を選択し、[EC2] ユースケースを選択します。[Next] (次へ) をクリックします。
-
[許可を追加する] ページで、必要なリソースに対するアクセス許可をインスタンスに付与するポリシーを選択します。[Next] (次へ) をクリックします。
-
[名前、確認、および作成] ページでロールの名前と説明を入力します。必要に応じて、ロールにタグを追加します。[Create role] (ロールの作成) を選択します。
- Command line
-
次の例では、IAM ロールを作成し、このロールに Amazon S3 バケットの使用を許可するポリシーを割り当てます。
IAM ロールおよびインスタンスプロファイルを作成するには (AWS CLI)
-
以下の信頼ポリシーを作成し、ec2-role-trust-policy.json
という名前のテキストファイルに保存します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
-
s3access
ロールを作成し、create-role コマンドを使用して作成した信頼ポリシーを指定します。
aws iam create-role \
--role-name s3access \
--assume-role-policy-document file://ec2-role-trust-policy.json
レスポンスの例
{
"Role": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
}
}
]
},
"RoleId": "AROAIIZKPBKS2LEXAMPLE",
"CreateDate": "2013-12-12T23:46:37.247Z",
"RoleName": "s3access",
"Path": "/",
"Arn": "arn:aws:iam::123456789012:role/s3access"
}
}
-
アクセスポリシーを作成し、ec2-role-access-policy.json
という名前のテキストファイルに保存します。例えば、このポリシーは、インスタンスで実行しているアプリケーションに対し、Amazon S3 の管理権限を与えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": ["*"]
}
]
}
-
put-role-policy コマンドを使用して、アクセスポリシーをロールにアタッチします。
aws iam put-role-policy \
--role-name s3access \
--policy-name S3-Permissions \
--policy-document file://ec2-role-access-policy.json
-
create-instance-profile コマンドを使用して、s3access-profile
という名前のインスタンスプロファイルを作成します。
aws iam create-instance-profile --instance-profile-name s3access-profile
レスポンスの例
{
"InstanceProfile": {
"InstanceProfileId": "AIPAJTLBPJLEGREXAMPLE",
"Roles": [],
"CreateDate": "2013-12-12T23:53:34.093Z",
"InstanceProfileName": "s3access-profile",
"Path": "/",
"Arn": "arn:aws:iam::123456789012:instance-profile/s3access-profile"
}
}
-
s3access
インスタンスプロファイルに s3access-profile
ロールを追加します。
aws iam add-role-to-instance-profile \
--instance-profile-name s3access-profile \
--role-name s3access
または、以下の AWS Tools for Windows PowerShell コマンドを使用することもできます。
IAM ロールを使用したインスタンスの起動
IAM ロールを作成した後、インスタンスを起動して、起動中にそのロールをインスタンスに関連付けることができます。
IAM ロールを作成した後、適切なアクセス許可が反映されるまで数秒ほどかかります。ロールを使用した最初のインスタンスの起動が失敗した場合は、数秒待ってからもう一度試してください。詳細については、「IAM ユーザーガイド」の「IAM ロールのトラブルシューティング」を参照してください。
- New console
-
IAM ロールを使用してインスタンスを起動するには (コンソール)
-
インスタンスを起動するための手順に従います。
-
[Advanced details] (高度な詳細) を展開し、[IAM instance profile] (IAM インスタンスプロファイル) で、作成した IAM ロールを選択します。
[IAM instance profile] (IAM インスタンスプロファイル) リストには、IAM ロールの作成時に作成したインスタンスプロファイルの名前が表示されます。コンソールを使用して IAM ロールを作成した場合、インスタンスプロファイルが自動的に作成され、ロールと同じ名前が付けられます。AWS CLI、API、または AWS SDK を使用して IAM ロールを作成した場合、インスタンスプロファイルに異なる名前を付けた可能性があります。
-
インスタンスに必要なその他の詳細を設定するか、デフォルトを受け入れて、キーペアを選択します。インスタンス起動ウィザードのフィールドについては、「定義済みのパラメータを使用したインスタンスの起動」を参照してください。
-
[Summary] (概要) パネルでインスタンスの設定を確認し、[Launch instance] (インスタンスを起動) を選択します。
-
アプリケーションで Amazon EC2 API アクションを使用している場合、インスタンスで有効にされている AWS セキュリティ認証情報を取得し、それを使用しリクエストに署名します。これは、AWS SDK によって行われます。
IMDSv2IMDSv1
- IMDSv2
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- IMDSv1
PS C:\>
Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- Old console
-
IAM ロールを使用してインスタンスを起動するには (コンソール)
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。
-
ダッシュボードで、[Launch Instance (インスタンスの起動)] を選択します。
-
AMI およびインスタンスタイプを選択し、[Next: Configure Instance Details] を選択します。
-
[Configure Instance Details] ページの [IAM role] で、作成した IAM ロールを選択します。
[IAM role] リストには、IAM ロールの作成時に作成したインスタンスプロファイルの名前が表示されます。コンソールを使用して IAM ロールを作成した場合、インスタンスプロファイルが自動的に作成され、ロールと同じ名前が付けられます。AWS CLI、API、または AWS SDK を使用して IAM ロールを作成した場合、インスタンスプロファイルに異なる名前を付けた可能性があります。
-
その他の詳細を設定し、ウィザードの残りの部分の指示に従うか、[Review and Launch] を選択してデフォルト設定を受け入れ、直接 [Review Instance Launch] ページに移動します。
-
設定を確認して [Launch] を選択し、キーペアを選択してインスタンスを起動します。
-
アプリケーションで Amazon EC2 API アクションを使用している場合、インスタンスで有効にされている AWS セキュリティ認証情報を取得し、それを使用しリクエストに署名します。これは、AWS SDK によって行われます。
IMDSv2IMDSv1
- IMDSv2
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT –Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- IMDSv1
PS C:\>
Invoke-RestMethod –uri http://169.254.169.254/latest/meta-data/iam/security-credentials/role_name
- Command line
-
AWS CLI を使用して起動時にロールをインスタンスに関連付けることもできます。コマンド内でインスタンスプロファイルを指定する必要があります。
IAM ロールを使用してインスタンスを起動するには (AWS CLI)
-
run-instances コマンドでインスタンスプロファイルを使用してインスタンスを起動します。以下の例は、インスタンスプロファイルを使用してインスタンスを起動する方法を示しています。
aws ec2 run-instances \
--image-id ami-11aa22bb \
--iam-instance-profile Name="s3access-profile" \
--key-name my-key-pair \
--security-groups my-security-group \
--subnet-id subnet-1a2b3c4d
または、New-EC2Instance Tools for Windows PowerShell コマンドを使用することもできます。
-
アプリケーションで Amazon EC2 API アクションを使用している場合、インスタンスで有効にされている AWS セキュリティ認証情報を取得し、それを使用しリクエストに署名します。これは、AWS SDK によって行われます。
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
role_name
インスタンスへの IAM ロールのアタッチ
ロールを持たないインスタンスに IAM ロールをアタッチするには、そのインスタンスを stopped
または running
の状態にします。
- Console
-
IAM ロールをインスタンスにアタッチするには
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。
-
ナビゲーションペインで、[Instances] (インスタンス) を選択します。
-
インスタンスを選択し、[アクション]、[セキュリティ]、[IAM ロールの変更] の順に選択します。
-
インスタンスにアタッチする IAM ロールを選択して、[保存] を選択します。
- Command line
-
IAM ロールをインスタンスにアタッチするには (AWS CLI)
-
必要に応じて、インスタンスを記述して、ロールをアタッチするインスタンスの ID を取得します。
aws ec2 describe-instances
-
associate-iam-instance-profile コマンドでインスタンスプロファイルを指定して、IAM ロールをインスタンスにアタッチします。インスタンスプロファイルの Amazon リソースネーム (ARN) またはプロファイル名を使用できます。
aws ec2 associate-iam-instance-profile \
--instance-id i-1234567890abcdef0
\
--iam-instance-profile Name="TestRole-1
"
レスポンスの例
{
"IamInstanceProfileAssociation": {
"InstanceId": "i-1234567890abcdef0",
"State": "associating",
"AssociationId": "iip-assoc-0dbd8529a48294120",
"IamInstanceProfile": {
"Id": "AIPAJLNLDX3AMYZNWYYAY",
"Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-1"
}
}
}
または、以下の Tools for Windows PowerShell コマンドを使用します。
IAM ロールの置換
既に IAM ロールが割り当てられているインスタンスで IAM ロールを置き換えるには、インスタンスは running
状態になっている必要があります。既存のロールをデタッチしないでインスタンスの IAM ロールを変更する場合に、これを行うことができます。例えば、インスタンスで実行しているアプリケーションが実行する API アクションが中断されないようにするために、これを行うことができます。
- Console
-
インスタンスの IAM ロールを置き換えるには
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。
-
ナビゲーションペインで、[Instances] (インスタンス) を選択します。
-
インスタンスを選択し、[アクション]、[セキュリティ]、[IAM ロールの変更] の順に選択します。
-
インスタンスにアタッチする IAM ロールを選択して、[保存] を選択します。
- Command line
-
インスタンスの IAM ロールを置き換えるには (AWS CLI)
-
必要に応じて、IAM インスタンスプロファイルの関連付けを記述し、置き換える IAM インスタンスプロファイルの関連 ID を取得します。
aws ec2 describe-iam-instance-profile-associations
-
replace-iam-instance-profile-association コマンドで置換元のインスタンスプロファイルの関連 ID と置換先のインスタンスプロファイルの ARN 名またはプロファイル名を指定して、IAM インスタンスプロファイルを置き換えます。
aws ec2 replace-iam-instance-profile-association \
--association-id iip-assoc-0044d817db6c0a4ba
\
--iam-instance-profile Name="TestRole-2
"
レスポンスの例
{
"IamInstanceProfileAssociation": {
"InstanceId": "i-087711ddaf98f9489",
"State": "associating",
"AssociationId": "iip-assoc-09654be48e33b91e0",
"IamInstanceProfile": {
"Id": "AIPAJCJEDKX7QYHWYK7GS",
"Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2"
}
}
}
または、以下の Tools for Windows PowerShell コマンドを使用します。
IAM ロールのデタッチ
実行中または停止中のインスタンスから IAM ロールをデタッチできます。
- Console
-
インスタンスから IAM ロールをデタッチするには
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。
-
ナビゲーションペインで、[Instances] (インスタンス) を選択します。
-
インスタンスを選択し、[アクション]、[セキュリティ]、[IAM ロールの変更] の順に選択します。
-
[AM ロール] で、[IAM ロールがありません] を選択します。[Save] を選択します。
-
確認ダイアログボックスで、Detachと入力し、[デタッチ] を選択します。
- Command line
-
インスタンスから IAM ロールをデタッチするには (AWS CLI)
-
必要に応じて、describe-iam-instance-profile-associations で IAM インスタンスプロファイルの関連付けを記述し、デタッチする IAM インスタンスプロファイルの関連 ID を取得します。
aws ec2 describe-iam-instance-profile-associations
レスポンスの例
{
"IamInstanceProfileAssociations": [
{
"InstanceId": "i-088ce778fbfeb4361",
"State": "associated",
"AssociationId": "iip-assoc-0044d817db6c0a4ba",
"IamInstanceProfile": {
"Id": "AIPAJEDNCAA64SSD265D6",
"Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2"
}
}
]
}
-
disassociate-iam-instance-profile コマンドで関連 ID を使用して IAM インスタンスプロファイルをデタッチします。
aws ec2 disassociate-iam-instance-profile --association-id iip-assoc-0044d817db6c0a4ba
レスポンスの例
{
"IamInstanceProfileAssociation": {
"InstanceId": "i-087711ddaf98f9489",
"State": "disassociating",
"AssociationId": "iip-assoc-0044d817db6c0a4ba",
"IamInstanceProfile": {
"Id": "AIPAJEDNCAA64SSD265D6",
"Arn": "arn:aws:iam::123456789012:instance-profile/TestRole-2"
}
}
}
または、以下の Tools for Windows PowerShell コマンドを使用します。
アクセスアクティビティに基づいて IAM ロールのポリシーを生成する
アプリケーションの IAM ロールを最初に作成するときに、必要な範囲を超えたアクセス権限を付与することがあります。本番環境でアプリケーションを起動する前に、IAM ロールのアクセスアクティビティに基づく IAM ポリシーを生成できます。IAM Access Analyzer は AWS CloudTrail ログを確認し、指定した日付範囲内のロールが使用したアクセス許可を含むポリシーテンプレートを生成します。テンプレートを使用して、きめ細かなアクセス権限で管理ポリシーを作成し、それを IAM ロールにアタッチできます。これにより、特定のユースケースでロールが AWS リソースとインタラクションするために必要なアクセス権限のみを付与します。これは、最小アクセス権限の付与のベストプラクティスに準拠するのに役立ちます。詳細については、「IAM ユーザーガイド」の「アクセスアクティビティに基づいてポリシーを生成する」を参照してください。