アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

AWS 2段AssumeRoleするためのTerraform設定とCLIによる確認方法(ロールの連鎖)

f:id:otoyo0122:20200905174244p:plain:w300

AWSで、例えばあるユーザーからあるロールへAssumeRoleし、さらに別のAWSアカウントのロールへクロスアカウントでAssumeRoleしたいということがあります。

このようなケースでは、AssumeRoleを2段で行う必要があります。

このエントリでは、2段AssumeRoleするためのTerraformの設定と、AWS CLIによる確認方法を説明します。

ロールの連鎖

AssumeRoleによってロールからロールへスイッチすることを「ロールの連鎖」と呼びます。

ロールの連鎖を行うために、例として2つのロールを作成します。

作成する2つのロールは、RPGに見立てて「メイジ(mage)」と「アークメイジ(arch mage)」とします。

今回は下記のような流れを考えます。

  1. ユーザー test.user
  2. AssumeRole
  3. ロール mage
  4. AssumeRole
  5. ロール archmage

Terraformの設定

作成するリソースは下記です。

  • ユーザー 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による確認方法

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による確認方法を説明しました。

参考になった方は、ぜひ「はてブ」やSNSでシェアしていただけると嬉しいです。

TerraformをGitHub Actionで実行したい

TerraformをGitHub Actionで実行したい方は、下記の記事が参考になりそうです。

alpacat.hatenablog.com

参考リンク