0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS初心者向け】EC2のIAMロールをAWS CLIで確認する|インスタンスプロファイルとの違い

0
Posted at

こんにちは、Reoです。

フリーランスのインフラエンジニアとして働きながら、インフラ学習サービス「InfraDojo(インフラ道場)」を運営しています。

「このEC2には、どのIAMロールが付いているんだろう?」

そう思ってCLIで調べると、ロール名ではなく、instance-profile という文字列が出てくることがあります。

今回は、EC2 → インスタンスプロファイル → IAMロールの順番で、設定を確認する方法を紹介します。


IAMロールとインスタンスプロファイルの関係

EC2上のアプリにIAMロールを利用させる際には、インスタンスプロファイルを使います。

それぞれの役割は、次のとおりです。

用語 役割
IAMロール ポリシーなどを通じて、AWSでの操作権限を設定する
インスタンスプロファイル IAMロールをEC2へ渡すための入れ物

AWSコンソールでEC2用のロールを作ると、同名のインスタンスプロファイルが自動作成されます。

ただし、CLIなどでは別々に作成できるため、プロファイル名とロール名が同じとは限りません。 インスタンスプロファイルの仕組み

image.png

今回は、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段階です。

  1. describe-instances でプロファイルのARNを確認する
  2. get-instance-profile で、その中のロールを確認する

コマンドを一つ覚えるだけでなく、取得した情報のどこを使って、次に何を調べるかを考えると、設定のつながりが見えてきます。

ターミナル操作やコマンドの出力を読むことに慣れたい方は、InfraDojoも活用してみてください。

ブラウザ上のターミナルで、Linuxの基本操作を実際に入力しながら学べます。AWSの学習と並行して、コマンド操作の基礎を固めたい方に向いています。

▼ InfraDojo(インフラ道場)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?