如何修改已创建的 IAM 角色的假设角色策略?

alt*_*-f4 5 amazon-web-services terraform

我的目标是能够设置一个 IAM 角色,该角色可以承担某个 IAM 用户的角色。创建角色后,我想稍后再回来修改这个角色,添加外部ID以建立信任关系。让我用一个例子来说明:

假设我想创建角色:

resource "aws_iam_role" "happy_role" {
  name               = "happy-role"
  assume_role_policy = data.aws_iam_policy_document.happy_assume_rule_policy.json
}
Run Code Online (Sandbox Code Playgroud)

我们还假设它happy_assume_role_policy看起来像这样:

data "aws_iam_policy_document" "happy_assume_role_policy" {
  statement {
    effect  = "Allow"
    actions = ["sts:AssumeRole"]
    principals {
      type        = "AWS"
      identifiers = [var.some_iam_user_arn]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我将使用创建的角色来创建外部集成。但是,一旦创建完该集成,我想返回到最初创建的角色并修改其假定的角色策略。所以现在我想向假设角色策略添加一个条件,使其看起来像:

data "aws_iam_policy_document" "happy_assume_role_policy" {
  statement {
    effect  = "Allow"
    actions = ["sts:AssumeRole"]
    principals {
      type        = "AWS"
      identifiers = [var.snowflake_iam_user_arn]
    }
    condition {
      test     = "StringEquals"
      values   = [some_integration.integration.external_id]
      variable = "sts:ExternalId"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,我的工作流程应该是这样的:

  1. 创建角色无需假设条件
  2. 创建与该角色的集成
  3. 从创建的集成中获取 ID,然后返回到创建的角色并在其上添加条件

编辑:我所说的“整合”是指这样的事情。创建集成后,就会输出一个 ID,然后我需要获取该 ID 并将其反馈给我最初创建的假设角色。每次我添加新的集成时都会发生这种情况。

alt*_*-f4 1

我首先尝试创建两个 IAM 角色,一个用于管理集成创建,另一个用于管理集成本身。运行时没有出现循环引用错误;但是,我无法建立从存储到数据库的连接,因为创建和管理集成需要相同的 IAM 角色。

这就是我最终所做的(在我看来,仍然不适合接受的方式)。我创建了一个角色(有目标),例如:

resource "aws_iam_role" "happy_role" {
  name               = "happy-role"
  assume_role_policy = data.aws_iam_policy_document.basic_policy.json
}
Run Code Online (Sandbox Code Playgroud)

并使用了基本的承担角色策略(无条件)。然后在下一次运行中,我申请了(没有目标)并且它起作用了。