AWS CLIで EC2 に割り当てた IAM ロール から Switch Role してみた。

AWS CLIで EC2 に割り当てた IAM ロール から Switch Role してみました。
2019.02.08

福岡オフィスの梶原です。

先日、AWS CLIでSwitch Role してさらに Switch Role してみた。を公開してエゴサしてると

「EC2に割り当てたRoleの場合はどうすんの?」ってつぶやきを発見しました。

あーそういう事か、確かにEC2にAPIキーを置くとかありえんよねー。 ということで、調べました!

まぁ、最悪できんでも、EC2のロールで、一時クレデンシャル取って、それをaws sts assume-roleでRole取得の際に指定して、うわーーーそんなん、めんどい、やっぱ終了 と、思っていたところ

AWS CLIでインスタンスプロファイルからのAssumeRoleが簡単になりました | DevelopersIO

ということで

source_profile = role-a

ってしていたところを

credential_source = Ec2InstanceMetadata

に置き換えれば、一時クレデンシャルを取得してあーだこーだってことをやってくれるみたいです。。なんて楽。

図にするとこんな感じです

やってみる

引き受け元のEC2RoleAはEC2に割り当て

EC2RoleAのポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

引受先のEC2RoleBのポリシーでEC2RoleAを引き受け先に設定

EC2RoleBのポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "arn:aws:iam::xxxxxxxxxxx:role/EC2RoleA"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

とし ~/.aws/config を作成して

[profile ec2-role-b]
role_arn = arn:aws:iam::XXXXXXXXXXXX:role/EC2RoleB
credential_source=Ec2InstanceMetadata

とすれば profileでec2-role-bを指定して、EC2上で実行してみます。
まずは、通常通りEC2上で認証の確認

$ aws sts get-caller-identity
{
    "Account": "XXXXXXXXXXXX", 
    "UserId": "HOGEHOGE:<<インスタンスID>>", 
    "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/EC2RoleA/<<インスタンスID>>"
}

EC2に割り当てられたRoleが使用されています。 profileを指定して

$ aws sts get-caller-identity --profile ec2-role-b
{
    "Account": "XXXXXXXXXXXX", 
    "UserId": "XXXXXXXXXXXX:botocore-session-1234567890", 
    "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/EC2RoleB/botocore-session-1234567890"
}

EC2に割り当てたRoleAを使ってRoleBにスイッチロールできました! RoleAは権限なし、RoleBにS3の読み取り権限をつけて、実行などして、確認してみてください。

まとめ

当然ですが、共有アカウントのような使い方は推奨しません(勘のいい子は嫌いだよ
適切に権限を割り当て、複数のAWS環境へのサービスや、権限を一時的に割り当てたいとかにIAMRoleがごちゃごちゃになることは避けられそうです。