AWSのAssumeRole

(2017-02-25)

AWS Security Token Serviceによる、 RoleArn(arn:aws:iam::<account id>:role/<role name>)から一時的なCredentialを取得する仕組み。 前もって発行したAPIキーとは違い、有効期限が存在するため続けて呼ぶ場合は失効する前に再発行する必要がある。

ではRoleArnを知っていたら誰でも取得できるかというと、もちろんそうではなく、 ロールの信頼関係、"Action": "sts:AssumeRole"のPrincipalのところで信頼する対象を設定する。 例えば、Serviceec2.amazonaws.comを指定してEC2がAssumeRoleするのを許可したり、 AWSで(他の)アカウントやユーザーを指定してそのAPIキーでこのRoleのCredentialを取得できるようにしたりといった感じ。

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

EC2にロールを設定すると、実はそのロールについてAssumeRoleして自動でCredentialを取得している。 EC2にロールを設定するにはロールとは別に インスタンスプロファイルを作成 する必要があるが、コンソールでEC2のサービスロールを作ると同名のインスタンスプロファイルが自動で作成される。 さらに、AssumeRoleのServiceとしてec2.amazonaws.comが追加されている。

$ curl http://169.254.169.254/latest/meta-data/iam/info
{
  "Code" : "Success",
  "LastUpdated" : "2017-02-25T10:56:33Z",
  "InstanceProfileArn" : "arn:aws:iam::*****:instance-profile/assume_role_test",
  "InstanceProfileId" : "*****"
}

$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/assume_role_test
{
  "Code" : "Success",
  "LastUpdated" : "2017-02-25T10:56:23Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "*****",
  "SecretAccessKey" : "*****",
  "Token" : "*****",
  "Expiration" : "2017-02-25T17:26:07Z"
}

参考

IAMロール徹底理解 〜 AssumeRoleの正体 | Developers.IO

一時的なセキュリティ認証情報を使用して AWS リソースへのアクセスをリクエストする - AWS Identity and Access Management