【问题标题】:How to go from a AWS-console-derived policy to a working terraform-scripted policy?如何从 AWS 控制台派生策略转变为有效的 terraform 脚本策略?
【发布时间】:2020-01-21 04:41:41
【问题描述】:

我有一个 terraform 脚本,它在 aws 上提供了一个 lambda 函数来发送电子邮件。我从网络上的教程和模板中拼凑出这个 terraform 脚本,以使用 AWS SES、Api Gateway、Lambda 和 Cloudwatch 服务。

为了获得工作权限,我必须运行脚本,然后在 AWS 控制台中单独构建一个策略并将其应用于 lambda 函数,以便它可以完全访问 SES 和 Cloudwatch 服务。但是我完全不清楚如何采用该工作策略并将其适应我的 terraform 脚本。任何人都可以就此事提供或指出指导吗?

我的 terraform 脚本中的有限/不充分但可以正常工作的角色如下所示:

resource "aws_iam_role" "iam_for_lambda" {
    name = "${var.role_name}"
    assume_role_policy = <<EOF 
    { 
        "Version": "2012-10-17", 
        "Statement": [ 
            { 
                "Action": "sts:AssumeRole", 
                "Principal": { 
                    "Service": [ 
                        "lambda.amazonaws.com" 
                    ] 
                }, 
                "Effect": "Allow", 
                "Sid": "" 
            } 
        ] 
    } EOF 
}

...以及在控制台中生成的工作策略(通过将两个角色组合在一起以实现所有 Cloudwatch 和所有 SES 访问):

{
  "permissionsBoundary": {},
  "roleName": "las_role_new",
  "policies": [
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": [
              "autoscaling:Describe*",
              "cloudwatch:*",
              "logs:*",
              "sns:*",
              "iam:GetPolicy",
              "iam:GetPolicyVersion",
              "iam:GetRole"
            ],
            "Effect": "Allow",
            "Resource": "*"
          },
          {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:aws:iam::*:role/aws-service-role/events.amazonaws.com/AWSServiceRoleForCloudWatchEvents*",
            "Condition": {
              "StringLike": {
                "iam:AWSServiceName": "events.amazonaws.com"
              }
            }
          }
        ]
      },
      "name": "CloudWatchFullAccess",
      "id": "ANPAIKEABORKUXN6DEAZU",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/CloudWatchFullAccess"
    },
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "ses:*"
            ],
            "Resource": "*"
          }
        ]
      },
      "name": "AmazonSESFullAccess",
      "id": "ANPAJ2P4NXCHAT7NDPNR4",
      "type": "managed",
      "arn": "arn:aws:iam::aws:policy/AmazonSESFullAccess"
    }
  ],
  "trustedEntities": [
    "lambda.amazonaws.com"
  ]
}

有字段 所以我的问题总结起来,最笼统地说,是这样的:

给定 aws 控制台中内置的“策略”(通过选择一堆角色等,如 中),您如何将其转换为 terraform 脚本所需的“角色”?

【问题讨论】:

  • 您是否将aws_iam_role_policypolicyaws_iam_roleassume_role_policy 混淆了?您已列出 IAM 策略,但您的资源采用代入角色策略。承担角色政策规定了或什么可以承担该角色。该策略设置允许角色执行的操作。我在stackoverflow.com/a/44643708/684908 找到了答案,其中有一些解释。
  • 谢谢——是的,我对这种情况感到非常困惑。我认为现在情​​况稍微清楚了。

标签: terraform aws-policies


【解决方案1】:

对于其他可能难以理解 terraform-aws-policy 问题的人,这是我经过一番努力后的理解。这里的游戏是仔细区分各种听起来相似的 terraform 结构(aws_iam_role、aws_iam_role_policy、aws_iam_role、assume_role_policy 等),并弄清楚这些黑盒结构如何组合在一起。

首先,aws role 的意义在于将 policies 收集在一起(即做事的权限)。通过将这样的角色分配给服务(例如 lambda),您可以授予该服务由这些策略描述的权限。角色必须至少具有一种内置策略:“假设角色”策略,指定哪些服务可以使用(“假设”)该角色。这种假设角色策略相对简单,因此“最好”明确地包含在 terraform 脚本中(使用上面的 &lt;&lt;EOF ... EOF 语法)。

其次,如果您现在想让具有(基本)角色的服务对其他服务执行任何操作,那么您需要以某种方式将其他策略与该角色相关联。我了解到有几种方法可以做到这一点,但为了最简洁地回答我的问题,我现在将描述我发现的将 AWS 控制台中提供的多个模板策略合并到一个 terraform 脚本中的最优雅的方法。

代码是:

# Define variable for name of lambda function
variable "role_name" {
  description = "Name for the Lambda role."
  default     = "las-role"
}

# Create role with basic policy enabling lambda service to use it
resource "aws_iam_role" "iam_for_lambda" {
  name = "${var.role_name}"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": [ "lambda.amazonaws.com" ]
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}


# Define a list of policy arn's given in the AWS console
variable "iam_policy_arn_list" {
  type        = list(string)
  description = "IAM Policies to be attached to role"
  default     = ["arn:aws:iam::aws:policy/CloudWatchFullAccess", "arn:aws:iam::aws:policy/AmazonSESFullAccess"]
}

# Create attachment of the policies for the above arn's to our named role
# The count syntax has the effect of looping over the items in the list
resource "aws_iam_role_policy_attachment" "role-policy-attachment" {
  role       = var.role_name
  count      = length(var.iam_policy_arn_list)
  policy_arn = var.iam_policy_arn_list[count.index]
  depends_on = [aws_iam_role.iam_for_lambda]
}

如您所见,此处使用可在 AWS 控制台中找到的 arns 包含模板策略。例如,以下是通过 AWS 管理控制台查找用于完全访问 Amazon SES 的 arn 的视图:

当您使用 terraform 成功将 lambda 部署到 AWS 时,它会从 arns 中提取这些策略并为您的 lambda 函数(您可以在 aws 控制台的 lambda-service 部分查看)生成一个权限 json,该函数看起来很像我在问题中发布的json。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2019-11-26
    • 2020-09-17
    • 2021-09-14
    • 1970-01-01
    • 2022-12-20
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多