こんにちは、Reoです。
フリーランスのインフラエンジニアとして働きながら、インフラ学習サービス「InfraDojo(インフラ道場)」を運営しています。
「このEC2には、どのIAMロールが付いているんだろう?」
そう思ってCLIで調べると、ロール名ではなく、instance-profile という文字列が出てくることがあります。
今回は、EC2 → インスタンスプロファイル → IAMロールの順番で、設定を確認する方法を紹介します。
IAMロールとインスタンスプロファイルの関係
EC2上のアプリにIAMロールを利用させる際には、インスタンスプロファイルを使います。
それぞれの役割は、次のとおりです。
| 用語 | 役割 |
|---|---|
| IAMロール | ポリシーなどを通じて、AWSでの操作権限を設定する |
| インスタンスプロファイル | IAMロールをEC2へ渡すための入れ物 |
AWSコンソールでEC2用のロールを作ると、同名のインスタンスプロファイルが自動作成されます。
ただし、CLIなどでは別々に作成できるため、プロファイル名とロール名が同じとは限りません。 インスタンスプロファイルの仕組み
今回は、EC2上のアプリ用に関連付けられたロールを確認します。
実行前に準備するもの
必要なものは次のとおりです。
- AWS CLI v2
- 確認したいAWSアカウントへの認証
- 対象EC2のインスタンスIDとリージョン
- 確認を実行するユーザー・ロールの参照権限
使用する権限は、主に次の2つです。
ec2:DescribeInstances
iam:GetInstanceProfile
対象EC2へSSH接続する必要はありません。認証済みのローカル環境やCloudShellなどから確認できます。
以下はBash・Zshなどで実行する例です。リージョンとインスタンスIDは、自分の環境に置き換えてください。
① EC2に関連付けられたプロファイルを確認する
まず、EC2の情報からインスタンスプロファイルのARNを取り出します。
aws ec2 describe-instances \
--region ap-northeast-1 \
--instance-ids i-0123456789abcdef0 \
--query 'Reservations[].Instances[].{InstanceId:InstanceId,InstanceProfileArn:IamInstanceProfile.Arn}' \
--output json \
--no-cli-pager
--query では、応答から必要な項目だけを選んでいます。
| 取り出す項目 | 内容 |
|---|---|
InstanceId |
EC2のインスタンスID |
IamInstanceProfile.Arn |
関連付けられたインスタンスプロファイルのARN |
EC2の情報は、describe-instances で取得できます。コマンドの仕様
出力の想定例です。
[
{
"InstanceId": "i-0123456789abcdef0",
"InstanceProfileArn": "arn:aws:iam::123456789012:instance-profile/app-instance-profile"
}
]
ここで分かるのは、次のプロファイルが関連付けられていることです。
app-instance-profile
この時点では、まだロール名を確認できていません。
ARNの途中も、role/ ではなく instance-profile/ になっています。
② プロファイルに入っているロールを確認する
次に、取得したプロファイル名を使います。
aws iam get-instance-profile \
--instance-profile-name app-instance-profile \
--query 'InstanceProfile.{ProfileName:InstanceProfileName,Roles:Roles[].{RoleName:RoleName,RoleArn:Arn}}' \
--output json \
--no-cli-pager
--instance-profile-name に指定するのは、ARN全体ではなくプロファイル名です。
ARNにパスが含まれる場合も、末尾の名前部分を指定します。
get-instance-profile では、プロファイルと、その中のロールの情報を取得できます。コマンドの仕様
出力の想定例です。
{
"ProfileName": "app-instance-profile",
"Roles": [
{
"RoleName": "app-read-role",
"RoleArn": "arn:aws:iam::123456789012:role/app-read-role"
}
]
}
これで、ロール名は次のとおりだと分かります。
app-read-role
今回の例を並べると、名前の違いが明確になります。
| 種類 | 名前 |
|---|---|
| インスタンスプロファイル | app-instance-profile |
| IAMロール | app-read-role |
プロファイル名を見てロール名だと思い込まず、Roles の中まで確認するのがポイントです。
なお、AWS CLIの --profile で選ぶ「名前付きプロファイル」は、ここで扱うインスタンスプロファイルとは別のものです。
nullやエラーが出たら、どこを見る?
期待した結果にならない場合は、次のように整理できます。
| 結果 | 確認すること |
|---|---|
InstanceProfileArn が null
|
対象EC2へのインスタンスプロファイルの関連付け |
InvalidInstanceID.NotFound |
インスタンスID・リージョン・接続先アカウント |
UnauthorizedOperation / AccessDenied
|
確認コマンドを実行しているユーザー・ロールの権限 |
Roles が空配列 []
|
プロファイルにロールが入っているか |
エラーが出たときは、「調査対象のEC2の権限」と「今コマンドを実行している自分の権限」を分けて考えてください。
また、関連付けなどを変更した直後は、情報の反映に時間がかかる場合もあります。
ロールの存在と、実際の権限は別に確認する
今回分かるのは、EC2にどのプロファイルが関連付けられ、その中にどのロールがあるかです。
app-read-role という名前だけでは、具体的に何を読み取れるかまでは判断できません。
実際の権限を調べるには、ロールに設定されたポリシーなどを確認する必要があります。
さらに、EC2上のアプリやCLIが、そのロールの認証情報を使っているとも限りません。
たとえばAWS CLIでは、環境変数などで指定された認証情報が優先される場合があります。AWS CLIの認証情報の優先順位
「関連付けられたロール」と「実際の処理で使われている認証情報」は、分けて確認しましょう。
取得した情報を、次の確認につなげよう
今回の手順は、次の2段階です。
-
describe-instancesでプロファイルのARNを確認する -
get-instance-profileで、その中のロールを確認する
コマンドを一つ覚えるだけでなく、取得した情報のどこを使って、次に何を調べるかを考えると、設定のつながりが見えてきます。
ターミナル操作やコマンドの出力を読むことに慣れたい方は、InfraDojoも活用してみてください。
ブラウザ上のターミナルで、Linuxの基本操作を実際に入力しながら学べます。AWSの学習と並行して、コマンド操作の基礎を固めたい方に向いています。
▼ InfraDojo(インフラ道場)
