tf/groups/

No Ćŗltimo mĆ³dulo que vimos, construimos a criaĆ§Ć£o de usuĆ”rios com restriƧƵes especĆ­ficas Ć  cada um deles. Mas caso esse usuĆ”rio participe de um time de desenvolvimento, ele terĆ” acesso a todos os recursos que o time tem acesso. Por isso Ć© necessĆ”rio criar grupos de usuĆ”rios e atribuir os usuĆ”rios a esses grupos.

āš ļø

Aqui de novo para lembrar do uso do atributo for_each para permitir a criaĆ§Ć£o de multiplos grupos de usuĆ”rios com um Ćŗnico bloco de cĆ³digo.

Esse mĆ³dulo Ć© muito parecido com o mĆ³dulo de criaĆ§Ć£o de usuĆ”rios, pelo fato da criaĆ§Ć£o de polĆ­ticas serem muito parecidas, a diferenƧa Ć© que aqui nĆ£o precisamos criar um usuĆ”rio, mas sim um grupo de usuĆ”rios e adicionar qualquer usuĆ”rio que precisar de acesso a esse grupo.

CriaĆ§Ć£o de restriƧƵes

Aqui a criaĆ§Ć£o das polĆ­ticas de restriĆ§Ć£o sao praticamente iguais as do mĆ³dulo de criaĆ§Ć£o de usuĆ”rios, a diferenƧa Ć© que por simplicidade decidi retirar os campos name e description de cada restriĆ§Ć£o.

data "aws_iam_policy_document" "ec2_policy" {
for_each = { for group in var.user_groups : group.name => group }
policy_id = each.value.name
statement {
effect = "Allow"
sid = "VisualEditor0"
actions = each.value.restrictions.actions
resources = each.value.restrictions.resources
}
}
resource "aws_iam_policy" "ec2_policy" {
for_each = { for group in var.user_groups : group.name => group }
policy = data.aws_iam_policy_document.ec2_policy[each.value.name].json
}

CriaĆ§Ć£o de grupos

Para essa aĆ§Ć£o teremos que usar um recurso de criaĆ§Ć£o de grupo e outro de anexaĆ§Ć£o de polĆ­ticas ao grupo.

resource "aws_iam_group" "group" {
for_each = { for group in var.user_groups : group.name => group }
name = each.value.name
}
resource "aws_iam_group_policy_attachment" "group_policy_attachment" {
for_each = { for group in var.user_groups : group.name => group }
group = aws_iam_group.group[each.value.name].name
policy_arn = aws_iam_policy.ec2_policy[each.value.name].arn
}

InclusĆ£o de usuĆ”rios aos grupos

Aqui Ć© bem simples, basta usar o recurso de anexaĆ§Ć£o de usuĆ”rios aos grupos com o nome do grupo e o nome do usuĆ”rio.

resource "aws_iam_group_membership" "group_membership" {
for_each = { for group in var.user_groups : group.name => group }
name = each.value.name
users = [for user in var.users : user.name if contains(user.groups_ids, each.value.id)]
group = aws_iam_group.group[each.value.name].name
}