AWSで、例えばあるユーザーからあるロールへAssumeRoleし、さらに別のAWSアカウントのロールへクロスアカウントでAssumeRoleしたいということがあります。
このようなケースでは、AssumeRoleを2段で行う必要があります。
このエントリでは、2段AssumeRoleするためのTerraformの設定と、AWS CLIによる確認方法を説明します。
AssumeRoleによってロールからロールへスイッチすることを「ロールの連鎖」と呼びます。
ロールの連鎖を行うために、例として2つのロールを作成します。
作成する2つのロールは、RPGに見立てて「メイジ(mage)」と「アークメイジ(arch mage)」とします。
今回は下記のような流れを考えます。
- ユーザー
test.user
- AssumeRole
- ロール
mage
- AssumeRole
- ロール
archmage
作成するリソースは下記です。
- ユーザー
test.user
- ユーザーベースのポリシー
- ロール
mage
,archmage
とロールの信頼ポリシー
下記にTerraformの設定例を示します。
resource "aws_iam_user" "test-user" {
name = "test.user"
path = "/"
}
data "aws_iam_policy_document" "assume-role-to-mage-policy-document" {
statement {
actions = [
"sts:AssumeRole"
]
resources = [
aws_iam_role.mage.arn
]
}
}
resource "aws_iam_policy" "assume-role-to-mage-policy" {
name = "assume-role-to-mage"
path = "/"
policy = data.aws_iam_policy_document.assume-role-to-mage-policy-document.json
}
resource "aws_iam_user_policy_attachment" "test-user-assume-role-to-mage-policy-attachment" {
user = aws_iam_user.test-user.name
policy_arn = aws_iam_policy.assume-role-to-mage-policy.arn
}
resource "aws_iam_role" "mage" {
name = "mage"
assume_role_policy = data.aws_iam_policy_document.mage-role-policy-document.json
}
resource "aws_iam_role" "archmage" {
name = "archmage"
assume_role_policy = data.aws_iam_policy_document.archmage-role-policy-document.json
}
data "aws_iam_policy_document" "mage-role-policy-document" {
statement {
actions = [
"sts:AssumeRole",
]
principals {
type = "AWS"
identifiers = [aws_iam_user.test-user.arn]
}
}
}
data "aws_iam_policy_document" "archmage-role-policy-document" {
statement {
actions = [
"sts:AssumeRole",
]
principals {
type = "AWS"
identifiers = [aws_iam_role.mage.arn]
}
}
}
注意すべき点としては、1段目のAssumeRoleに伴う権限の設定です。
下記の2つのポリシーをみてください。
data "aws_iam_policy_document" "assume-role-to-mage-policy-document" {
statement {
actions = [
"sts:AssumeRole"
]
resources = [
aws_iam_role.mage.arn
]
}
}
data "aws_iam_policy_document" "mage-role-policy-document" {
statement {
actions = [
"sts:AssumeRole",
]
principals {
type = "AWS"
identifiers = [aws_iam_user.test-user.arn]
}
}
}
2つのポリシーはよく似ています。前者はresources
を持ち、後者がprincipals
を持っています。
両者ともポリシー形式で記述されるため紛らわしいですが、前者は「アイデンティティベースのポリシー」で、後者は「リソースベースのポリシー」という違いがあります。
アイデンティティベースのポリシーは、ポリシーをアタッチするユーザーなどに対して「何に対して(リソース)」「できるか(アクション)」を定義します。
アクションの主体は、ポリシーをアタッチするユーザーなどです。
リソースベースのポリシーは、ポリシーをアタッチするロールなどのリソースに対して「誰が(主体)」「できるか(アクション)」を定義します。
リソースベースのポリシーでは、「誰が」にあたるアクションの主体(principal)を記述する必要があります。
AWS CLIで2段AssumeRoleを行ってみます。
AWS CLIで使用するコマンドは次の2つです。
-
aws sts get-caller-identity
-
aws sts assume-role
aws sts get-caller-identity
は、現在のAPI呼び出しがどのユーザーまたはロールで行われているのかを返してくれます。
# 最初は test.user
% aws sts get-caller-identity
{
"UserId": "XXX",
"Account": "000",
"Arn": "arn:aws:iam::000:user/test.user"
}
# user/test.user -> role/mage へ AssumeRole
% aws sts assume-role --role-arn "arn:aws:iam::000:role/mage" --role-session-name AWSCLI-Session
{
"Credentials": {
"AccessKeyId": "YYY",
"SecretAccessKey": "yyy",
"SessionToken": "yyy123",
"Expiration": "2020-09-05T08:27:36+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "YYYZZZ:AWSCLI-Session",
"Arn": "arn:aws:sts::000:assumed-role/mage/AWSCLI-Session"
}
}
% export AWS_ACCESS_KEY_ID=YYY
% export AWS_SECRET_ACCESS_KEY=yyy
% export AWS_SESSION_TOKEN='yyy123'
# mage になった
% aws sts get-caller-identity
{
"UserId": "YYY123:AWSCLI-Session",
"Account": "000",
"Arn": "arn:aws:sts::000:assumed-role/mage/AWSCLI-Session"
}
# role/mage -> role/archmage へ AssumeRole
% aws sts assume-role --role-arn "arn:aws:iam::000:role/archmage" --role-session-name AWSCLI-Session
{
"Credentials": {
"AccessKeyId": "ZZZ",
"SecretAccessKey": "zzz",
"SessionToken": "zzz123",
"Expiration": "2020-09-05T08:31:01+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "ZZZ123:AWSCLI-Session",
"Arn": "arn:aws:sts::000:assumed-role/archmage/AWSCLI-Session"
}
}
% export AWS_ACCESS_KEY_ID=ZZZ
% export AWS_SECRET_ACCESS_KEY=zzz
% export AWS_SESSION_TOKEN='zzz123'
# archmage になった
% aws sts get-caller-identity
{
"UserId": "ZZZ123:AWSCLI-Session",
"Account": "000",
"Arn": "arn:aws:sts::000:assumed-role/archmage/AWSCLI-Session"
}
以上です。
このエントリでは、2段AssumeRoleするためのTerraformの設定と、AWS CLIによる確認方法を説明しました。
TerraformをGitHub Actionで実行したい方は、下記の記事が参考になりそうです。
コメントを送る
コメントはブログオーナーのみ閲覧できます