Как перейти от политики, созданной на основе консоли AWS, к рабочей политике на основе сценария terraform?
У меня есть сценарий terraform, который предоставляет лямбда-функцию на aws для отправки электронных писем. Я взял этот сценарий terraform из руководств и шаблонов в Интернете, чтобы использовать сервисы AWS SES, Api Gateway, Lambda и Cloudwatch.
Однако, чтобы получить разрешения для работы, мне пришлось запустить сценарий, а затем отдельно создать политику в консоли AWS и применить ее к лямбда-функции, чтобы она могла получить полный доступ к сервисам SES и Cloudwatch. Но мне совсем не ясно, как взять эту рабочую политику и адаптировать ее к моему сценарию терраформирования. Может ли кто-нибудь дать или указать на руководство по этому вопросу?
Ограниченная / неадекватная, но в остальном рабочая роль в моем скрипте 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 (путем выбора группы ролей и т. д., как в), как преобразовать ее в "роль", как требуется для сценария terraform?
1 ответ
Для всех, кто может с трудом разобраться в вопросах terraform-aws-policy, вот мое понимание после некоторой борьбы. Задача здесь состоит в том, чтобы тщательно различать различные похожие по звуку терраформные структуры (aws_iam_role, aws_iam_role_policy, aws_iam_role, accept_role_policy и т. Д.) И выяснять, как эти структуры черного ящика подходят друг другу.
Во-первых, смысл aws role
собирать вместе policies
(т.е. разрешения делать что-то). Назначая такую роль службе (например, лямбда), вы тем самым предоставляете этой службе разрешения, описанные в этих политиках. Роль должна иметь, по крайней мере, одну встроенную политику: политику "принять-роль", которая определяет, какие службы могут использовать ("предполагать") эту роль. Эта политика предполагаемых ролей относительно проста, и поэтому она может быть явно включена в скрипт терраформирования (используя<<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]
}
Как видите, сюда включены шаблоны политик с использованием arns, которые можно найти в консоли AWS. Например, вот представление для поиска arn для полного доступа к Amazon SES через Консоль управления AWS:
Когда вы успешно развернете лямбда-выражение в AWS с помощью terraform, он извлечет эти политики из arns и сгенерирует json-разрешение для вашей лямбда-функции (которое вы можете просмотреть в разделе lambda-service консоли aws), который очень похож на json, который я разместил в вопросе.