[小ネタ] EC2用にIAMロールを作ったのに、EC2へ割り当てられない!

慌てるな、まず落ち着こう。
2022.04.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、こんにちは!
福岡オフィスの青柳です。

今回は「IAM」に関する小ネタです。

IAMロールを作成してEC2へ割り当てる

EC2インスタンスに対してAWSリソースへのアクセス許可を与える場合の「ベストプラクティス」について、賢明な読者の皆さんであればご存じかと思います。

△ IAMユーザーを作成して、アクセスキーID/シークレットアクセスキーをcredentialsファイルに書く
◎ IAMロールを作成して、EC2インスタンスへ割り当てる

ということで、EC2用にIAMロールを作成して、EC2インスタンスへ割り当てたいと思います。

IAMロールを作成する

マネジメントコンソールより、IAMロールを作成します。

最初の「ステップ1: 信頼されたエンティティを選択」画面で、次のように設定します。

  • 「信頼されたエンティティタイプ」で、「AWSのサービス」を選択する
  • 「ユースケース」で、「一般的なユースケース」の「EC2」を選択する

続いて、「許可ポリシー」の中から付与した権限を持つポリシーを選択します。

ここでは、AWS管理ポリシー「AmazonSSMManagedInstanceCore」を選択しました。

最後に、ロール名などの情報を入力します。

これでIAMロールの作成が完了です。

作成したIAMロールをEC2インスタンスへ割り当てる

IAMロールをEC2インスタンスへ割り当てる場合、インスタンスを新規作成するタイミングで設定する方法と、作成済みのインスタンスに対して設定する方法があります。

ここでは新規作成のタイミングで設定することにします。

マネジメントコンソールより、EC2インスタンスの作成ウィザードを開始します。

「ステップ3: インスタンスの詳細の設定」画面に、「IAMロール」の項目があります。

さきほど作成したIAMロールがリストに表示されていますので、選択します。

あとは、EC2インスタンスの作成ウィザードを進めていき、EC2インスタンスの作成を完了します。

これで、IAMロールで設定されたアクセス権限が、EC2インスタンスに対して適用されました。

ある日のこと・・・

さて、ある日のこと、私は「今日も元気にEC2インスタンスを起動するか~」と鼻歌交じりで作業をしておりました。(ややフィクション)

いつものように「EC2用のIAMロール」を作成して、EC2インスタンスへの割り当てを設定しようとしたところ・・・

あれ・・・?
作成したはずのIAMロールが、選択肢に現れないよ・・・

意味が分からなくて、1分間ほど頭を抱えた状態になってしまいました。

何かが違う・・・

何か設定ミスなどしてしまったのではないか?
と思って、作成したIAMロールのプロパティ画面を良く見てみました・・・

あれ? 何かが足りない・・・?

あっ!?
ココ (赤枠の部分) に表示されるはずの「インスタンスプロファイルのARN」が表示されていません!

念のためにAWS CLIでも確認してみます。

$ aws iam get-instance-profile --instance-profile-name iam-role-for-ec2-instance

An error occurred (NoSuchEntity) when calling the GetInstanceProfile operation: Instance Profile iam-role-for-ec2-instance cannot be found.

あぁ、、、やっぱりインスタンスプロファイルが作成されていないようです、、、

どうしてこうなった?

AWS CLIやCloudFormationでEC2用IAMロールを作成する場合は、明示的にインスタンスプロファイルを作成する必要があります。

でも、マネジメントコンソールからEC2用IAMロールを作成する場合は、自動的にインスタンスプロファイルも作成してくれるはずです。

AWSドキュメントにも、そのように書かれています。
インスタンスプロファイルの使用 - AWS Identity and Access Management

AWS Management Console を使用して Amazon EC2 のロールを作成する場合、コンソールはインスタンスプロファイルを自動的に作成し、そのインスタンスプロファイルにロールと同じ名前を付けます。

IAMロールを作成した時のことを思い出してみます。

・・・

思い出しました。

最初の画面で「カスタム信頼ポリシー」を選択して、信頼ポリシードキュメントを直接入力していました。

この手順で作成したとしても、信頼ポリシーの設定内容は「AWSのサービス」→「EC2」を選択した場合と同じものになるはずです。
実際に、作成されたIAMロール自体は、「AWSのサービス」→「EC2」で作成したIAMロールと全く同じ内容でした。

しかし、「カスタム信頼ポリシー」を選択してIAMロールを作成した場合は、「インスタンスプロファイル」が自動的に作成されていませんでした。

つまり、マネジメントコンソールからEC2用IAMロールを作成する場合、最初の画面で「AWSのサービス」→「EC2」を選択した場合にのみ、インスタンスプロファイルが自動的に作成されるということになります。
このことはAWSドキュメントには明示的には書かれていませんが、手順を再現して検証した結果、間違いないと思います。

もし、こうなってしまったら

今回のように「IAMロール」は作成されているが「インスタンスプロファイル」が作成されていない、という事態に陥ってしまった場合の対処法についてです。

マネジメントコンソールで「IAMロール」から「インスタンスプロファイル」を作成するインターフェイスは用意されていません。

したがって、対処法としては以下のいずれかになります。

  • 一度IAMロールを削除して、再度作成し直す (その際には「AWSのサービス」→「EC2」を選択する)
  • AWS CLIを使ってインスタンスプロファイルを作成する

AWS CLIを使う場合は、以下のようにコマンドを実行すればOKです。

まず、インスタンスプロファイルを作成します。

$ aws iam create-instance-profile --instance-profile-name iam-role-for-ec2-instance

次に、作成したインスタンスプロファイルにIAMロールを追加します。

$ aws iam add-role-to-instance-profile --instance-profile-name iam-role-for-ec2-instance --role-name iam-role-for-ec2-instance

これで大丈夫です。

おわりに

AWSでは、マネジメントコンソールで操作すると、暗黙的にリソースが作成されるというパターンが割と多くあります。

いちいちリソースを作成しなくて済むので便利である反面、油断していると、今回の私のように思わぬハマりに遭ってしまうということもあります。

このような時に、普段からAWS CLIやCloudFormationなどでIAMロールやインスタンスプロファイルを作成することに慣れていれば、何が起こっているのかを切り分けることもできるでしょう。

「マネジメントコンソールで操作を行った時に、どのようなリソースが作成されるのか」「マネジメントコンソールでリソースを作成する代わりに、AWS CLIやCloudFormationを使って作成するには、どのような手順や記述が必要なのか」といったことを考えたり調べたりすることは、各サービスの理解を深め、トラブルシューティング能力を高めることに繋がるのではないかと思います。