どういう問題か?
EC2は起動する時、もしくは起動中のインスタンスにたいしてIAMロールを設定できる。 AWSのリソースをこのインスタンスから使用する場合これは確実に設定しなければいけないので多くの場合は設定すると思う。 今回起きた問題はその既存のIAMロールを選択する際に作成したIAMが候補に表示されない。
インスタンス起動時の設定
インスタンス起動後の設定
何が原因だったのか??
IAMには「信頼関係」という項目がある。 そこでec2インスタンスに対して設定がされていないことが原因。
一から作る場合は、ここでEC2を設定すると自動的にEC2に対して信頼関係が作成される。
設定(信頼関係の編集)
例えばlambdaに対して信頼関係を作成したroleをEC2に変更する。 IAMロール一覧では信頼するエンティティがlambdaになっていることが確認できる。 この状態ではEC2のIAMロール設定画面から候補に挙がらない。
ロールを選択し、信頼関係のタブを選択すると、「信頼関係の編集」でjson形式で以下のように編集する。 (lambdaをそのままにec2を追加した。配列StatementにEC2の定義を追加すれば良い。)
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
編集を保存して画面に戻ると、信頼するエンティティが追加されていることが確認できる。
次にインスタンスプロファイルARNが空なので設定する必要がある。
設定(インスタンスプロファイルARN)
コンソールから後から設定することができないので、aws-cliを使用して設定する。 (これはEC2にIAMをアタッチするところで直接作成すれば自動的に作成される)
- プロファイルを作成する。(今回はロール名を同じにした、通常は同じ名前になるらしい)
$ aws iam create-instance-profile --instance-profile-name dynamo_full_test_role { "InstanceProfile": { "Path": "/", "InstanceProfileName": "dynamo_full_test_role", "InstanceProfileId": "AIPA3****************", "Arn": "arn:aws:iam::****************:instance-profile/dynamo_full_test_role", "CreateDate": "2019-10-23T16:55:14Z", "Roles": [] } }
- プロファイルとIAMロールを紐付ける。
$ aws iam add-role-to-instance-profile \ --instance-profile-name dynamo_full_test_role \ --role-name dynamo_full_test_role # responseはなし
設定完了!
表示されるようになった(画面開いたままなら更新が必要)