Terraform AWS Newrelic 与 IAM 角色的集成

Terraform AWS Newrelic Integration with IAM Role

我的要求是将我们的 AWS 帐户与带有 Terraform 的 NewRelic 集成,我能够 link 使用控制台访问将 AWS 帐户与 NewRelic 集成,作为先决条件,我需要创建包含受信任的 IAM 角色具有 New-Relic 帐户的实体,按照下面列出的步骤

  1. 转到 infrastructure.newrelic.com > AWS。单击可用服务磁贴之一开始。

  2. 在 IAM 控制台中,点击创建角色,然后点击另一个 AWS 账户。

  3. 对于帐户 ID,请使用 7XXXXXXXXXX。 选中需要外部 ID 框。 对于外部 ID,输入您的 New Relic 帐户 ID。

  4. 不要启用需要 MFA(多重身份验证)的设置。 附加策略:搜索 ReadOnlyAccess,select 名为 ReadOnlyAccess 的策略的复选框,然后单击下一步:查看。或者,您可以创建自己的托管策略并根据您要监控的 AWS 服务限制您授予 New Relic 的权限。 对于角色名称,输入 NewRelicInfrastructure-Integrations,然后单击创建角色。

我的要求是对 Terraform Script 做同样的事情,我探索了 https://www.terraform.io/docs/providers/aws/r/iam_role.html,但无法找到一些可以与上面列出的步骤(如包含另一个 AWS 帐户)相同的相关选项。

Terraform 提供了一个可能有用的 aws_iam_policy_document 数据源。相信以下配置可以帮到你:

data "aws_iam_policy_document" "assume_role" {
  statement {
    actions = [
      "sts:AssumeRole"
    ]

    condition {
      test = "StringEquals"

      values = [
        "New Relic Account ID"
      ]

      variable = "sts:ExternalId"
    }

    effect = "Allow"

    principals {
      identifiers = [
        "7XXXXXXXXXX"
      ]

      type = "AWS"
    }
  }
}

resource "aws_iam_role" "new_relic" {
  assume_role_policy = data.aws_iam_policy_document.assume_role.json
  name               = "NewRelicInfrastructure-Integrations"
}

resource "aws_iam_role_policy_attachment" "read_only_access" {
  policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
  role       = aws_iam_role.new_relic.name
}

本质上,它创建了一个名为 NewRelicInfrastructure-Integrations 的角色,并带有两个关联的 IAM 策略。

第一个策略允许调用 sts:AssumeRole 操作并验证 ExternalId 是否与 New Relic 帐户 ID 匹配。

第二个策略授予 ReadOnlyAccess 给承担的角色。

一个使用模块的例子iam-assumable-role

module "newrelic" {
  source  = "terraform-aws-modules/iam/aws//modules/iam-assumable-role"

  trusted_role_arns = [
    "arn:aws:iam::XXXXXXXXXXXX:root"
  ]

  create_role = true

  role_name           = "newrelic"
  role_sts_externalid = XXXXXXX
  role_requires_mfa   = false

  custom_role_policy_arns = [
    "arn:aws:iam::aws:policy/ReadOnlyAccess"
  ]
}