Как сделать go из политики, основанной на AWS -консоле, в рабочую политику на основе сценария terraform? - PullRequest
0 голосов
/ 18 января 2020

У меня есть скрипт terraform, который обеспечивает лямбда-функцию на aws для отправки электронных писем. Я собрал этот скрипт terraform из учебников и шаблонов в Интернете, чтобы использовать AWS SES, Api Gateway, Lambda и Cloudwatch.

Чтобы получить разрешения на работу, мне пришлось запустить скрипт, а затем, отдельно создайте политику в консоли AWS и примените ее к лямбда-функции, чтобы она могла полностью получить доступ к службам 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 
}

... и рабочая политика сгенерированный в консоли (путем объединения двух ролей для доступа all-Cloudwatch и all-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 (путем выбора группы ролей и т. Д. c. As in), как преобразовать ее в «роль», как требуется для сценария terraform?

1 Ответ

0 голосов
/ 20 января 2020

Для всех, кто может столкнуться с проблемой понимания терраформ - aws - политических вопросов, вот мое понимание после некоторой борьбы. Игра здесь состоит в том, чтобы тщательно различать guish различные структуры терраформ с похожим звучанием (aws_iam_role, aws_iam_role_policy, aws_iam_role, accept_role_policy и др. c.) И выяснить, как эти структуры черного ящика сочетаются друг с другом.

Во-первых, смысл aws role состоит в том, чтобы собрать вместе policies (то есть права на что-то делать). Назначая такую ​​роль службе (например, лямбде), вы тем самым предоставляете этой службе разрешения, описанные в этих политиках. Роль должна иметь по крайней мере один встроенный в нее вид политики: политика «предположить роль», которая указывает, какие службы могут использовать («принимать») эту роль. Эта политика предполагаемой роли относительно проста, и поэтому «может также» быть явно включена в скрипт terraform (с использованием приведенного выше синтаксиса <<EOF ... EOF).

Во-вторых, если вы хотите разрешить эту службу с помощью (basi c) Роль сделайте что-нибудь с другими службами, тогда вам нужно как-то связать дополнительные политики с этой ролью. Я узнал, что есть несколько способов сделать это, но для того, чтобы ответить на мой вопрос наиболее кратко, я сейчас опишу самый элегантный способ, который я нашел, для включения нескольких шаблонных политик, предлагаемых в консоли AWS, в свою терраформу. script.

Код:

# 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]
}

Как видите, политики шаблонов включены сюда с использованием arns, который находится в консоли AWS. Например, вот представление для поиска арн для полного доступа к Amazon SES через AWS Консоль управления:

enter image description here

Когда вы успешно развернете лямбда в AWS с использованием terraform, он извлечет эти политики из arns и сгенерирует разрешение json для вашей лямбда-функции (которую вы можете просмотреть в разделе lambda-service консоли aws), которая выглядит много как json я разместил в вопросе.

...