1

我有一个 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 脚本所需的“角色”?

4

1 回答 1

1

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

首先,aws 的重点role是收集在一起policies(即做事的权限)。通过将这样的角色分配给服务(例如 lambda),您可以授予该服务由这些策略描述的权限。角色必须至少具有一种内置策略:“假设角色”策略,指定哪些服务可以使用(“假设”)该角色。这种假设角色策略相对简单,因此“最好”明确地包含在 terraform 脚本中(使用<<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。

于 2020-01-20T20:41:41.660 回答